聊聊 Golang 微服務工具包 Go kit
一、介紹
Go kit 是 Go 包的集合,可幫助您構建健壯、可靠、可維護的微服務。它最初被設想為一個工具包,以幫助大型(所謂的現代企業)組織采用 Go 作為實現語言。但它很快就"向下增長",現在也為較小的初創公司和組織提供服務。
Go kit 服務分為三層:
- Transport layer 傳輸層
- Endpoint layer 端點層
- Service layer 服務層
請求在傳輸層進入服務,向下傳輸經過端點層到達服務層,響應采用相反的過程。
Transports
Go kit 附帶了對 HTTP、gRPC、Thrift 和 net/rpc 的支持。傳輸域綁定到具體的傳輸協議,比如 HTTP 或 gRPC。可以讓我們的單個微服務同時支持 HTTP API 和 RPC 服務。
Endpoints
Endpoints 類似在 Controller 中的 action 或 handler,用于接收 transports 的請求。
Services
Services 實現核心業務邏輯,它通常將多個 Endpoints 組合在一起。在 Go kit 中,Services 通常會定義接口,通過實現接口去實現業務邏輯。
Services 應該不知道 Endpoints,尤其 Transport-domain 的概念。Services 也應該不知道有關 HTTP headers 或 gRPC 錯誤碼的任何信息。
Middlewares
Go kit 嘗試通過使用中間件(裝飾器模式)來分離與業務邏輯無關的功能。中間件可以包裝 Endpoints 或 Services,來添加功能,例如日志記錄、限流、負載均衡或鏈路跟蹤。通常圍繞 Endpoints 或 Services 使用多個中間件。
二、Go kit 架構模型
在了解了 Transports、Endpoints、Services 和 Middlewares 的概念后,我們可以發現 Go kit 架構模型類似「洋蔥」,包含多層。這些層從內到外可以分組到我們的三個域中。在最內層的 Service 域中,所有內容都基于特定 service 定義,并且所有核心業務邏輯都在 service 中實現;中間層 Endpoint 域是將 Service 的每個方法抽象到通用的 Endpoint;在最外層的 Transport 域是 Endpoints 綁定到 HTTP 或 gRPC。
圖片來自 Go kit 官網
我們可以通過為 service 定義 interface,并提供具體實現來實現核心業務邏輯。然后,通過編寫 service 中間件添加額外功能,比如日志記錄、分析、檢測等。
Go kit 提供 Endpoint 域和 Transport 域中間件,用于限流、熔斷、負載均衡和鏈路跟蹤等功能。
三、微服務示例
在了解以上關于 Go kit 的知識之后,我們通過一個簡單的微服務示例,學習怎么使用 Go kit 開發項目。
項目包含服務端和客戶端,并采用 Consul 作為服務注冊與發現組件。
代碼目錄:
.
├── README.md
├── client
│ ├── endpoint
│ ├── main.go
│ └── transport
├── go.mod
├── go.sum
└── server
├── config
├── endpoint
├── main.go
├── service
└── transport
完整代碼,請參閱 Github。
四、總結
本文我們介紹 Golang 微服務工具包 Go kit 的基礎知識和架構設計,并提供了一個簡單的微服務示例代碼,讀者朋友們在了解 Go kit 之后,可以通過閱讀代碼,學習怎么使用 Go kit 開發項目。