用 10 分鐘了解 Go 語言 context package 使用場景及介紹

golang logo

context 是在 Go 語言 1.7 版才正式被納入官方標準庫內,為什麼今天要介紹 context 使用方式呢?原因很簡單,在初學 Go 時,寫 API 時,常常不時就會看到在 http handler 的第一個參數就會是 ctx context.Context,而這個 context 在這邊使用的目的及含義到底是什麼呢,本篇就是帶大家了解什麼是 context,以及使用的場景及方式,內容不會提到 context 的原始碼,而是用幾個實際例子來了解。

[Read More]

使用 Docker BuildKit 加速編譯 Image

docker buildkit

程式碼範例請看這邊

之前就有看到 Docker 推出 BuildKit 功能,這次跟大家介紹什麼是 BuildKit。現在部署編譯流程肯定都會用到 Docker,不管測試及部署都盡量在 Docker 內實現,來做到環境隔離,但是要怎麼縮短 Docker 在編譯 Image 時間,這又是另外的議題,本篇跟大家介紹一個實驗性的功能就是 BuildKit,原始碼可以參考這邊,希望未來這實驗性的功能可以正式納入 Docker 官方,網路上其實可以找到很多方式來做 Docker Layer 的 Cache,我個人最常用的就是 --cache-from 機制,可以適用在任何 CI/CD 流程,詳細說明可以參考這篇『在 docker-in-docker 環境中使用 cache-from 提升編譯速度』,下面使用到的程式碼都可以直接參考此 Repository,我還是使用 Go 語言當作參考範例。

[Read More]

[Go 語言] 從 graphql-go 轉換到 gqlgen

golang logo

相信各位開發者對於 GraphQL 帶來的好處已經非常清楚,如果對 GraphQL 很陌生的朋友們,可以直接參考之前作者寫的一篇『Go 語言實戰 GraphQL』,內容會講到用 Go 語言實戰 GraphQL 架構,教開發者如何撰寫 GraphQL 測試及一些開發小技巧,不過內容都是以 graphql-go 框架為主。而本篇主題會講為什麼我從 graphql-go 框架轉換到 gqlgen

[Read More]

停止 Go 服務前先處理完 Worker 內的 Job

golang logo

在閱讀本文章之前,作者有寫過一篇『graceful shutdown with multiple workers』介紹了在服務停止前做一些正確的 Shutdown 流程,像是處理 Http Handler 或關閉資料庫連線等等,假設有服務內有實作 Worker 處裡多個 Job,那該如何等到全部的 Job 都執行完畢才正確關閉且刪除服務 (使用 Docker) 呢?底下是整個運作流程:

[Read More]

Go Modules 處理 Private GIT Repository 流程

golang

Golang1.14 正式說明可以將 Go Modules 用在正式環境上了,還沒換上 Go Modules 的團隊,現在可以開始轉換了,轉換方式也相當容易啦,只要在原本的專案底下執行底下指令,就可以無痛轉移

1
2
go mod init project_path
go mod tidy

假設專案內有用到私有 Git Repository 該怎麼解決了?現在 go mod 會預設走 proxy.golang.org 去抓取最新的資料,但是要抓私有的,就需要透過其他方式:

1
go env -w GOPRIVATE=github.com/appleboy

上面代表告訴 go 指令,只要遇到 github.com/appleboy 就直接讀取,不需要走 Proxy 流程。拿 GitHub 當作範例,在本機端開發該如何使用?首先要先去申請 Personal Access Token,接著設定 Git

1
git config --global url."https://$USERNAME:$ACCESS_TOKEN@github.com".insteadOf "https://github.com"

其中 Username 就是 GitHub 帳號,Access token 就是上面的 Personal Access Token。如果在本機端執行,本身有 SSH Key 的話,就不需要這個 Access Token,直接用 SSH Key 就可以了。

1
git config --global url.ssh://git@your.private.git/.insteadOf https://your.private.git/
[Read More]

[Go 教學] graceful shutdown 搭配 docker-compose 實現 rolling update

線上課程:『Go 語言實戰』目前特價 $2100 TWD,優惠代碼『202003』,也可以直接匯款(價格再減 100),如果想搭配另外兩門課程合購可以透過 FB 聯絡我

golang logo

上一篇作者有提到『什麼是 graceful shutdown?』,本篇透過 docker-compose 方式來驗證 Go 語言的 graceful shutdown 是否可以正常運作。除了驗證之外,單機版 Docker 本身就可以設定 scale 容器數量,那這時候又該如何搭配 graceful shutdown 來實現 rolling update 呢?相信大家對於 rolling update 並不陌生,現在的 kubernetes 已經有實現這個功能,用簡單的指令就可以達到此需求,但是對於沒有在用 k8s 架構的開發者,可能網站也不大,那該如何透過單機本的 docker 來實現呢?底下先來看看為什麼會出現這樣的需求。

[Read More]

[Go 教學] 什麼是 graceful shutdown?

golang logo

我們該如何升級 Web 服務,你會說很簡單啊,只要關閉服務,上程式碼,再開啟服務即可,可是很多時候開發者可能沒有想到現在服務上面是否有正在處理的資料,像是購物車交易?也或者是說背景有正在處理重要的事情,如果強制關閉服務,就會造成下次啟動時會有一些資料上的差異,那該如何優雅地關閉服務,這就是本篇的重點了。底下先透過簡單的 gin http 服務範例介紹簡單的 web 服務

[Read More]

[Go 教學] graceful shutdown with multiple workers

golang logo

在閱讀本文章之前請先預習『用 Go 語言 buffered channel 實作 Job Queue』,本篇會針對投影片 p.26 到 p.56 做詳細的介紹,教大家如何從無到有寫一個簡單的 multiple worker,以及如何處理 graceful shutdown with workers,為什麼要處理 graceful shutdown? 原因是中途手動執行 ctrl + c 或者是部署新版程式都會遇到該如何確保 job 執行完成後才結束 main 函式。

[Read More]

使用 Go Channel 及 Goroutine 時機

golang logo

相信不少開發者肯定聽過 Go 語言之所以讓人非常喜歡,就是因為 Go concurrency,如果您對於 concurrency 不了解的朋友們,可以直接參考官網的範例開始了解,範例會帶您一步一步了解什麼是 Channel 什麼是 Go concurrency?本篇會介紹 Channel 使用時機,在大部分寫 application 時,老實說很少用到 Channel,所以很多人其實不知道該在哪種場景需要使用 Channel,底下這句名言大家肯定聽過:

Do not communicate by sharing memory; instead, share memory by communicating.

本篇會用簡單的例子來帶大家理解上述名言。

[Read More]

用 GitHub Actions 部署 Go 語言服務

GitHub Actions 也推出一陣子了,相信有不少雷,也是有很多優勢,未來在 GitHub 上面串接任何開源專案,都可以免費使用,過幾年可以看看 GitHub Actions 對 Travis 的影響是多少?本篇要來介紹如何透過 GitHub Actions 來部署 Go 語言服務,會用一個簡單 httpd 範例教大家如何透過 Docker 方式來更新。使用 Go 語言基本服務流程大致上會是『測試 -> 編譯 -> 上傳 -> 啟動』,透過這四個步驟來學習 GitHub Actions 該如何設定。

  • 測試: Unit Testing 多一層保護
  • 編譯: 透過 go build 編譯出 Binary 檔案
  • 上傳: 寫 Dockerfile 將 Binary 包進容器內
  • 啟動: 透過 docker-compose 方式來更新服務
[Read More]