发布本身不是难点,难点是新版本有问题时能在多大范围快速止损。滚动发布逐个替换实例,回滚要数十分钟,这段时间全部用户都在受影响面。蓝绿和灰度解决的都是这件事:把”回滚”换成”切流”,把止损时间从重建实例的量级压缩到改一次路由配置的量级。 蓝绿与灰度的差异 蓝绿部署维护两套完整环境。当前流量全走绿环境,新版本部署到蓝环境完成自检验证,通过后一次性从绿切到蓝,原绿环境保留一段时间作为回滚目标——回退就是再切回去。 优点直接:切换瞬间完成,回滚也瞬间,不存在”部分实例是新版本”的中间状态。缺点同样直接:要一倍资源冗余,含数据库在内的整套链路要么共享要么同步,成本实打实。 灰度发布(金丝雀)不是一刀切,而是让新版本先承接一小部分流量,观察指标后逐步放量到 100%。资源占用接近常态,能做到渐进验证,代价是放量周期长,且存在新旧版本并行的窗口,这段时间内两套代码都在处理真实请求。 维度 蓝绿 灰度 资源占用 双倍 接近常态 切换速度 一次性全切 分阶段放量 回滚 切回另一套环境 把权重调回 0 适用 版本差异大、强一致要求 常规迭代、需要观察用户行为 选择依据是变化的风险和资源的余量。基础设施层的重大变更(数据库版本、中间件升级)倾向于蓝绿;日常业务迭代倾向于灰度。实际中也常见组合:先用灰度在小范围验证,确认无误后再一次性切全量,此时的”切全量”在效果上等同于蓝绿。 流量切分的依据 放量的第一步是把哪些请求路由到新版本。常见的四种依据各有适用场景: 按权重。最简单,随机把 5% 请求打到新版本。适合验证性能与稳定性,不适合有状态体验——同一用户两次请求落到不同版本,表现可能不一致。 按用户 ID 哈希。对用户标识取哈希后按数值区间分配,同一用户稳定命中同一版本。代价是新版本必须兼容旧版本的数据。 # 对用户标识做哈希,稳定命中同一版本 split_clients "${cookie_uid}${remote_addr}" $canary { 5% "canary"; * "stable"; } 实际参数化时通常用整数区间而不是字符串前缀,方便在不改文法的情况下调整比例: hash(user_id) % 100 < 5 -> 灰度组(可调 5、10、20、50、100) 按…










