讓遠端成為本地,微服務後端開發的福音

Rainbond發表於2023-02-07

微服務後端開發的最大痛點之一就是除錯困難,非常影響我們的開發效率。

如果我們想與其他微服務進行聯動除錯,則需要在本地環境中啟動對應的微服務模組,這可能需要大量的配置和構建時間,同時也會佔用我們本地很多資源,可能還會出現”帶不動“的情況。

雖然說我們可以在測試伺服器上進行除錯,但整個流程也是比較漫長,提交程式碼 -> 觸發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 上的微服務

安裝 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 這個服務為例,演示本地開發除錯的流程,這裡需要做一些小改動:

  1. 從應用商店安裝的應用預設 Workload 是字串,需要修改 Workload 為易於檢視的,這裡以 pig-auth 為例,進入元件中編輯元件名稱,修改元件英文名稱為 auth

  2. 簡單來說 telepresence 的工作原理就是代理 k8s service,預設 gateway 到 auth 是使用的 nacos 做的負載均衡,這樣的話 telepresence 是無法攔截到流量的,我們需要修改 gateway 配置使用 k8s service 做負載均衡。

    • 開啟 pig-register 元件的 8848 對外埠,訪問 nacos,修改 pig-gateway-dev.ymlspring.cloud.gateway.routes.uri: http://gr795b69:3000gr795b69:3000 透過 pig-auth 元件內的埠訪問地址獲取。
  3. 如果本地只啟動一個 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 的部署簡化,從開發到部署都非常的簡單,讓我們專注於程式碼編寫。

相關文章