一款不錯的 Go Server/API boilerplate,使用 K8S+DDD+CQRS+ES+gRPC 最佳實踐構建

為少發表於2021-07-15

Golang API Starter Kit

該專案的主要目的是使用最佳實踐、DDDCQRSESgRPC 提供樣板專案設定。
為開發和生產環境提供 kubernetes 配置。允許與反映生產的 environment 一起工作,從而減少任何錯誤配置。

這是許多服務(如身份驗證或使用者域)的單一儲存庫(mono-repository)。
除了共享包外,每個服務都有自己的程式碼庫,以簡化這個樣板檔案。
服務之間通過 gRPC 進行通訊。每個服務都可能為外部通訊或/和 gRPC 公開 HTTP API

這個專案設定應該減少整個 kubernetes 叢集和/或每個微服務的環境配置時間。
將每個服務提取到自己的儲存庫或將其保留為 mono-repo 應該是一個偏好問題。

Web UI 示例 (React)

此樣板包括簡單的 Web UI,以演示與 API 的示例互動。
部署並設定好 hosts 後,請檢視
https://api.go-api-boilerplate.local
以訪問 UI。

關鍵概念

  1. Rest API
  2. Docker
  3. Kubernetes
  4. Helm chart
  5. Terraform
  6. gRPC
  7. Domain Driven Design (DDD)
  8. CQRS
  9. Event Sourcing
  10. Hexagonal, Onion, Clean Architecture
  11. oAuth2

值得了解一下這個樣板檔案中使用的包:

  1. gorouter
  2. message-bus
  3. gollback
  4. shutdown
  5. pubsub
  6. pushpull
  7. gocontainer

? 文件

快速開始

Localhost alias

編輯 /etc/hosts 以新增 localhost 別名

➜ go-api-boilerplate git:(master) cat /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 go-api-boilerplate.local api.go-api-boilerplate.local maildev.go-api-boilerplate.local mysql.go-api-boilerplate.local

Build release

Local image

make docker-build BIN=auth
make docker-build BIN=migrate
make docker-build BIN=user
make docker-build BIN=web

GitHub Package Registry

使用 metadata 建立 tag 將觸發 github workflow 並將 docker 映象釋出到 GitHub Package Registry。

標籤 v1.0.0+user 將觸發 user 服務的構建,釋出 1.0.0 docker image tag。您可以在 cmd 目錄中為所有服務建立 release。

v1.0.0+auth
v1.0.0+user
v1.0.0+web
v1.0.0+migrate

替換 main.yaml 中的 image 細節

  image:
-    repository: go-api-boilerplate-user
+    repository: docker.pkg.github.com/vardius/go-api-boilerplate/go-api-boilerplate-user
-    tag: latest
+    tag: 1.0.0
    pullPolicy: IfNotPresent

對所有服務重複此操作和 migrate init containers。

Private Registry

登入到 Docker

docker login

複製 docker config

cp ~/.docker/config.json ./k8s/.docker/config.json

驗證 config.json

Deploy release

make terraform-install

Destroy

make terraform-destroy

如果持久卷(persistent volume)在終止時堆疊(stack),則在持久卷受到保護時會發生這種情況。您應該能夠交叉驗證這一點:

kubectl describe pvc PVC_NAME --namespace=go-api-boilerplate | grep Finalizers

Output:
Finalizers:    [kubernetes.io/pvc-protection]

您可以通過使用 kubectl patchfinalizers 設定為 null 來解決此問題:

kubectl patch pvc PVC_NAME --namespace=go-api-boilerplate -p '{"metadata":{"finalizers": []}}' --type=merge

Build tags

Build flags 用於不同的持久層(persistence layers)。
有關詳細資訊,請參閱 services.go 檔案。
提供的層是 mysqlmongomemory
如果需要,可以按照給定的模式以類似的方式輕鬆新增新層。

go build -tags=persistence_mysql

可用的 build tags

  • persistence_mysql (mysql service container)
  • persistence_mongodb (mongodb service container)

Important
如果沒有提供 flag,持久層預設為 memory(Docker image 設定了 persistence_mysql flag),詳情請參閱每個服務 Dockerfile

Domain(領域)

Dispatching command(分發命令)

通過 POST 請求傳送示例 JSON

curl -d '{"email":"test@test.com"}' -H "Content-Type: application/json" -X POST https://api.go-api-boilerplate.local/users/v1/dispatch/user/user-register-with-email --insecure

View(檢視)

Public routes(公共路由)

獲取 user 詳細資訊 https://api.go-api-boilerplate.local/users/v1/34e7ed39-aa94-4ef2-9422-401bba9fc812

{"id":"34e7ed39-aa94-4ef2-9422-401bba9fc812","email":"test@test.com"}

獲取 user 列表 https://api.go-api-boilerplate.local/users/v1?page=1&limit=10

{"page":1,"limit":20,"total":1,"users":[{"id":"34e7ed39-aa94-4ef2-9422-401bba9fc812","email":"test@test.com"}]}

Protected routes(受保護的路由)

訪問 protected route,使用 `auth token https://api.go-api-boilerplate.local/users/v1/me.

{"code": "401","message": "Unauthorized"}

user 請求 access token

curl -d '{"email":"test@test.com"}' -H "Content-Type: application/json" -X POST https://api.go-api-boilerplate.local/users/v1/dispatch/user/user-request-access-token --insecure

mail catcher 獲取您的 access token https://maildev.go-api-boilerplate.local.

使用 auth token 訪問受保護的路由 https://api.go-api-boilerplate.local/users/v1/me?authToken=eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJyXHUwMDE277-977-977-977-9IiwiZXhwIjoxNTU5NjEwOTc2LCJzdWIiOiIzNGU3ZWQzOS1hYTk0LTRlZjItOTQyMi00MDFiYmE5ZmM4MTIifQ.pEkgtDAvNh2D3Dtgfpu4tt-Atn1h6QwMkDhz4KpgFxNX8jE7fQH00J6K5V7CV063pigxWhOMMTRLmQdhzhajzQ

{"id":"34e7ed39-aa94-4ef2-9422-401bba9fc812","email":"test@test.com"}

相關文章