國產開源的 Go 微服務框架 Kratos

學習 Go 語言的朋友看過來!這裏有一個非常厲害的 Go 微服務框架推薦給你!

這個框架的名字叫做 Kratos,目前已經在 Github 上收貨了 14k+ 的 star,一共有 110 + 人爲其做了貢獻。

這個項目的作者一定是一個遊戲愛好者。項目的名字就是起源於一款以希臘神話爲背景的遊戲—《戰神》,Kratos 是其中一位任人物的名字,他從凡人成爲了戰神!

項目目標

這個項目的目標是提供完整的微服務研發體驗,整合相關框架及工具後,微服務治理相關部分可對整體業務開發週期無感,從而更加聚焦於業務交付。對每位開發者而言,整套 Kratos 框架也是不錯的學習倉庫,可以瞭解和參考到微服務方面的技術積累和經驗。

設計原則

整個框架的設計原則如下:

特性

架構

使用方法

環境要求

下載安裝

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