Istio + SkyWalking + Spring Boot 實戰 -Zadig 自測模式搞定開發者子環境

語言: CN / TW / HK
 
微服務架構被企業級開發廣泛採用,而隨著業務迅速發展,服務數量也呈現爆炸式的增長。日常開發過程中一套測試環境可能包含成千上百個服務。在協作過程中等待環境、搶佔環境、驗證衝突已成為常態。而長期發展導致的技術債和基礎架構複雜度又非常高,複製多套環境存在較高難度,工程師日常協作只能在等待中苦不堪言。
 
在 Zadig V1.11.0 版本中推出了環境自測模式,工程師可以基於一套含全量服務的基準環境低成本搭建獨享的開發者子環境。利用 Istio 和 Tracing 元件的鏈路追蹤和流量動態路由的能力,實現開發者子環境與基準環境聯調的目的,從而解決大規模微服務下工程師被環境問題阻塞的情況。
下面以服務網格元件 Istio + 企業採用率非常廣泛的 SkyWalking + 典型微服務架構 Spring Boot 專案 PiggyMetrics 為例,演示如何使用 Zadig 自測模式實現工程師日常自測聯調過程。
 

專案簡介

本例 PiggyMetrics 專案,架構如下:
服務配置檔案參考 YAML,服務組成如下:
8 個 Spring Boot 應用程式:
  • account-service
  • auth-service
  • config-service (主要管理服務依賴的 configmap 和 secret 等配置)
  • gateway
  • monitoring-service
  • notification-service
  • registry-service
  • statistics-service
4 個 MongoDB 例項:
  • account-mongodb
  • auth-mongodb
  • notification-mongodb
  • statistics-mongodb
1 個 RabbitMq:
  • rabbitmq
對於 statistics-service 服務開發者需要自測聯調,可以基於基準環境拉起一套含有 config-service' 和 statistics-service' 服務的子環境,通過訪問基準環境的地址,並且在請求中加上子環境相應的 header 資訊可實現訪問子環境的能力。效果圖如下:
 

前置準備工作

基礎元件資訊

  • Kubernetes 版本:v1.20.11(Node 2*8c16g)
  • Zadig 版本:1.11.0+
  • Skywalking 版本:v8.8.1
  • ElasticSearch 版本:7.5.1
  • Istio 版本:1.12.1

安裝元件

1、安裝 Zadig

安裝方式參考官方文件: 快速安裝 | Zadig 文件

2、安裝 Istio

安裝方式參考官方文件: Installation Guides

3、安裝 SkyWalking

  1. kubectl create ns skywalking
    
    git clone http://github.com/apache/skywalking-kubernetes
    cd skywalking-kubernetes
    helm repo add elastic http://helm.elastic.co
    helm dep up chart/skywalking
    
    helm install skywalking skywalking -n skywalking -f ./skywalking/values-es7.yaml 

準備基準環境

1、在 Zadig 上建立專案 piggymetrics ,配置服務,服務 YAML fork 自 Zadig 程式碼庫,可使用「從程式碼庫同步」方式批量匯入服務配置。

 
服務 YAML 宣告中,已通過 initContainer 共享 SkyWalking Agent jar 到業務容器。initContainer 所使用的 IMAGE 通過以下方式生成:
# 選擇對應版本的 Agent jar 包下載,並構建成映象。Dockerfile示例如下:
FROM busybox:latest
RUN mkdir -p /usr/skywalking/agent/
ADD apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/
WORKDIR /
 
業務映象所使用的 IMAGE 生成方式舉例:
FROM java:8-jre

ADD ./target/statistics-service.jar /app/
ENTRYPOINT ["sh","-c","java -Dapp.id=$SW_AGENT_NAME -Xmx200m $JAVA_OPTS -Dskywalking.agent.service_name=$SW_AGENT_NAME -Dskywalking.collector.backend_service=$SW_AGENT_COLLECTOR_BACKEND_SERVICES -jar /app/statistics-service.jar"]
EXPOSE 7000
 
需要根據實際情況修改服務 YAML 的環境變數中 skywalking-oap 的地址:SW_AGENT_COLLECTOR_BACKEND_SERVICES 的值,即 <service-name>. <namespace-name>.svc.cluster.local
 

2、建立包含全量服務的基準環境 base

 
部署完成後,可從 SkyWalking UI 上檢視的服務之間的依賴關係如下:
 

開啟自測模式

在基準環境準備完成以後即可開啟自測模式並建立包含 config-servicestatistics-service服務的子環境 subdev.
 
 
建立完成後,修改子環境的中服務依賴的中介軟體等配置,環境配置-編輯 configmap special-config-env ,修改中介軟體地址為:<service-name>. <namespace-name>.svc.cluster.local。
apiVersion: v1
data:
  account_mongodb_host: account-mongodb.piggymetrics-env-base.svc.cluster.local
  auth_mongodb_host: auth-mongodb.piggymetrics-env-base.svc.cluster.local
  auth_service_host: auth-service.piggymetrics-env-base.svc.cluster.local
  notification_mongodb_host: notification-mongodb.piggymetrics-env-base.svc.cluster.local
  rabbitmq_host: rabbitmq.piggymetrics-env-base.svc.cluster.local
  registry_service_host: registry.piggymetrics-env-base.svc.cluster.local
  statistics_mongodb_host: statistics-mongodb.piggymetrics-env-base.svc.cluster.local
kind: ConfigMap
metadata:
  name: special-config-env
 
完成配置修改後,子環境環境即可正常和基準環境互動。

 

驗證自測模式

訪問 gateway 服務的介面:/account/current
訪問鏈路如下:

 

  1. 訪問基準環境

本機訪問叢集中的 gateway 服務,需要先做埠轉發。
kubectl port-forward service/gateway 8085:80 -n  piggymetrics-env-base
 
  • 方式一:Chrome 訪問 localhost:8085 頁面正常操作,即訪問的是基準環境。
  • 方式二:使用 curl 命令請求基準環境
curl -v -X PUT -H "Authorization: Bearer c7f5d94f-8eca-4702-96b4-f496837e8e29" -H "Content-Type:application/json" -d '{"note":null,"incomes":[{"income_id":1,"title":"10000www","icon":"wallet","currency":"USD","period":"MONTH","amount":"10000","converted":"NaN"}],"expenses":[],"saving":{"amount":0,"capitalization":false,"deposit":false,"currency":"USD","interest":0}}' localhost:8085/accounts/current
 
上述請求中的 access token Bearer c7f5d94f-8eca-4702-96b4-f496837e8e29 可以通過登入 piggymetrics web 端新建使用者獲取,如下圖所示。
  1. 訪問子環境

訪問地址使用 base 環境的地址,並在請求 header 中新增欄位:
方式一:利用 Chrome 外掛 ModHeader ,使頁面發起的請求在 header 中新增欄位。加上欄位後,可以使用 Chrome 頁面操作,訪問子環境進行自測聯調。
 
方式二:使用 curl 命令將請求轉發到子環境,使用子環境進行自測聯調,請求 header 中新增欄位 x-env、sw8。
curl -v -X PUT -H "Authorization: Bearer c7f5d94f-8eca-4702-96b4-f496837e8e29" -H 'x-env: subdev' -H 'sw8: 1-Mjk3ZWIyYTIzNzk2NGQzZDgzMzVkMjk3MTA3NjliNjQuNDkuMTY1MTczNjc1NDEwNTAwMDE=-Mjk3ZWIyYTIzNzk2NGQzZDgzMzVkMjk3MTA3NjliNjQuNDkuMTY1MTczNjc1NDEwNTAwMDA=-1-U2VydmljZUI=-MTEwY2VhMzFhODcwNDBlZTkwN2QxZjQxOTg0MjUzMTFAMTkyLjE2OC4wLjI0MA==-R0VUOi9ncmVldGluZy97bmFtZX0=-U2VydmljZUE6ODA=' -H "Content-Type:application/json" -d '{"note":null,"incomes":[{"income_id":1,"title":"10000www","icon":"wallet","currency":"USD","period":"MONTH","amount":"10000","converted":"NaN"}],"expenses":[],"saving":{"amount":0,"capitalization":false,"deposit":false,"currency":"USD","interest":0}}' localhost:8085/accounts/current

 

檢視子環境 subdev 中 statistics-service 服務的日誌,可知請求已到子環境服務中。
kubectl logs statistics-service-5966d6b65c-5sc98 -n piggymetrics-env-subdev|grep "statistics-service-"
 
至此已實現自測模式的能力,工程師可以根據實際情況基於基準環境建立屬於自己的子環境。
 
Zadig,讓工程師更專注創造!歡迎加入 開源吐槽群🔥