Go微服務框架go-kratos實戰01:quickstart 快速開始

九卷 發表於 2022-05-29
框架 微服務 Go

先來感受下用 kratos 快速建立專案

一、環境準備

1.1 安裝依賴軟體

建議開啟 GO111MODULE

1.2 安裝 kratos cli

go install github.com/go-kratos/kratos/cmd/kratos/[email protected]

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

整個專案架構流程圖,官方的一個架構圖:

image-20220528195535136

上面雖然對程式碼結構做了文字說明,但是在 internal 裡,有 DDD 這個概念,相信很多人看了後,不是很明白。

先來看看 DDD 的分層架構,架構圖如下:

image-20220529175626340

再來對比看看 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

四、參考