微服務後端開發的最大痛點之一就是除錯困難,非常影響我們的開發效率。
如果我們想與其他微服務進行聯動除錯,則需要在本地環境中啟動對應的微服務模組,這可能需要大量的配置和構建時間,同時也會佔用我們本地很多資源,可能還會出現”帶不動“的情況。
雖然說我們可以在測試伺服器上進行除錯,但整個流程也是比較漫長,提交程式碼 -> 觸發CI/CD -> 等待構建成功,可能簡單的 BUG 我們提交程式碼打個日誌就能解決問題,當遇到複雜的 BUG 時透過這個方式在伺服器上除錯就非常難受了,太浪費時間了,提交 -> 等待,反反覆覆,始終沒有本地開發工具直接除錯的方便。
下面介紹的工具將遠端和本地融為一體,讓本地開發更加流暢。
Telepresence
Telepresence 是一個開源工具,用於在本地開發環境中模擬 Kubernetes 叢集中的微服務,它允許開發人員在本地開發環境中執行和除錯微服務,而不必擔心環境的複雜性和配置困難。
簡單來說 Telepresence 將 Kubernetes 叢集中服務的流量代理到本地,Telepresence 主要有四個服務:
Telepresence Daemon: 本地的守護程式,用於叢集通訊和攔截流量。
Telepresence Traffic Manager: 叢集中安裝的流量管理器,代理所有相關的入站和出站流量,並跟蹤主動攔截。
Telepresence Traffic Agent: 攔截流量的 sidecar 容器,會注入到工作負載的 POD 中。
Ambassador Cloud: SaaS 服務,結合 Telepresence 一起使用,主要是生成預覽 URL 和一些增值服務。
全域性流量攔截
全域性流量攔截是將 Orders 的所有流量都攔截到我們本地開發機上,如下圖。
個人流量攔截
個人流量攔截允許選擇性地攔截服務的部分流量,而不會干擾其餘流量。這使我們可以與團隊中的其他人共享一個叢集,而不會干擾他們的工作。每個開發人員都可以只針對他們的請求攔截 Orders 服務,同時共享開發環境的其餘部分。
個人攔截需要配合 Ambassador Cloud
使用,這是一項收費服務,免費使用者可以最多攔截 3 個服務。
結合 Telepresence 開發除錯 Rainbond 上的微服務
- 基於主機安裝 Rainbond 或基於 Helm 安裝 Rainbond。
安裝 Telepresence
MacOS:
# Intel
brew install datawire/blackbird/telepresence
# M1
brew install datawire/blackbird/telepresence-arm64
Windows:
# 使用管理員身份開啟 Powershell
# 下載壓縮包
Invoke-WebRequest https://app.getambassador.io/download/tel2/windows/amd64/latest/telepresence.zip -OutFile telepresence.zip
# 解壓縮包
Expand-Archive -Path telepresence.zip -DestinationPath telepresenceInstaller/telepresence
Remove-Item 'telepresence.zip'
cd telepresenceInstaller/telepresence
# 安裝
powershell.exe -ExecutionPolicy bypass -c " . '.\install-telepresence.ps1';"
安裝 Telepresence 流量管理器到叢集中
可以使用 Telepresence 快速安裝 Traffic Manager,本地需要有 kubeconfig 檔案 ~/.kube/config
。
$ telepresence helm install
...
Traffic Manager installed successfully
或者在 Kubernetes 叢集中使用 Helm 安裝 Traffic Manager。
本地連線遠端服務
本地使用 telepresence connect
連線遠端 Kubernetes API Server,本地需要有 kubeconfig 檔案 ~/.kube/config
$ telepresence connect
connected to context <your-context>
在 Rainbond 上快速部署 Pig 微服務應用
透過 Rainbond 開源應用商店快速部署 Pig 微服務應用,部署後如下圖
後面會以 pig-auth 這個服務為例,演示本地開發除錯的流程,這裡需要做一些小改動:
- 從應用商店安裝的應用預設 Workload 是字串,需要修改 Workload 為易於檢視的,這裡以 pig-auth 為例,進入元件中編輯元件名稱,修改元件英文名稱為
auth
簡單來說 telepresence 的工作原理就是代理 k8s service,預設 gateway 到 auth 是使用的 nacos 做的負載均衡,這樣的話 telepresence 是無法攔截到流量的,我們需要修改 gateway 配置使用 k8s service 做負載均衡。
- 開啟 pig-register 元件的 8848 對外埠,訪問 nacos,修改
pig-gateway-dev.yml
的spring.cloud.gateway.routes.uri: http://gr795b69:3000
,gr795b69:3000
透過 pig-auth 元件內的埠訪問地址獲取。
- 開啟 pig-register 元件的 8848 對外埠,訪問 nacos,修改
- 如果本地只啟動一個 pig-auth 服務,pig-auth 需要連線 pig-register 和 redis,那麼就需要將這倆服務的對外埠開啟,並修改配置檔案讓本地的 pig-auth 服務可以連線遠端到 pig-register 和 redis。
在本地除錯 auth 服務
使用 IDEA 或 VScode 在本地啟動 pig-auth 服務。
在本地使用 telepresence 攔截 pig-auth 流量,命令如下:
$ telepresence intercept <workload> --port <local-port>:<service port name> -n <namespace>
命令拆解:
# <workload>
# 需要攔截流量的服務 workload
$ kubectl get deploy -n zq
NAME READY UP-TO-DATE AVAILABLE AGE
pig-auth 1/1 1 1 146m
# <local-port> 本地埠
# <service port name>
# 需要攔截流量的服務的 service port name
$ kubectl get svc gr795b69 -n zq -o yaml
...
ports:
- name: http-3000
port: 3000
protocol: TCP
targetPort: 3000
...
# <namespace> 名稱空間
最終命令:
$ telepresence intercept pig-auth --port 3000:http-3000 -n zq
Using Deployment pig-auth
intercepted
Intercept name : pig-auth-zq
State : ACTIVE
Workload kind : Deployment
Destination : 127.0.0.1:3000
Service Port Identifier: http-3000
Volume Mount Error : sshfs is not installed on your local machine
Intercepting : all TCP requests
我們在本地給退出登陸這塊邏輯打上斷點,然後透過線上的前端退出登陸,打到我們本地 IDEA上,整體效果如下:
最後
Telepresence 可以幫助我們簡化本地開發流程,同時保證程式碼的正確性和可靠性。還能使我們在叢集中輕鬆除錯和測試程式碼,提高開發效率。結合 Rainbond 的部署簡化,從開發到部署都非常的簡單,讓我們專注於程式碼編寫。