Go微服務框架go-kratos實戰01:quickstart 快速開始
- 2022 年 5 月 29 日
- 筆記
- [01]Golang, [04]架構-分散式-微服務, Go, go-kratos, 微服務, 架構
先來感受下用 kratos 快速創建項目
一、環境準備
1.1 安裝依賴軟體
建議開啟 GO111MODULE
1.2 安裝 kratos cli
go install github.com/go-kratos/kratos/cmd/kratos/v2@latest
CLI 工具使用說明:CLI工具使用
go-kratos 和 Go 版本:
go 1.17
go-kratos v2.2.1
二、創建和運行項目
2.1 通過 kratos new
命令創建項目模板
使用 kratos new
命令創建 quickstart 項目:
kratos new quickstart
使用該命令創建項目:
$ kratos new quickstart
🚀 Creating service quickstart, layout repo is //github.com/go-kratos/kratos-layout.git, please wait a moment.
From //github.com/go-kratos/kratos-layout
cf30efc..cc5192f main -> origin/main
* [new tag] v2.2.1 -> v2.2.1
* [new tag] v2.1.3 -> v2.1.3
* [new tag] v2.1.4 -> v2.1.4
* [new tag] v2.1.5 -> v2.1.5
* [new tag] v2.2.0 -> v2.2.0
Updating cf30efc..cc5192f
Fast-forward
.github/workflows/gitee-sync.yml | 27 +
Makefile | 35 +-
README.md | 2 +-
api/helloworld/v1/error_reason.pb.go | 100 ++--
api/helloworld/v1/error_reason.proto | 11 +-
api/helloworld/v1/error_reason_errors.pb.go | 30 -
api/helloworld/v1/greeter.pb.go | 114 ++--
... ...
🍺 Project creation succeeded quickstart
💻 Use the following command to start the project 👇:
$ cd quickstart
$ go generate ./...
$ go build -o ./bin/ ./...
$ ./bin/quickstart -conf ./configs
🤝 Thanks for using Kratos
📚 Tutorial: //go-kratos.dev/docs/getting-started/start
如果拉取 github 上的項目模板失敗,可以使用 -r
參數指定拉取項目模板地址.
比如拉取 gitee 上的模板:
kratos new quickstart -r //gitee.com/go-kratos/kratos-layout.git
更多命令的使用:kratos 命令使用
2.2 使用 go generate 命令生成相應程式碼
生成 proto 源碼、wire 等等:
$ go generate ./...
go: downloading github.com/go-kratos/kratos/v2 v2.2.1
go: downloading google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf
go: downloading github.com/go-logr/logr v1.2.1
go: downloading github.com/go-logr/stdr v1.2.0
... ...
2.3 運行項目
使用 kratos run
命令運行項目
$ kratos run
INFO msg=config loaded: config.yaml format: yaml
INFO msg=[gRPC] server listening on: [::]:9000
INFO msg=[HTTP] server listening on: [::]:8000
2.4 測試介面
我使用的 go 寫的 curlie://github.com/rs/curlie 測試:
$ curlie //localhost:8000/helloworld/kratos
HTTP/1.1 200 OK
{
"message": "Hello kratos"
}
三、kratos 項目布局
基於 kratos-layout 創建的項目,使用的 kratos new 命令:
kratos new
生成的目錄結構圖如下:
.
├── 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
整個項目架構流程圖,官方的一個架構圖:
上面雖然對程式碼結構做了文字說明,但是在 internal 里,有 DDD 這個概念,相信很多人看了後,不是很明白。
先來看看 DDD 的分層架構,架構圖如下:
再來對比看看 internal 目錄里的 biz、data、service、server、conf 這 5 個目錄。
- biz:文檔里說了類似 DDD 的 domain 層,也就是 DDD 架構中的領域層。這裡還定義了對業務操作的介面。業務邏輯組裝。
- data:對資料庫 db,快取 cache 的封裝,並且實現 biz 中定義的介面。它將領域對象重新拿出來,這裡去掉了 DDD 的基礎層。
- service:實現 api 定義的服務層,類似 DDD 的應用層。處理數據傳輸對象到 biz(領域實體)的轉換。同時協同各類 biz 交互,不應處理複雜邏輯。
- server:http 和 grpc 實例的創建和配置,以及註冊對應的 service。
service -> biz -> data
四、參考
- //go-kratos.dev/docs/getting-started/start kratos 項目初始化
- //go-kratos.dev/docs/intro/layout kratos 項目結構