干貨,搞定 Istio + SkyWalking + Spring Boot 實(shí)戰(zhàn)環(huán)境

項(xiàng)目簡(jiǎn)介
本例 PiggyMetrics [4] 項(xiàng)目,架構(gòu)如下:

服務(wù)配置文件參考 YAML [5],服務(wù)組成如下:
8 個(gè) Spring Boot 應(yīng)用程序:
account-service
auth-service
config-service (主要管理服務(wù)依賴的 configmap 和 secret 等配置)
gateway
monitoring-service
notification-service
registry-service
statistics-service
4 個(gè) MongoDB 實(shí)例:
account-mongodb
auth-mongodb
notification-mongodb
statistics-mongodb
1 個(gè) RabbitMq:
rabbitmq
對(duì)于 statistics-service 服務(wù)開(kāi)發(fā)者需要自測(cè)聯(lián)調(diào),可以基于基準(zhǔn)環(huán)境拉起一套含有 config-service' 和 statistics-service' 服務(wù)的子環(huán)境,通過(guò)訪問(wèn)基準(zhǔn)環(huán)境的地址,并且在請(qǐng)求中加上子環(huán)境相應(yīng)的 header 信息可實(shí)現(xiàn)訪問(wèn)子環(huán)境的能力。效果圖如下:

前置準(zhǔn)備工作
基礎(chǔ)組件信息
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 文檔」[6]
2
安裝 Istio:安裝方式參考官方文檔: Installation Guides [7]
3
安裝 SkyWalking:
kubectl create ns skywalkinggit clone https://github.com/apache/skywalking-kubernetescd skywalking-kuberneteshelm repo add elastic https://helm.elastic.cohelm dep up chart/skywalkinghelm install skywalking skywalking -n skywalking -f ./skywalking/values-es7.yaml
代碼片段:左右滑動(dòng)可查看完整代碼

準(zhǔn)備基準(zhǔn)環(huán)境
1、在 Zadig 上創(chuàng)建項(xiàng)目 piggymetrics,配置服務(wù),服務(wù) YAML fork 自 Zadig 代碼庫(kù) [8] ,可使用「從代碼庫(kù)同步」方式批量導(dǎo)入服務(wù)配置

服務(wù) YAML 聲明中,已通過(guò) initContainer 共享 SkyWalking Agent jar 到業(yè)務(wù)容器。initContainer 所使用的 IMAGE 通過(guò)以下方式生成:
# 選擇對(duì)應(yīng)版本的 Agent jar 包下載 [9] ,并構(gòu)建成鏡像。Dockerfile示例如下:FROM busybox:latestRUN mkdir -p /usr/skywalking/agent/ADD apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/WORKDIR /
代碼片段:左右滑動(dòng)可查看完整代碼
業(yè)務(wù)鏡像所使用的 IMAGE 生成方式舉例:
FROM java:8-jreADD ./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
代碼片段:左右滑動(dòng)可查看完整代碼
需要根據(jù)實(shí)際情況修改服務(wù) YAML 的環(huán)境變量中 skywalking-oap 的地址:SW_AGENT_COLLECTOR_BACKEND_SERVICES 的值,即 <service-name>. <namespace-name>.svc.cluster.local

2、創(chuàng)建包含全量服務(wù)的基準(zhǔn)環(huán)境 base

部署完成后,可從 SkyWalking UI 上查看的服務(wù)之間的依賴關(guān)系如下:

開(kāi)啟自測(cè)模式
在基準(zhǔn)環(huán)境準(zhǔn)備完成以后即可開(kāi)啟自測(cè)模式并創(chuàng)建包含 config-service 和 statistics-service 服務(wù)的子環(huán)境 subdev


創(chuàng)建完成后,修改子環(huán)境的中服務(wù)依賴的中間件等配置,環(huán)境配置-編輯 configmap special-config-env,修改中間件地址為:<service-name>. <namespace-name>.svc.cluster.local。
apiVersion: v1data:account_mongodb_host: account-mongodb.piggymetrics-env-base.svc.cluster.localauth_mongodb_host: auth-mongodb.piggymetrics-env-base.svc.cluster.localauth_service_host: auth-service.piggymetrics-env-base.svc.cluster.localnotification_mongodb_host: notification-mongodb.piggymetrics-env-base.svc.cluster.localrabbitmq_host: rabbitmq.piggymetrics-env-base.svc.cluster.localregistry_service_host: registry.piggymetrics-env-base.svc.cluster.localstatistics_mongodb_host: statistics-mongodb.piggymetrics-env-base.svc.cluster.localkind: ConfigMapmetadata:name: special-config-env
代碼片段:左右滑動(dòng)可查看完整代碼

完成配置修改后,子環(huán)境環(huán)境即可正常和基準(zhǔn)環(huán)境交互。

驗(yàn)證自測(cè)模式
訪問(wèn) gateway 服務(wù)的接口:/account/current
訪問(wèn)鏈路如下:

1、訪問(wèn)基準(zhǔn)環(huán)境
本機(jī)訪問(wèn)集群中的 gateway 服務(wù),需要先做端口轉(zhuǎn)發(fā)。
kubectl port-forward service/gateway 8085:80 -n piggymetrics-env-base代碼片段:左右滑動(dòng)可查看完整代碼
方式一:
Chrome 訪問(wèn) localhost:8085 頁(yè)面正常操作,即訪問(wèn)的是基準(zhǔn)環(huán)境

方式二:
使用 curl 命令請(qǐng)求基準(zhǔn)環(huán)境
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代碼片段:左右滑動(dòng)可查看完整代碼
上述請(qǐng)求中的 access token Bearer c7f5d94f-
8eca-4702-96b4-f496837e8e29,可以通過(guò)登錄
piggymetrics web 端新建用戶獲取,如下圖所示:


2、訪問(wèn)子環(huán)境
訪問(wèn)地址使用 base 環(huán)境的地址,并在請(qǐng)求 header 中添加字段:
x-env:表示請(qǐng)求轉(zhuǎn)發(fā)到的子環(huán)境名,如 x-env=subdev
sw8:參考 「跨進(jìn)程傳播的頭部協(xié)議 sw8 詳情」[10]
方式一:
利用 「 Chrome 插件 ModHeader 」[11],使頁(yè)面發(fā)起的請(qǐng)求在 header 中添加字段。加上字段后,可以使用 Chrome 頁(yè)面操作,訪問(wèn)子環(huán)境進(jìn)行自測(cè)聯(lián)調(diào)。

方式二:
使用 curl 命令將請(qǐng)求轉(zhuǎn)發(fā)到子環(huán)境,使用子環(huán)境進(jìn)行自測(cè)聯(lián)調(diào),請(qǐng)求 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代碼片段:左右滑動(dòng)可查看完整代碼
查看子環(huán)境 subdev 中 statistics-service 服務(wù)的日志,
可知請(qǐng)求已到子環(huán)境服務(wù)中。
kubectl logs statistics-service-5966d6b65c-5sc98 -n piggymetrics-env-subdev|grep "statistics-service-"代碼片段:左右滑動(dòng)可查看完整代碼

至此已實(shí)現(xiàn)自測(cè)模式的能力,工程師可以根據(jù)實(shí)際情況基于基準(zhǔn)環(huán)境創(chuàng)建屬于自己的子環(huán)境。
GitHub: https://github.com/koderover/zadig,歡迎大家前來(lái)圍觀。
掃描以下二維碼,添加 KodeRover / Zadig 小伙伴,備注 【姓名-公司-城市】,即可加入我們的「Zadig 開(kāi)源吐槽群」
參考資料:
[1] Istio:https://github.com/istio/istio
[2] SkyWalking:https://github.com/apache/skywalking
[3、4] PiggyMetrics:https://github.com/sqshq/piggymetrics
[5] YAML:https://github.com/koderover/zadig/tree/main/examples/spring-cloud-piggymetrics
[6] 「快速安裝 | Zadig 文檔」:https://docs.koderover.com/zadig/v1.11.0/quick-start/try-out-install/#%E5%89%8D%E7%BD%AE%E6%9D%A1%E4%BB%B6
[7] Installation Guides:https://istio.io/latest/docs/setup/install/
[8] Zadig 代碼庫(kù):https://github.com/koderover/zadig/tree/main/examples/spring-cloud-piggymetrics
[9] Agent jar 包下載:https://skywalking.apache.org/downloads/#JavaAgent
[10] 「跨進(jìn)程傳播的頭部協(xié)議 sw8 詳情」:https://skyapm.github.io/document-cn-translation-of-skywalking/zh/8.0.0/protocols/Skywalking-Cross-Process-Propagation-Headers-Protocol-v3.html
[11] 「Chrome 插件 ModHeader 」:https://chrome.google.com/webstore/detail/modheader/idgpnmonknjnojddfkpgkljpfnnfcklj


