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

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

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

项目简介

本例 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-kubernetescd skywalking-kuberneteshelm repo add elastic https://helm.elastic.cohelm 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:latestRUN 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: v1data:  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.localkind: ConfigMapmetadata:  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

2

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-"

代码片段:左右滑动可查看完整代码

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

干货,搞定 Istio + SkyWalking + Spring Boot 实战环境相关推荐

  1. 程序猿最终之路-架构师:Spring boot实战战役解析

    什么是架构师 所谓架构师,通俗地说就是设计师或结构设计者,这些定义如果用在建筑学上,则是很容易理解的.在软件工程领域中,软件架构师实际上就是软件项目的总体设计师,是软件组织新产品的开发与集成.新技术体 ...

  2. spring boot 实战 / 可执行war启动参数详解

    概述   上一篇文章<spring boot 实战 / mvn spring-boot:run 参数详解>主要讲解了spring boot 项目基于maven插件启动过程中借助profil ...

  3. Spring Boot实战:过滤器、拦截器与切片

    Spring Boot实战:过滤器.拦截器与切片 Q:使用过滤器.拦截器与切片实现每个请求耗时的统计,并比较三者的区别与联系 过滤器Filter 过滤器概念 Filter是J2E中来的,可以看做是Se ...

  4. Spring Boot 实战 —— MyBatis(注解版)使用方法

    原文链接: Spring Boot 实战 -- MyBatis(注解版)使用方法 简介 MyBatis 官网 是这么介绍它自己的: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过 ...

  5. Spring Boot实战pdf

    下载地址:网盘下载 Spring Boot实战以Spring应用程序开发为中心,全面讲解如何运用Spring Boot提高效率,使应用程序的开发和管理更加轻松有趣.作者行文亲切流畅,以大量示例讲解了S ...

  6. Spring Boot实战系列《六》:人事管理系统的登录设计

    Spring Boot实战系列<六>:人事管理系统的登录设计 Spring Boot实战系列<六>:人事管理系统的登录设计 1.前言 在上一篇中教大家在IEDA或者eclips ...

  7. spring boot实战(第六篇)加载application资源文件源码分析

    前言 在上一篇中了解了spring配置资源的加载过程,本篇在此基础上学习spring boot如何默认加载application.xml等文件信息的. ConfigFileApplicationLis ...

  8. Spring Boot 实战系列课程终于齐啦~

    Spring Boot 如今已成为 Java 开发必学技术,其可以大大简化 Spring 应用的初始搭建以及开发过程. Spring Boot 不仅支持直接嵌入 Tomcat,Jetty 或 Unde ...

  9. Spring Boot实战解决高并发数据入库: Redis 缓存+MySQL 批量入库

    前言 最近在做阅读类的业务,需要记录用户的PV,UV: 项目状况:前期尝试业务阶段: 特点: 快速实现(不需要做太重,满足初期推广运营即可) 快速投入市场去运营 收集用户的原始数据,三要素: 谁 在什 ...

最新文章

  1. 使用ASIHTTPRequest进行http 请求bug
  2. 04.full_text match查询
  3. 【软件测试】测试需求分析
  4. AtCoder Regular Contest 080
  5. delphi中webbrowse控件中模拟点击文本超链接_功能测试——控件测试
  6. 剑指offer——9.用两个栈实现队列
  7. 网络对抗——web基础
  8. 基于Protues的Arduino学习笔记01-Arduino UNO实验板设计
  9. ALM11(QC11)官方中文安装包下载
  10. 计算机右键管理是什么软件,右键管理工具打不开怎么办【图文】
  11. Google发布免费的SketchUp
  12. win10系统做域服务器,win10启用ad域服务器配置
  13. 什么是arXiv.org?
  14. 微信小程序自定义函数返回值
  15. 福利彩票36选7模拟程序
  16. 关于如何在word中使用EndNote引用知网的文献
  17. 『实用教程』使用Visual Studio自带的Git管理回滚代码版本
  18. Android 和 H5 交互-框架篇
  19. Edge浏览器固定到任务栏的网页图标显示透明
  20. Postman接口与压力测试实例

热门文章

  1. 程序员最值得关注的10个C开源项目
  2. EOS CPU价格短暂暴涨百倍真相
  3. adb命令录制手机视频
  4. Javascript 05:敏感词过滤
  5. 避免双击文件夹每次都打开一个新窗口
  6. 腾讯手游助手与 C/C++语言编译器发生的冲突
  7. 表格、表格CSS属性及HTML属性、表单元素、type类型、内联块的对齐方式
  8. 集显笔记本可不可以学计算机,说买电脑是为了学习,可你的笔记本选对了吗?...
  9. Python Excel中使用python代码
  10. 苹果手机没有声音怎么回事?3分钟解决!