Go-chassis 微服務開發框架系列(一)
什麼是 Go chassis
go chassis 是一個 go 語言微服務開發框架,專注於雲原生應用的開發,我們主要的使用場景是雲服務開發。我們將自己在雲服務開發過程中沉澱的能力融入到了開發框架中,以幫助開發團隊快速編寫雲原生應用。
文章目標
本文介紹我們的設計理念和目標,為何 go chassis 會誕生。後面的系列文章會著重介紹使用方法,專案實戰。對於微服務架構模式,雲原生要素,為什麼選擇 go 語言等將不再贅述。
誕生背景
公司開發雲服務,要構建健壯,韌性,安全,高可靠的雲服務,必然有大量基礎能力需要編寫,為了加速開發,我們將這些能力便沉澱在了該框架中。
如何快速開發一個微服務
可以跟隨這個文件體驗。 https://github.com/go-chassis/go-chassis/edit/master/docs/getstarted/install.md
統一治理和協議模型
我們使用 Invocation 概念來統一協議描述,當協議請求到來後,go chassis 會把 request 轉換為 Invocation 進行治理(如負載均衡,限流,熔斷,重試,金絲雀釋出等),這樣就可以允許任意的協議接入到 go chassis,並無縫使用 go chassis 提供的核心功能,當前預設提供原生 grpc 和 http 兩種協議的接入。
為什麼會有這樣的設計呢?
- 每個協議層的優化空間非常大,使用者態到核心態的呼叫速度本來就相對內部程式碼來說是很慢的,優化這一層程式碼很重要,RPC 怎麼也比 http 來得好。
- 不同部門可能有私有協議訴求,那麼服務治理就交給核心框架完成。協議由業務部門決定自主研發或是整合現有協議。當你發現公司內部不同部門都在開發自己的協議做自己的服務治理時,再向將業務統一一個架構,一個工具鏈上,將非常困難。
可擴充套件的處理鏈條:handler chain as middleware
我們以 Java 為例,大家在寫一個攔截器或者過濾器的時候可以對請求進行處理,處理完,這個攔截器的的執行過程就結束了,那麼如何達成以下目標?
1.跟蹤業務執行結果指標,比如 http 狀態碼,並匯出他們讓 prometheus 收集。
2.跟蹤關鍵的業務執行結果,審計這些資訊。比如請求返回的一些結果資訊
3.分散式呼叫鏈追蹤,end span 必須等到請求返回才能拿到。
- 客戶端呼叫遠端服務時,也需要進行中間處理,比如客戶端負載均衡,請求重試,這些不能夠耦合在業務程式碼中
Java 的答案很簡單,註解。那麼 go 呢? 我們引入了 handler chain 程式設計模型,chain 中每個 handler 都可以拿到後面的 handler 的執行結果,包括業務程式碼的執行結果。 看下介面定義
type Handler interface {
Handle(*Chain, *invocation.Invocation, invocation.ResponseCallBack)
Name() string
}
// ResponseCallBack process invocation response
type ResponseCallBack func(*Response)
ResponseCallBack 用於接受後置 handler 返回的結果,所以每一個 handler 處理時都可以按需定義自己的 ResponseCallBack 來獲取後面 handler 甚至是業務邏輯程式碼的執行結果。幫助通用邏輯(即中介軟體)和業務邏輯徹底解耦。可以看下現在已經支援的中介軟體,無論限流,熔斷,負載均衡,認證鑑權,審計,我們都用此機制實現: https://go-chassis.readthedocs.io/en/latest/middleware.html 將公司全部的工具鏈,服務治理手段,安全合規等都落入到處理鏈中,可快速加快研發速度,並統一規範,減少管理負擔。
不只是 API,通過配置簡化開發過程
只舉 2 個例子
監控
減少讓開發者自己呼叫 API 的過程,將他們簡化為配置項 例如可觀察: 引入一行程式碼
import _ github.com/go-chassis/go-chassis/v2/middleware/monitoring
加上配置
handler:
chain:
Provider:
default: monitoring
就可以在服務端進行監控,匯出請求數,延遲等指標,大大加速開發人員效率
# HELP request_count
# TYPE request_count counter
request_count{app="default",env="",instance="",service="servicecomb-kie",version="0.1.0"} 14
# HELP request_process_duration
# TYPE request_process_duration summary
request_process_duration{app="default",env="",instance="",service="servicecomb-kie",version="0.1.0",quantile="0.5"} 3
request_process_duration{app="default",env="",instance="",service="servicecomb-kie",version="0.1.0",quantile="0.9"} 80
request_process_duration{app="default",env="",instance="",service="servicecomb-kie",version="0.1.0",quantile="0.99"} 80
request_process_duration_sum{app="default",env="",instance="",service="servicecomb-kie",version="0.1.0"} 315
request_process_duration_count{app="default",env="",instance="",service="servicecomb-kie",version="0.1.0"} 14
需要自定義指標:
err := metrics.CreateCounter(metrics.CounterOpts{
Name: “user_login”,
Labels: labelsSlice,
})
metrics.CounterAdd(“user_login”, 1, labelMap)
可信軟體
公司對軟體質量的高要求,需要我們編寫大量的基礎程式碼。我們也將通用的部分都落地到了框架中,通過簡單的配置檔案啟用,不再需要不同團隊重複編寫程式碼
servicecomb:
transport:
failure:
rest: http_500,http_502 #統計錯誤率時,例如只把500和502作為錯誤
maxIdleCon:
rest: 1024
maxBodyBytes:
rest: 20 #只需要指定我的服務能接受的body體大小,訪問的超時時間即可不再需要各個團隊維護程式碼。
maxHeaderBytes:
rest: 1 #限制http header大小
timeout: #限制客戶端超時
rest: 30s
外掛化
為了應對不同業務訴求,我們總是要考慮 “可替換性”。而這個的優先順序總是大於 “可複用性”。這就是 go chassis 的外掛理念。基本所有的重要元件都是外掛化的,框架已經定義好標準介面,只需要開發者實現好,註冊到框架中,就可以在配置檔案中配置並生效了,業務開發者是完全不感知的。可以參考我們對 quota 元件的擴充套件過程,他負責資源的配額管理 https://go-chassis.readthedocs.io/en/latest/dev-guides/backends.html
後續
我將詳細剖析 go chassis 的內部設計和特性使用。 在下一篇文章中,我將講述 go chassis 如何快速開發出一個微服務
關於專案地址:
https://github.com/go-chassis/go-chassis
目前的使用者:
- 趣頭條
- 邊緣計算:http://kubeedge.io/
- ServiceComb: https://github.com/apache/servicecomb-service-center 等多個 go 語言開發專案
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- Go chassis 微服務開發框架實戰系列(二)Go微服務框架
- Spring Cloud 微服務開發系列整理SpringCloud微服務
- 微服務PaaS框架,RestCloud企業級開發框架微服務框架RESTCloud
- 微服務前端開發框架React-Admin微服務前端框架React
- 用於微服務開發的 Java 框架微服務Java框架
- net core 微服務 快速開發框架 Viper 限流微服務框架
- 微服務開發系列:如何列印好日誌微服務
- Go微服務架構系列--gin框架(上)Go微服務架構框架
- 微服務系列 2:微服務化框架的模型和治理能力設計微服務框架模型
- 隨行付微服務前端開發框架React Admin微服務前端框架React
- Solon 1.8.0 釋出,雲原生微服務開發框架微服務框架
- YoyoGo微服務框架入門系列-基本概念Go微服務框架
- go-zero 微服務實戰系列(一、開篇)Go微服務
- 5款Java微服務開源框架Java微服務框架
- SpringCloud微服務實戰——搭建企業級開發框架(九):使用Nacos發現、配置和管理微服務SpringGCCloud微服務框架
- Go語言微服務開發框架實踐-go chassis(上篇)Go微服務框架
- Go語言微服務開發框架實踐-go chassis(中篇)Go微服務框架
- ABP微服務系列學習-搭建自己的微服務結構(一)微服務
- YoyoGo微服務框架入門系列-快速編寫WEB APIGo微服務框架WebAPI
- 微服務系列教程微服務
- SpringCloud微服務實戰——搭建企業級開發框架(十一):整合OpenFeign用於微服務間呼叫SpringGCCloud微服務框架
- 微服務框架-dubbo整合nacos框架微服務框架
- Go微服務開發指南Go微服務
- go微服務系列(一) go micro入門Go微服務
- 淺析微服務框架微服務框架
- go微服務系列(二) - 服務註冊/服務發現Go微服務
- 微服務開發攻略之淺析微服務架構微服務架構
- go-zero:開箱即用的微服務框架Go微服務框架
- 微服務Consul系列之服務註冊與發現微服務
- 20 個有用的 Go 語言微服務開發框架吐血總結!!!Go微服務框架
- 打不死的小強 .net core 微服務 快速開發框架 Viper 限流微服務框架
- 基於知名微服務框架go-micro開發gRPC應用程式微服務框架GoRPC
- SpringCloud微服務實戰——搭建企業級開發框架(十九):Gateway使用knife4j聚合微服務文件SpringGCCloud微服務框架Gateway
- 安卓開發框架系列開篇安卓框架
- 一個可以自我進化的微服務框架微服務框架
- Kite: 一個分散式微服務框架(翻譯)分散式微服務框架
- 推薦一款 Python 微服務框架 - NamekoPython微服務框架
- 從 1.5 開始搭建一個微服務框架——日誌追蹤 traceId微服務框架