干货,搞定 Istio + SkyWalking + Spring Boot 实战环境
共 6508字,需浏览 14分钟
·
2022-05-20 19:18
项目简介
本例 PiggyMetrics [4] 项目,架构如下:
服务配置文件参考 YAML [5],服务组成如下:
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 文档」[6]
2
安装 Istio:安装方式参考官方文档: Installation Guides [7]
3
安装 SkyWalking:
kubectl create ns skywalking
git clone https://github.com/apache/skywalking-kubernetes
cd skywalking-kubernetes
helm repo add elastic https://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 代码库 [8] ,可使用「从代码库同步」方式批量导入服务配置
服务 YAML 声明中,已通过 initContainer 共享 SkyWalking Agent jar 到业务容器。initContainer 所使用的 IMAGE 通过以下方式生成:
# 选择对应版本的 Agent jar 包下载 [9] ,并构建成镜像。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-service
和 statistics-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 端新建用户获取,如下图所示:
2、访问子环境
访问地址使用 base 环境的地址,并在请求 header 中添加字段:
x-env:表示请求转发到的子环境名,如 x-env=subdev
sw8:参考 「跨进程传播的头部协议 sw8 详情」[10]
方式一:
利用 「 Chrome 插件 ModHeader 」[11],使页面发起的请求在 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-"
代码片段:左右滑动可查看完整代码
至此已实现自测模式的能力,工程师可以根据实际情况基于基准环境创建属于自己的子环境。
GitHub: https://github.com/koderover/zadig,欢迎大家前来围观。
扫描以下二维码,添加 KodeRover / Zadig 小伙伴,备注 【姓名-公司-城市】,即可加入我们的「Zadig 开源吐槽群」
参考资料:
[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 代码库:https://github.com/koderover/zadig/tree/main/examples/spring-cloud-piggymetrics
[9] Agent jar 包下载:https://skywalking.apache.org/downloads/#JavaAgent
[10] 「跨进程传播的头部协议 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