应用可以通过使用路由管理,来进行灰度发布实现版本的平滑过渡升级。路由管理通过动态配置下发完成。
使用路由管理,需要在项目中引入如下依赖:
<dependency> <groupId>org.apache.servicecomb</groupId> <artifactId>handler-router</artifactId> </dependency>
在配置文件中增加配置项:
前提条件:配置servicecomb.handler.chain.Consumer.default,在处理链Consumer中配置loadbalance,loadbalance处理链介绍。
配置项名 | 描述 |
---|---|
servicecomb.routeRule.[targetService] | 目标服务的路由管理规则 |
servicecomb.routeRule.type | 填写‘router’ |
路由管理规则实例如下:
servicecomb: routeRule: provider: | #服务名 - precedence: 2 #优先级 match: #匹配策略 headers: #header匹配 region: regex: 'regoin[0-9]*' caseInsensitive: false # 是否区分大小写,默认为false,区分大小写 type: exact: gray route: #路由规则 - weight: 100 #权重值 tags: version: {version1} app: {appId} - precedence: 1 route: - weight: 20 tags: version: 0.01 tags: tag - weight: 80 tags: version: 0.02
对于上面的示例配置,所有访问provider服务的请求,首先尝试与优先级为2的第一个的match规则进行匹配header:header存在key为region的按照正则规则区分大小写匹配,存在key为type的进行字符串精准匹配。若匹配match成功则按照route的配置分配100%的流量到version和tags对应的实例。若匹配match失败则进入下个优先级为1的规则。不同规则优先级不能相等。
如果因为规则配置错误,或者没有match到任何一条规则,流量会直接跳过灰度规则,相当于没有灰度发布配置。
如果已经匹配了match,因为对应的version或者tags找不到实例,则剩余流量自动转发到目前的最新版本。
借鉴了nginx,使用平滑加权轮询算法,流量会均匀的等比分配到对应的服务实例上。