該專案的主要目的是使用最佳實踐、DDD
、CQRS
、ES
、gRPC
提供樣板專案設定。
為開發和生產環境提供 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。
關鍵概念
- Rest API
- Docker
- Kubernetes
- Helm chart
- Terraform
- gRPC
- Domain Driven Design (DDD)
- CQRS
- Event Sourcing
- Hexagonal, Onion, Clean Architecture
- oAuth2
值得了解一下這個樣板檔案中使用的包:
? 文件
快速開始
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 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 patch
將 finalizers
設定為 null
來解決此問題:
kubectl patch pvc PVC_NAME --namespace=go-api-boilerplate -p '{"metadata":{"finalizers": []}}' --type=merge
Build tags
Build flags
用於不同的持久層(persistence layers
)。
有關詳細資訊,請參閱 services.go
檔案。
提供的層是 mysql
、mongo
和 memory
。
如果需要,可以按照給定的模式以類似的方式輕鬆新增新層。
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.
{"id":"34e7ed39-aa94-4ef2-9422-401bba9fc812","email":"test@test.com"}