连载中 11/20

网关实战:动态路由与灰度发布

2026-08-27 · 1165 阅读 · 0 评论 · 0 赞

新上一个服务,全网关都重启

路由写在网关的 application.yml 里,每上一个新服务、每改一条转发规则,都要改配置、提发版、重启网关。网关是全站入口,重启一次全站抖一下,发布窗口越来越难约。路由规则的变更频率,本该是分钟级;而网关的重启频率,应该是月级——中间的差距,靠动态路由抹平。

动态路由的三种做法

三条路线各有脾气:配置中心驱动——路由定义放 Nacos,监听变更热刷新,实现简单、天然有版本与灰度能力;数据库驱动——路由表入库加管理界面,运营也能改,但要自己做校验与缓存同步;注册中心自动映射——按服务名自动生成路由,零配置,但规则表达力弱。多数团队的答案:配置中心为主,复杂路由辅以数据库。

@Component
public class DynamicRouteListener {

    // 监听配置中心 gateway-routes 数据变更
    public void onRouteChange(String newRoutes) {
        List<RouteDefinition> defs = parse(newRoutes);
        validate(defs);                                    // 先校验,坏配置拒收
        inMemoryRepository.save(defs);                     // 更新内存路由定义
        publisher.publishEvent(new RefreshRoutesEvent(this)); // 通知重建路由
    }
}
// 校验这一步不能省:一条坏路由,可以挂掉整个网关

两个必须做的防护:变更校验——坏配置拒收,路由解析失败不能影响存量路由;变更审计——谁改的、改了什么、何时生效,全部留痕。动态生效的另一面是坏配置也动态生效,闸门要在写入前。

灰度发布:按什么分流

灰度的本质:让一部分请求走新版本,其余走旧版本,出问题影响面可控。分流依据按精度递进:按权重——随机 5% 走新版,适合验证基本功能;按用户——内部账号或白名单用户先体验,适合内部试用;按维度——特定地域、特定 App 版本,适合放量验证。实现上通常两层配合:网关按 Header/权重决定打给哪组实例,实例分组靠注册中心元数据(version: gray)标记。

// 网关灰度断言:Header 带 gray=true 的请求走灰度实例
.uri("lb://order-service")
.predicates(p -> p.header("X-Gray", "true"))
.filters(f -> f.setProperty("version", "gray"))

// 注册中心元数据分组
spring.cloud.nacos.discovery.metadata.version=gray

灰度链路的完整性

只灰度第一跳是最常见的半成品:请求打到了灰度订单服务,订单再调库存——库存还是旧版,新旧数据格式一冲突就翻车。灰度标签必须沿着调用链全链路透传:网关打标,Feign 拦截器带着标签调下游,下游按标签选同版本实例;走消息队列的链路要把标签放进消息头。漏一跳,灰度就变成了"薛定谔的版本"——出问题时你都不知道用户走的哪版。

灰度观察期看三个指标:错误率、P99 延迟、核心业务指标,异常立即切回。网关这块收尾了,接下来进入观测篇:一次调用穿过八个服务,问题到底出在哪一跳。

☕
503

10 年全栈工程师 · 503咖啡馆主理人

#动态路由#灰度发布#网关实战#配置中心#灰度标签

评论 (0)

热门推荐

连载中 11/22

主从搭建实操:从零配出一主两从

光讲原理不过瘾?手把手搭一主两从:my.cnf 六个参数、复制账号、GTID、CHANGE REPLICATION SOURCE TO、SHOW REPLICA STATUS 验收,附翻车排查清单。

#MySQL#主从复制#GTID#主从搭建#高可用
2026-05-07 · 10101 阅读 · 0 评论 · 0 赞
连载中 16/22

连接池:HikariCP 参数与连接风暴

连接池不是越大越好:8 核机器配 1000 连接反而更慢的数学原理,HikariCP 四个必调参数,maxLifetime 与 wait_timeout 的隐形陷阱。

#MySQL#连接池#HikariCP#maxLifetime#连接风暴
2026-05-10 · 9873 阅读 · 0 评论 · 0 赞
连载中 4/16

缓存穿透:恶意 ID 打穿 MySQL 的四道防线

请求的数据在缓存和数据库里都不存在时,缓存形同虚设。聊聊参数校验、空值缓存、布隆过滤器、限流熔断四道防线的原理与组合打法。

#Redis#缓存穿透#布隆过滤器#高可用
2026-05-16 · 9294 阅读 · 21 评论 · 287 赞