第三代微服務架構:基於 Go 的部落格微服務實戰案例,支援分散式事務

jxlwqq發表於2022-01-07

這是一個可一鍵部署在 Kubernetes-Istio 叢集中的,基於 Golang 的部落格微服務 Demo,支援分散式事務。

專案地址:https://github.com/jxlwqq/blog-microservices ,歡迎 Star 和 PR。

架構

Kiali Console

目錄結構

主要遵循 Standard Go Project Layout 推薦的目錄分層。

使用的依賴:

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 埠即可訪問,如下圖所示:

註冊:

建立文章:

相關文章