简介
很高兴为大家分享多环境构建方案,本方案是基于skywalking k8s 实现,可以实现公司原有系统零改动,同时引入了环境生命周期概念,即环境与需求绑定,按需求构建发布应用,需求上线后环境进行自动回收,最终实现的部署结构与原部署结果对比如下
为什么需要多环境
随着业务复杂度提升,需求迭代的加快,经常会出现开发及测试环境不够用的场景,导致频繁的代码合并和部署,测试断断续续,无法提供沉浸式的测试体验,严重影响测试进度,与此同时,维护多套测试环境又增加了运维成本和资源使用成本
多环境重要概念
基础环境:基础环境是一套完整的部署了所有应用的环境,基础环境作用,当用户的请求带有环境标识的时候存在对应标识的环境那么会路由到带有标识的环境如果不存在那么会路由到基础环境,可以理解为环境兜底
应用标记:把应用分为基础环境应用和多环境应用,通过在应用发布阶段动态注入环境标记
流量染色:在发起请求时通过指定http header 的方式设置特定标识,这个标识在调用链路中一直传递下去
系统交互
实现方案
目标
1. 根据需求构建环境,只需要构建需求中关联变更的应用
2. 应用侵入低,更多的由应用框架和中间件来感知和实现
3. 使用方便快捷,资源成本低
方案基于 spring cloud rocket mq skywalking k8s xxl job
组件设计
网关
整体设计实现说明,用户在访问接口的时候传入http header 在请求到达网关的时候进行拦截并和解析, 整个过程通过扩展skywalking tomcat plugin 进行实现,在解析出tag后把tag值写入到skywalking 传输协议中使其可以向下传递,在网关向后转发过程中ip的选取很重要一定要确保转发到正确环境的IP上,关于向后转发ip的选取设计 可以看RPC 组件设计
Redis
整体设计说明,Redis 的设计方案充分考虑了多个环境之间缓存隔离和共享两种场景,缓存隔离很好理解不同的环境如果不进行隔离的话可能会相互干扰所以需要隔离,但是为什么还要支持共享呢,是因为一些类似三方token 或者登录账号存在共用情况,整个过程通过扩展skywalking lettce redisson 插件实现 整体思路是,根据扩展协议传过来的tag生成 Redis 的 key 前缀实现多环境间的隔离,至于共享场景通过提供白名单实现,其实就是让用户去设置key名称
MQ
整体设计说明,MQ 的设计及实现稍显复杂,因为MQ 纯异步以及生产者与消费者完全松耦合的特性,我们需要确保流量一旦被识别为多环境流量,那么他的任意一个应用任意一个消费者如果存在多环境那么就让多环境消费如果不存在就让基础环境消费。生产者:采用javaagent 形式添加MQ 消息发送拦截器,根据染色流量动态解析并添加tag
生产者:
1、如果请求在入口被识别成灰度请求,则该消息会被标记成灰度消息。
2、如果节点本身属于灰度节点,且开启了流量染色,则该消息会被标记为灰度消息。
3、入口处请求没有被识别成灰度流量,但消息本身的 payload 属于灰度流量,则该消息也会被标记成灰度消息。
消息生产者在生产的时候,通过在 tag 中加上多环境信息附带在消息体中。
消费者:
1、监听Nacos 注册中心应用注册的变化,动态调整Rocket mq client 订阅的tag 实现根据环境动态订阅消费消息tag
2、根据环境隔离配置动态创建rocket mq group
RPC
整体设计说明,应用启动后注册ip的同时注册环境,即扩展注册meta 加入变量标识,次标识即为http 请求访问传递的tag
1、服务调用者采用扩展skywalking javaagent 形式拦截RPC调用根据nacos meta tag 进行调用ip 过滤。
2、服务提供者采用扩展skywalking javaagent 形式将服务注入注册中心同时携带发布阶段标记的环境信息
定时任务
通过自研路由策略,同时扩展skywalking agent 上报环境的形式告知xxl-job 环境和ip 的关系 在任务进行调度的时候使其找到正确的环境ip
数据同步
通过扩展skywalking javaagent 添加sql 注释 实现环境传递,从而实现数据路由
监控
由于本方案是基于skywalking 所以对于上面所有组件都提供了在skywalking 监控台查看的能力,可以在任意skywalking span 中查看对应的环境tag,方便排查问题,同时提供了根据环境tag 搜索的功能,使其可以更快速的定位问题
k8s hook
通过k8s admission hook 形式对发布的pod 进行拦截实现agent 动态挂载和多环境变量注入,同时修改skywalking app name,实现监控名称重写,使其在skywalking 控制台中更直观的展示环境和应用的关系
总结
到了这里基于skywalking 的多环境分享差不多就结束了,由于公司技术历史包袱的原因,导致我们的环境相对复杂,从接手环境治理到取得阶段性结果,期间遇到很多环境问题,也走了不少弯路,现在分享出来希望对大家有帮助。环境抢占问题在大多数公司都是一个头痛的问题,希望本篇文章对各位看官有用,谢谢。