國產開源的 Go 微服務框架 Kratos
學習 Go 語言的朋友看過來!這裏有一個非常厲害的 Go 微服務框架推薦給你!
這個框架的名字叫做 Kratos,目前已經在 Github 上收貨了 14k+ 的 star,一共有 110 + 人爲其做了貢獻。
這個項目的作者一定是一個遊戲愛好者。項目的名字就是起源於一款以希臘神話爲背景的遊戲—《戰神》,Kratos 是其中一位任人物的名字,他從凡人成爲了戰神!
項目目標
這個項目的目標是提供完整的微服務研發體驗,整合相關框架及工具後,微服務治理相關部分可對整體業務開發週期無感,從而更加聚焦於業務交付。對每位開發者而言,整套 Kratos 框架也是不錯的學習倉庫,可以瞭解和參考到微服務方面的技術積累和經驗。
設計原則
整個框架的設計原則如下:
-
簡單:不過度設計,代碼平實簡單;
-
通用:通用業務開發所需要的基礎庫的功能;
-
高效:提高業務迭代的效率;
-
穩定:基礎庫可測試性高,覆蓋率高,有線上實踐安全可靠;
-
健壯:通過良好的基礎庫設計,減少錯用;
-
高性能:性能高,但不特定爲了性能做 hack 優化,引入 unsafe ;
-
擴展性:良好的接口設計,來擴展實現,或者通過新增基礎庫目錄來擴展功能;
-
容錯性:爲失敗設計,大量引入對 SRE 的理解,魯棒性高;
-
工具鏈:包含大量工具鏈,比如 cache 代碼生成,lint 工具等等;
特性
-
APIs:協議通信以 HTTP/gRPC 爲基礎,通過 Protobuf 進行定義;
-
Errors:通過 Protobuf 的 Enum 作爲錯誤碼定義,以及工具生成判定接口;
-
Metadata:在協議通信 HTTP/gRPC 中,通過 Middleware 規範化服務元信息傳遞;
-
Config:支持多數據源方式,進行配置合併鋪平,通過 Atomic 方式支持動態配置;
-
Logger:標準日誌接口,可方便集成三方 log 庫,並可通過 fluentd 收集日誌;
-
Metrics:統一指標接口,可以實現各種指標系統,默認集成 Prometheus;
-
Tracing:遵循 OpenTelemetry 規範定義,以實現微服務鏈路追蹤;
-
Encoding:支持 Accept 和 Content-Type 進行自動選擇內容編碼;
-
Transport:通用的 HTTP/gRPC 傳輸層,實現統一的 Middleware 插件支持;
-
Registry:實現統一註冊中心接口,可插件化對接各種註冊中心;
-
Validation: 通過 Protobuf 統一定義校驗規則,並同時適用於 HTTP/gRPC 服務.
-
SwaggerAPI: 通過集成第三方 Swagger 插件能夠自動生成 Swagger API json 並啓動一個內置的 Swaager UI 服務.
架構
使用方法
環境要求
-
go
-
protoc
-
protoc-gen-go
下載安裝
go get 安裝:
go get github.com/go-kratos/kratos/cmd/kratos/v2@latest
kratos upgrade
源碼編譯安裝:
git clone https://github.com/go-kratos/kratos
cd kratos
make install
創建一個服務
使用 kratos new
新建項目時所使用結構,其中包括了開發過程中所需的配套工具鏈 (Makefile 等),便於開發者更高效地維護整個項目,本項目亦可作爲使用 Kratos 構建微服務的工程化最佳實踐的參考。
# 創建項目模板
kratos new helloworld
cd helloworld
# 拉取項目依賴
go mod download
# 生成proto模板
kratos proto add api/helloworld/helloworld.proto
# 生成proto源碼
kratos proto client api/helloworld/helloworld.proto
# 生成server模板
kratos proto server api/helloworld/helloworld.proto -t internal/service
# 生成所有proto源碼、wire等等
go generate ./...
# 運行程序
kratos run
生成的目錄結構如下:
.
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── api // 下面維護了微服務使用的proto文件以及根據它們所生成的go文件
│ └── helloworld
│ └── v1
│ ├── error_reason.pb.go
│ ├── error_reason.proto
│ ├── error_reason.swagger.json
│ ├── greeter.pb.go
│ ├── greeter.proto
│ ├── greeter.swagger.json
│ ├── greeter_grpc.pb.go
│ └── greeter_http.pb.go
├── cmd // 整個項目啓動的入口文件
│ └── server
│ ├── main.go
│ ├── wire.go // 我們使用wire來維護依賴注入
│ └── wire_gen.go
├── configs // 這裏通常維護一些本地調試用的樣例配置文件
│ └── config.yaml
├── generate.go
├── go.mod
├── go.sum
├── internal // 該服務所有不對外暴露的代碼,通常的業務邏輯都在這下面,使用internal避免錯誤引用
│ ├── biz // 業務邏輯的組裝層,類似 DDD 的 domain 層,data 類似 DDD 的 repo,repo 接口在這裏定義,使用依賴倒置的原則。
│ │ ├── README.md
│ │ ├── biz.go
│ │ └── greeter.go
│ ├── conf // 內部使用的config的結構定義,使用proto格式生成
│ │ ├── conf.pb.go
│ │ └── conf.proto
│ ├── data // 業務數據訪問,包含 cache、db 等封裝,實現了 biz 的 repo 接口。我們可能會把 data 與 dao 混淆在一起,data 偏重業務的含義,它所要做的是將領域對象重新拿出來,我們去掉了 DDD 的 infra層。
│ │ ├── README.md
│ │ ├── data.go
│ │ └── greeter.go
│ ├── server // http和grpc實例的創建和配置
│ │ ├── grpc.go
│ │ ├── http.go
│ │ └── server.go
│ └── service // 實現了 api 定義的服務層,類似 DDD 的 application 層,處理 DTO 到 biz 領域實體的轉換(DTO -> DO),同時協同各類 biz 交互,但是不應處理複雜邏輯
│ ├── README.md
│ ├── greeter.go
│ └── service.go
└── third_party // api 依賴的第三方proto
├── README.md
├── google
│ └── api
│ ├── annotations.proto
│ ├── http.proto
│ └── httpbody.proto
└── validate
├── README.md
└── validate.proto
編寫代碼
import "github.com/go-kratos/kratos/v2"
import "github.com/go-kratos/kratos/v2/transport/grpc"
import "github.com/go-kratos/kratos/v2/transport/http"
httpSrv := http.NewServer(http.Address(":8000"))
grpcSrv := grpc.NewServer(grpc.Address(":9000"))
app := kratos.New(
kratos.Name("kratos"),
kratos.Version("latest"),
kratos.Server(httpSrv, grpcSrv),
)
app.Run()
更多關於這個項目的使用介紹,推薦朋友們看看這個項目的官方文檔:https://go-kratos.dev/docs/getting-started/start 。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/w24TJ9uRWXkBAaFVLC_F1w