

严选原有的网关路由机制,无法做到动态路由 原有部署模式下,分支和集群环境捆绑,多需求并行时,环境争抢严重 环境隔离依靠物理(集群)隔离,实例扩容成本和申请配置链路较长 C端的每套测试环境均配置对应Nginx及API网关配置,配置维护及不同测试环境依赖Host配置切换较麻烦 ...
2. 目标
建立稳定的研发环境 通过制定统一的域名规范,减少多套环境对应的Nginx、API网关、WZP、link、Locate等配置依赖成本,摆脱Host配置切换,测试环境新增一套特征环境无需重复申请,追求零配置 建立稳定的基准测试环境,提升测试环境的稳定性及可用性,建立起开发、联调、测试特征环境、测试回归等不同环境的访问规范。 建设合理的研发流程 服务发现支持动态路由,摆脱原多集群进行环境物理隔离机制,不同环境的访问切换不需要更改consul域名,支持跨集群的路由转发。 研发协作平台实现一键化环境隔离部署能力 降低问题排查成本 实现消息隔离,让消息不再被乱消费
3. 实现方案

3.1 核心机制
3.2 环境染色的作用域
第一阶段仅实现对Http(s)及客户端WZP请求的染色 MPS(严选消息发布订阅系统)支持染色,实现消息消费隔离 染色仅作用于测试环境,回归测试环境(回归环境仅单集群无环境隔离必要)不在染色范围内
3.3 环境染色的定位
3.4 线下测试环境规范

4. 分层实现
4.1 实例绑定染色标签

4.2 染色域名规划

4.2.1 染色标签设置注意事项
染色集群限制
强烈不建议在默认测试集群的实例下打染色标,会导致无色节点请求与染色请求出现环境交叉,与环境隔离的目标相违背。染色标签命名规则限制
染色标签的命名及取值既要具有一定的前瞻性,又要注意合法字符的范围,要求同时遵照DNS+CMDB Cluster+Consul Tag+K8S NS/Label规范及最佳实践,一律小写,避免使用非法字符或敏感字符,如不能包含小数点(域名非法字符)。如合法字符范围:[A-Za-z0-9-]*,本次设置X-YX-COLOR作为染色标签染色标签取值限制 consul 环境不可作为color值,如test、regression、online、dev、release、pressure 集群编码不可作为color值,防止环境交叉 系统特殊字段,如权重字段weight=xx,系统保留字段_yxgw
4.3 网关解析染色域名
4.4 染色标签在服务间透传
严选链路追踪中间件底层应用CaesarAgent 具备分布式全链路追踪(Tracing)能力,请求流量标识可以实现不同服务节点/消息中间件之间透传。
4.5 路由转发
4.5.1 路由转发图

4.5.2 具体逻辑
对于无色请求(请求Headers中不携带X-YX-COLOR),将会在当前集群中查找所有可转发节点,包括有色节点(存在多个符合条件的实例则按权重比例分流) ——前面搭建特征环境中提到,染色实例强烈建议不要与默认测试环境(无色实例)在同一集群下,因为若是在同一集群下,无色请求也可能被转发到有色实例下,这样的话做不到环境的完全隔离 对于有色请求(请求Headers中携带X-YX-COLOR),优先会在所有集群中寻找带颜色标记的可选转发节(存在多个则按权重比例分流);若没有一个实例符合要求,则会在当前集群中查找无色实例作为可转发节点;若当前集群并没有无色节点则路由失败,返回502
4.5.3 染色最小范围原则

red、blue:实例所打颜色 nocolor:实例不带颜色时所需要打的标签,与颜色实例作区分,作为流量的兜底。
如流量为green时,当前集群或其他集群 不存在该颜色实例时,会命中当前集群中的nocolor实例 如流量为green时,当前集群或其他集群 存在该颜色实例时,不会命中当前集群中nocolor实例 如流量不带颜色header时,会命中当前集群中任意一个实例(包括nocolor实例 或 其他颜色实例)
4.5.4 关于非健康实例
4.6 消息的隔离机制
4.7 移动端wzp染色机制实现
4.7.1 原通信模式

4.7.2 WZP染色方案
价值

4.8 天枢测试环境隔离
部署时直接关联染色标签 
实例与染色标签关联 
分支上线后自动解除染色标签
分支合并到上线分支并上线后会天枢自动解除分支部署实例关联的染色标签,实例变为特征环境集群的无色节点,用于下次特征环境的需求使用
4.9 异步线程染色机制
4.9.1 显示透传染色标签
第一步:业务方引用yanxuan-trace-client(apm相关jar) <dependency><groupId>com.netease.yanxuan</groupId><artifactId>yanxuan-tracer-client</artifactId><version>${tracer.client.version}</version></dependency>第二步:显示获取染色参数并使用(建议以Spring AOP等方式做显示染色,减少对业务代码的侵入),Code demo:
// 判断当前环境为测试环境且染色参数不为空if (systemEnvironmentConfig.isTestEnvironment() && StringUtils.isNotBlank(TracerClient.getTagItem("x-yx-color"))) {// 取出染色值String color = TracerClient.getTagItem("x-yx-color");// Todo}// 非测试染色请求else {// Todo}
5. 未来规划
客户端染色能力一统(app各协议请求依赖app颜色标签进行多环境切换隔离)
客户端测试脱离内网及测试wifi依赖,app内置多套host配置进行线上、预发、回归、测试等网关环境的切换
定时任务染色能力打通
6. 总结及感谢


文章转载自严选技术产品团队,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




