用 Google 團隊推出的 Wire 工具解決 Dependency Injection

proposal

不知道大家在用 Go 語言寫服務的時候,會不會遇到 Components 會有相互依賴的關係,A 物件依賴 B 物件,B 物件又依賴 C 物件,所以在初始化 A 物件前,就必須先將 B 跟 C 初始化完成,這就是錯綜復雜的關係。也許大家會想到另一個做法,就是把每個物件都宣告成全域變數,我個人不推薦這個使用方式,雖然很方便,但是就會讓整體架構變得很複雜。而本篇要介紹一個救星工具,就是 Google 團隊開發的 Wire 工具,官方部落格也可以參考看看。此工具就是為了解決底下兩個問題 (dependency injection)。

  1. Components 互相依賴錯綜復雜的關係
  2. 不要宣告全域變數
[Read More]

三種好用的 gRPC 測試工具

grpc flow proposal

最近在用 Go 語言實作微服務,溝通的接口採用 gRPC,除了可以透過 gRPC 支援的第三方語言來寫客戶端的測試之外,有沒有一些好用的工具來驗證檢查 gRPC 實現的接口。剛好今年看到 Postman 宣布開始支援 gRPC,相信大家對於 Postman 工具並不會太陌生,畢竟測試 Websocket 或 RESTful API 都是靠這工具呢。本篇除了介紹 Postman 之外,還有一套 CLI 工具 grpcurl 及一套 GUI 工具 grpcui 也是不錯用,後面這兩套都是由同一家公司 FullStory 開源出來的專案,底下就來一一介紹。

[Read More]

監控服務 Gatus 系統架構

gatus proposal

今年第一場公開的演講 2022 台灣雲端大會,台灣五月開始疫情變嚴重,故延遲了一次到七月才舉辦,這次帶給大家的是『自動化監控網站運行服務 – Gatus』,內容可以拆為兩個部分,第一部分是介紹為什麼要使用 Gatus,用來解決開發團隊哪些問題,我也整理了三大點為什麼我選擇 Gatus,另一部分就是本篇的主軸,Gatus 系統架構跟流程。

  1. 監控條件 (客製化回應)
  2. 開源專案 (Go 語言)
  3. 簡易頁面 (Status Page)

對於使用 Gatus 有興趣的朋友可以參考我之前寫的文章:『自動化監控網站運行服務 - Gatus』,本篇就不介紹怎麼使用 Gatus 了。

[Read More]

在 Go 語言測試使用 Setup 及 Teardown

logo

相信大家在寫測試時,都會需要啟動而外服務,像是 RedisPostgres 等,而開始測試前會需要初始化資料庫連線,或者是準備測試資料,測試結束後就關閉資料庫連線,並且移除不必要的測試資料或檔案。在 Go 語言內開發者不用去依賴第三方的套件,透過內建的 TestMain 就可以非常輕鬆完成此事情。底下看看如何操作及使用。

[Read More]

優化重構 Worker Pool 程式碼

logo

最近看到 Go 語言一段程式碼,認為有很大的優化空間,也將過程跟想法分享給大家。也許每個人優化的方向不同,各位讀者可以把程式碼整個看完後,先停住,不要繼續往下看,想看看是否有優化的空間。此程式碼本身沒有任何問題,執行過程不會出現任何錯誤。

先說明底下範例在做什麼,相信大家都有聽過在 Go 語言內要實現 Worker Pools 機制相當簡單,看到 ExecuteAll 函式就是讓開發者可以自訂同時間開多少個 Goroutine 來平行執行工作,第二個參數可以自訂義工作內容是什麼。

[Read More]

在 Go 語言內使用 bytes.Buffer 注意事項

logo

Go 語言中,如何高效的處理字串相加,由於字串 (string) 是不可變的,所以將很多字串拼接起來,會如同宣告新的變數來儲存。這邊就可以透過 strings.Builderbytes.Buffer 來解決字串相加效能問題。除了效能問題之外,還需要注意在 bytes.Buffer 處理 []bytestring 之間的轉換,底下拿實際專案上寫出來的錯誤給大家參考看看

[Read More]

用 10 分鐘了解 Go 語言如何從 Channel 讀取資料

logo

Go 語言強大的 goroutine 特性,讓各位開發者愛不釋手,而多個 goroutine 如何溝通呢?就是透過 Channel 來做到。本篇教大家從 Channel 讀取資料的兩種方式及使用時機,並實際用一個案例快速了解 Channel 實作上會遇到哪些問題?底下用兩個範例讓大家了解如何讀取 Channel 資料出來。

[Read More]

用 Go 語言實現 Pub-Sub 模式

logo

相信大家都知道發布 / 訂閱模式,開發者可以透過第三方開源工具像是 Redis, NSQNats 等來實現訂閱機制,本篇則是會教大家如何用 Go 語言寫出一個單機版本的 Pub/Sub 模式,在單一系統內非常輕量級,且不需要靠第三方服務就可以輕易實現。底下會直接用單一訂閱 Topic 機制來撰寫 Publisher 及 Subscriber。

[Read More]

Go 語言實作 Graceful Shutdown 套件

background job 01

歡迎追蹤 appleboy/graceful 套件

Go 語言撰寫的服務如何優雅的重新啟動,避免工作執行到一半就被關閉,是一個很中要的議題。故實作了簡易 Graceful Shutdown 套件,讓服務都可以支援此功能,如果不知道什麼是 Graceful Shutdown 的朋友們,可以參考這篇『 [Go 教學] 什麼是 graceful shutdown?』,本篇跟大家介紹一個好用的套件『appleboy/graceful』,使用後。不用再擔心背景的服務沒完成就被關閉,不只是背景的工作需要處理,在關閉服務前,開發者也要確保部分工作要在關閉服務前才執行,像是關閉 Database 及 Redis 連線。

[Read More]

使用 AWS IAM Policy 設定 S3 Bucket 底下特定目錄權限

如何有效控制 AWS User 能看到哪些功能,以及執行哪些操作,最仰賴的就是 AWS Identity and Access Management (簡稱 IAM),IAM 可以讓管理者透過 UI 或自定義 JSON 格式來客製化使用者權限。剛好最近跟其他團隊合作到一個專案,需求就是開發者透過 Web 進行 AI Model 訓練,訓練前 SageMaker 會將使用者的 Dataset 下載到容器內,接著開始訓練,而團隊將此下載 Dataset 動作記錄到 AWS S3 Bucket 的 syslog 目錄內,確保檔案存取紀錄。最後將目錄底下的檔案,開權限給客戶進行查看,避免管理者或其他 User 不小心存取到別人的 Dataset 資料。

log

一般來說在 Bucket 內會有許多 Sub-Folder,而 AWS 透過 IAM 方式設定 User 只能存取特定的目錄。可以參考 AWS 官方這篇文章『Writing IAM Policies: Grant Access to User-Specific Folders in an Amazon S3 Bucket』。

[Read More]