這是一個可一鍵部署在 Kubernetes-Istio 叢集中的,基於 Golang 的部落格微服務 Demo,支援分散式事務。
專案地址:https://github.com/jxlwqq/blog-microservices ,歡迎 Star 和 PR。
架構
Kiali Console
目錄結構
主要遵循 Standard Go Project Layout 推薦的目錄分層。
使用的依賴:
- gRPC 通訊協議
- GORM 資料庫 ORM
- DTM 分散式事務管理器
- Jaeger 分散式追蹤
- Prometheus 監控系統
- Grafana 資料視覺化
- Kiali 可觀察性工具
- Kubernetes 容器編排
- Istio 服務網格
Makefile 簡介
命令 | 說明 |
---|---|
make init |
安裝各類 protoc-gen-* 、 wire 以及 migrate |
make protoc |
基於 *.proto 檔案,生成各類 *_pb.go |
make wire |
基於 wire.go 檔案,生成 wire_gen.go |
make test |
測試 |
make migrate-up |
遷移資料庫 |
make migrate-down |
回滾資料庫 |
make blog-server |
啟動 blog 服務(本地開發環境) |
make user-server |
啟動 user 服務(本地開發環境) |
make post-server |
啟動 post 服務(本地開發環境) |
make comment-server |
啟動 comment 服務(本地開發環境) |
make auth-server |
啟動 auth 服務(本地開發環境) |
make dtm-server |
DTM 為外部依賴,啟動本地服務,請瀏覽 官方文件 |
make docker-build |
構建 Docker 映象 |
make kube-deploy |
在叢集中部署 blog、user、post、comment、auth 以及 dtm 服務 |
make kube-delete |
在叢集中刪除上述服務 |
make kube-redeploy |
在叢集中重新部署服務(⚠️ 資料庫服務不會重新部署) |
本地環境搭建
- docker-desktop >= 4.3.2
- kubernetes >= 1.22.4
- go >= 1.17
- istioctl >= 1.12.1
- protobuf >= 3.19.1
下載安裝 Docker Desktop ,並啟動內建的 Kubernetes 叢集。
# 安裝 Go
brew install go
# 安裝 Protobuf
brew install protobuf
# 安裝 Istio
brew install istioctl
kubectl config use-context docker-desktop
istioctl install -y
kubectl label namespace default istio-injection=enabled
ARM64 架構的使用者安裝 Istio,請檢視 這裡 以獲取更多資訊。
一鍵部署到本地叢集
資料庫初始化,專案相關的配置已經在 deployments
目錄中的 yaml 檔案中設定好,直接一鍵部署即可。
部署的資源比較多,請儘可能地將 Docker Desktop 的 CPU、Memory 拉高,避免 Pod 無法完成排程,詳見 這裡。
make docker-build
make kube-deploy
檢視 Pod 資源:
kubectl get pods -A
返回:
NAMESPACE NAME READY STATUS RESTARTS AGE
default auth-server-678f9d4b4-lhkf8 2/2 Running 0 101s
default blog-server-6475d7bdd5-6t9jk 2/2 Running 0 101s
default comment-db-59665d87f8-plswq 2/2 Running 0 101s
default comment-server-857445775b-qkpm5 2/2 Running 3 (74s ago) 100s
default dtm-db-cb8c45698-qms8q 2/2 Running 0 102s
default dtm-server-c548d67cc-xcv2z 2/2 Running 0 102s
default post-db-867f5f85db-zz64g 2/2 Running 0 101s
default post-server-5448dc5b67-mdhcc 2/2 Running 4 (54s ago) 101s
default user-db-fcfd47bf8-dh9kp 2/2 Running 0 101s
default user-server-78688485b8-zf5tc 2/2 Running 3 (76s ago) 101s
istio-system grafana-6ccd56f4b6-tp84j 1/1 Running 0 100s
istio-system istio-egressgateway-67dc4b96cd-2gm6s 1/1 Running 5 13d
istio-system istio-ingressgateway-68d897fbcd-thvt9 1/1 Running 5 13d
istio-system istiod-66dc55cd96-r6cnv 1/1 Running 5 13d
istio-system jaeger-9dd685668-wdzsz 1/1 Running 0 100s
istio-system kiali-79b86ff5bc-jh6v8 1/1 Running 0 100s
istio-system prometheus-64fd8ccd65-4c5nc 2/2 Running 0 99s
kube-system coredns-558bd4d5db-5nlbz 1/1 Running 5 13d
kube-system coredns-558bd4d5db-m46lb 1/1 Running 5 13d
kube-system etcd-docker-desktop 1/1 Running 13 13d
kube-system kube-apiserver-docker-desktop 1/1 Running 13 13d
kube-system kube-controller-manager-docker-desktop 1/1 Running 13 13d
kube-system kube-proxy-mj6x8 1/1 Running 5 13d
kube-system kube-scheduler-docker-desktop 1/1 Running 13 13d
kube-system storage-provisioner 1/1 Running 11 13d
kube-system vpnkit-controller 1/1 Running 177 (2m56s ago) 13d
檢視 Service 資源:
kubectl get services -A
返回:
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default auth-server ClusterIP 10.99.64.145 <none> 50054/TCP,8054/TCP,9054/TCP 15m
default blog-server ClusterIP 10.96.207.114 <none> 50050/TCP,8050/TCP,9050/TCP 15m
default comment-db ClusterIP 10.99.195.67 <none> 3306/TCP 15m
default comment-server ClusterIP 10.96.179.191 <none> 50053/TCP,9053/TCP 15m
default dtm-db ClusterIP 10.106.31.52 <none> 3306/TCP 15m
default dtm-server ClusterIP 10.99.170.244 <none> 36790/TCP,36789/TCP 15m
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13d
default post-db ClusterIP 10.103.103.106 <none> 3306/TCP 15m
default post-server ClusterIP 10.96.232.141 <none> 50052/TCP,9052/TCP 15m
default user-db ClusterIP 10.99.144.168 <none> 3306/TCP 15m
default user-server ClusterIP 10.100.66.36 <none> 50051/TCP,9051/TCP 15m
istio-system grafana ClusterIP 10.105.48.42 <none> 3000/TCP 15m
istio-system istio-egressgateway ClusterIP 10.99.128.200 <none> 80/TCP,443/TCP 13d
istio-system istio-ingressgateway LoadBalancer 10.101.116.168 localhost 15021:30898/TCP,80:32417/TCP,443:32343/TCP,31400:32210/TCP,15443:31544/TCP 13d
istio-system istiod ClusterIP 10.108.250.181 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 13d
istio-system jaeger-collector ClusterIP 10.103.107.169 <none> 14268/TCP,14250/TCP,9411/TCP 15m
istio-system kiali ClusterIP 10.111.157.82 <none> 20001/TCP,9090/TCP 15m
istio-system prometheus ClusterIP 10.100.104.250 <none> 9090/TCP 15m
istio-system tracing ClusterIP 10.108.139.227 <none> 80/TCP,16685/TCP 15m
istio-system zipkin ClusterIP 10.101.235.179 <none> 9411/TCP 15m
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 13d
訪問服務
推薦使用 BloomRPC 或者 Insomnia ,匯入 api/protobuf/blog.proto 檔案後, 服務地址填寫 localhost:80
埠即可訪問,如下圖所示:
註冊:
建立文章: