先來感受下用 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 https://github.com/go-kratos/kratos-layout.git, please wait a moment.
From https://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: https://go-kratos.dev/docs/getting-started/start
如果拉取 github 上的專案模板失敗,可以使用 -r
引數指定拉取專案模板地址.
比如拉取 gitee 上的模板:
kratos new quickstart -r https://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:https://github.com/rs/curlie 測試:
$ curlie http://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
四、參考
- https://go-kratos.dev/docs/getting-started/start kratos 專案初始化
- https://go-kratos.dev/docs/intro/layout kratos 專案結構