-
Notifications
You must be signed in to change notification settings - Fork 1.4k
如何执行全链路无编排高级蓝绿灰度发布
HaojunRen edited this page Aug 22, 2024
·
8 revisions
有少数公司希望蓝绿灰度发布尽量减少人工操作,降低运作成本,不愿意通过正规流程方式执行。在这里介绍一种固化式无编排高级蓝绿灰度发布
所谓固化式,即蓝绿灰度规则策略只配置一次后,永远不再变更
给服务实例分别打蓝
和绿
的版本标签,不需要通过时间戳方式或者数字递增方式
-Dmetadata.version=blue
-Dmetadata.version=green
技巧点之一
- 本次发布执行时,旧服务版本标签为
green
,新服务版本标签为blue
- 下次发布执行时,上次发布的新服务则变成旧服务(它的标记为
blue
),新上线的服务版本标签则为green
- 以后每次发布执行时,
green
和blue
的版本标签轮番交替使用,这次发布的新版本是blue
,下次发布的新版本是green
,再下次发布的新版本是blue
...
当业务参数a
等于1
的时候,执行蓝路由;当业务参数a
等于2
的时候,执行绿路由
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<strategy-release>
<conditions type="blue-green">
<condition id="condition-0" expression="#H['a'] == '1'" version-id="route-0"/>
<condition id="condition-1" expression="#H['a'] == '2'" version-id="route-1"/>
</conditions>
<routes>
<route id="route-0" type="version">blue</route>
<route id="route-1" type="version">green</route>
</routes>
</strategy-release>
</rule>
如果不希望蓝绿发布通过业务参数驱动,规则策略还可以进一步简化,实施过程更为简单
当<version>blue</version>
为blue
时切换到蓝路由,为green
时切换到绿路由
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<strategy>
<version>blue</version>
</strategy>
</rule>
当业务参数a
等于3
的时候,执行蓝路由占比10%,绿路由占比90%;当业务参数a
等于4
的时候,执行蓝路由占比90%,绿路由占比10%
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<strategy-release>
<conditions type="gray">
<condition id="condition-0" expression="#H['a'] == '3'" version-id="route-0=10;route-1=90"/>
<condition id="condition-1" expression="#H['a'] == '4'" version-id="route-0=90;route-1=10"/>
</conditions>
<routes>
<route id="route-0" type="version">blue</route>
<route id="route-1" type="version">green</route>
</routes>
</strategy-release>
</rule>
技巧点之二
- 蓝绿发布中
a
的值需要根据每次发布的而改变。这次发布a
等于1
执行的是新服务链路,下次发布a
等于2
执行的是新服务链路,再下次发布a
等于1
执行的是新服务链路... - 灰度发布中需要具备两条百分比相互颠倒的权重,例如,route-0=10;route-1=90和route-0=90;route-1=10。这次发布
a
等于3
执行的是新服务链路10%权重,下次发布a
等于4
执行的是新服务链路10%权重,再发布a
等于3
执行的是新服务链路10%权重... - 每次发布通过
a
值交替改变锚定正确的链路路由
如果不希望灰度发布通过业务参数驱动,规则策略还可以进一步简化,实施过程更为简单
蓝路由占比10%,绿路由占比90%
<?xml version="1.0" encoding="UTF-8"?>
<rule>
<strategy>
<version-weight>blue=10;green=90</version-weight>
</strategy>
</rule>
全链路网关和所有服务必须打开故障转移
# 启动和关闭版本故障转移。缺失则默认为false
spring.application.strategy.version.failover.enabled=true
技巧点之三
- 不允许配置兜底路由。兜底路由一般是对旧版本而言,现有规则策略逻辑下,哪条链路是旧版本路由是不确定的,那么执行发布时候,业务参数不能缺失且必须命中,因为无兜底路由存在
- 通过打开故障转移去兜底。假设,全链路为网关 -> 服务A -> 服务B -> 服务C,服务A和服务C要执行蓝绿灰度发布,服务B不需要。当整条链路切换到新版本路由时候,由于服务B不存在新版本,服务A调用服务B,服务A无法找到服务B的新版本,则故障转移到服务B的旧版本
- 不需要通过时间戳方式或者数字递增方式去打标签
- 不需要每次发布都要去修改规则策略
- 不需要指定具体要发布的服务列表
- 要牢记每次发布中版本标签切换的情况,即
green
和blue
分别代表是新版本路由还是旧版本路由 - 要牢记业务参数在每次发布驱动链路的情况,即发布中,业务参数不能缺失且必须命中,发布后,业务参数必须缺失
- 要牢记打开故障转移
2017-2050 ©Nepxion Studio Apache License
- 如何对接Foundation基础平台实施收敛集成
- 如何对接DevOps运维平台实施流量管控
- 如何部署对接DevOps运维平台的控制台
- 如何对接DevOps运维平台执行半自动化蓝绿灰度发布
- 如何使用DevOps运维平台对接的公共接口
- 如何设计全链路智能编排高级蓝绿灰度发布界面
- 如何实现Windows10下GraalVM本地镜像化
- 蓝绿灰度发布
- 流量染色
- 隔离路由
- 故障转移
- 多活单元化
- 限流熔断降级权限
- 网关动态路由
- 可观测监控
- 如何操作配置中心
- 如何理解框架开关配置
- 如何理解规则策略里内容格式配置
- 如何操作网关和服务的蓝绿灰度发布规则策略配置
- 如何操作网关动态路由规则策略配置
- 如何操作Sentinel规则策略配置
- 如何实施规则策略配置和业务配置在配置中心的合并和分离
- 如何理解自动扫描目录
- 如何自定义流量管控
- 如何自定义实现组合式的防护
- 如何自定义高级配置订阅功能
- 如何自定义订阅框架事件
- 如何自定义解决业务自身跨线程上下文切换的问题
- 如何自定义重用框架内置的Swagger模块
- 如何自定义Header全链路传递
- 如何遵循Nepxion Discovery网关标准实现对其它网关全链路流量管控的二次开发
- 如何遵循Nepxion Discovery服务标准实现对消息队列等其它中间件全链路流量管控的二次开发