开发者子环境实战:Istio、SkyWalking 与 Spring Boot 的集成应用

深入剖析 Java 典型案例,探索 Zadig 自测子环境的应用策略

cover.png

微服务架构被企业级开发广泛采用,而随着业务迅速发展,服务数量也呈现爆炸式的增长。日常开发过程中一套测试环境可能包含成千上百个服务。在协作过程中等待环境、抢占环境、验证冲突已成为常态。而长期发展导致的技术债基础架构复杂度又非常高,复制多套环境存在较高难度,工程师日常协作只能在等待中苦不堪言。

在 Zadig 系统推出了环境自测模式,工程师可以基于一套含全量服务的基准环境低成本搭建独享的开发者子环境。利用 Istio 和 Tracing 组件的链路追踪流量动态路由的能力,实现开发者子环境与基准环境联调的目的,从而解决大规模微服务下工程师被环境问题阻塞的情况。

image.png

下面以服务网格组件 Istio (opens new window) + 企业采用率非常广泛的 SkyWalking (opens new window) + 典型微服务架构 Spring Boot 项目 PiggyMetrics (opens new window) 为例,演示如何使用 Zadig 自测模式实现工程师日常自测联调过程。

# 项目简介

本例 PiggyMetrics (opens new window) 项目,架构如下:

image.png

服务配置文件参考 YAML (opens new window),服务组成如下:

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 信息可实现访问子环境的能力。效果图如下:

流程图.jpg

# 前置准备工作

# 基础组件信息

  • Kubernetes 版本:v1.29(Node 2*8c16g)
  • Zadig 版本:2.0+
  • Skywalking 版本:v10.0.0
  • ElasticSearch 版本:7.17.1
  • Istio 版本:1.12.1

# 安装组件

# 1.安装 Zadig

安装方式参考官方文档:快速安装 | Zadig 文档 (opens new window)

# 2.安装 Istio

安装方式参考官方文档:Installation Guides (opens new window)

# 3.安装 SkyWalking

git clone https://github.com/apache/skywalking-kubernetes
cd skywalking-kubernetes

kubectl create ns skywalking
helm repo add elastic https://helm.elastic.co
helm dep up chart/skywalking

cd chart
helm install skywalking skywalking -n skywalking -f ./skywalking/values-my-es.yaml #根据实际情况自行修改 values-my-es.yaml 配置

# 准备基准环境

  1. 在 Zadig 上创建项目 piggymetrics ,配置服务,服务 YAML fork 自 Zadig 代码库 (opens new window),可使用「从代码库同步」方式批量导入服务配置。

服务 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,服务加载进来后,填写 oap_svc 变量值,本例中配置 skywalking-skywalking-helm-oap

  1. 创建包含全量服务的基准环境 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

  • 方式二: 使用 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 中添加字段:

方式一: 利用 Chrome 插件 ModHeader (opens new window),使页面发起的请求在 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-"

至此已实现自测模式的能力,工程师可以根据实际情况基于基准环境创建属于自己的子环境。

Background Image

作为一名软件工程师,我们一直给各行各业写软件提升效率,但是软件工程本身却是非常低效,为什么市面上没有一个工具可以让研发团队不这么累,还能更好、更快地满足大客户的交付需求?我们是否能够打造一个面向开发者的交付平台呢?我们开源打造 Zadig 正是去满足这个愿望。

—— Zadig 创始人 Landy