灰度发布在网关层怎么做?Header、Weight 哪个更合适?同一个用户会不会一会儿新版一会儿旧版?lb:// 路由为什么返回 503?LoadBalancer 的权重是精确的吗?这篇在 Spring Cloud Gateway 5.0.3 与 LoadBalancer 上用两个版本的真实后端逐项统计。
canary 路由写在前面:不带头 → v1;X-Canary: true → v2;X-Canary: false → v1 default 路由写在前面:X-Canary: true → v1(canary 路由永远不会命中)
canary 路由要写在前面。
1000 次请求落到各版本的次数:{'v1': 794, 'v2': 206}
同一个用户(X-User: 1001)连续 20 次请求:11111221111111111111(v1 共 18 次、v2 共 2 次)接近比例但随机,同一用户会来回跳。
200 个用户里:每个用户 3 次请求结果都一致的 200 个;去 v2 的用户 40 个、去 v1 的 160 个
同一用户始终同版本。
只引入 gateway starter(没有 spring-cloud-starter-loadbalancer):GET /api/x → HTTP 503,响应体 {"path":"/api/x","status":503,"error":"Service Unavailable",}
加上 spring-cloud-starter-loadbalancer,不配权重(默认轮询)200 次:{'v1': 100, 'v2': 100}
weighted + weight 80/20,1000 次:{'v1': 800, 'v2': 200}lb:// 需要 loadbalancer starter;weighted 按 metadata.weight 精确分配。
只开 request-based-sticky-session:第一次请求的响应头里 Set-Cookie = 没有;不带 cookie 连续 20 次请求 {'v1': 10, 'v2': 10}
再加 sticky-session.add-service-instance-cookie=true:第一次请求的响应头里 Set-Cookie = 没有;不带 cookie 连续 20 次请求 {'v1': 10, 'v2': 10}sticky-session 配置在网关里没有看到 Set-Cookie。