多态是网关层实现运行时策略切换的底层支撑,核心在于通过统一接口(如routestrategy)、工厂+配置中心驱动、无状态策略类及服务发现动态定位,彻底摆脱硬编码与伪多态。

多态不是让代码看起来更“高级”的装饰,而是让网关层真正具备运行时策略切换能力的底层支撑。关键不在于写多少抽象类,而在于把路由决策从硬编码逻辑里解放出来,交由接口契约和运行时注入驱动。
定义统一策略接口,剥离判断逻辑
所有路由策略必须实现同一个接口,比如 RouteStrategy,只暴露核心方法如 shouldRoute(RequestContext ctx) 和 selectServiceId(RequestContext ctx)。接口里不能出现 if (channel == "alipay") 这类分支,也不能暴露渠道名、版本号、环境标识等用于条件判断的字段——这些信息应作为上下文参数传入,由具体实现类内部解析。
- 微信支付路由策略:WechatRouteStrategy,根据请求头
X-Pay-Channel和用户等级决定是否走灰度集群 - AB测试路由策略:AbTestRouteStrategy,读取配置中心的流量比例,按请求ID哈希分流
- 故障转移策略:FallbackRouteStrategy,在主服务健康检查失败时自动切到备用实例组
用工厂+配置中心驱动运行时加载
网关不靠 @Autowired List<routestrategy></routestrategy> 然后遍历匹配,而是通过策略工厂(RouteStrategyFactory)按需获取实例。工厂内部查配置中心(如 Nacos)的 gateway.route.strategy 配置项,拿到当前生效的策略标识(如 ab-test-v2),再根据标识返回对应 Bean。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- Spring 中禁用
@Qualifier("ab-test-v2")这种静态绑定,改用ObjectProvider<routestrategy></routestrategy>或自定义ApplicationContext.getBean("ab-test-v2-route-strategy") - 配置变更时,Nacos 发送通知,工厂清空缓存并重建策略实例;新请求立即使用新策略,旧长连接继续走原策略,自然完成平滑过渡
- 策略类本身保持无状态,所有可变参数(如权重、阈值、服务名)全部从配置中心或 RequestContext 中实时读取
配合服务发现完成动态目标定位
策略选中的是逻辑目标(如 “高优先级订单服务”),而不是固定 IP 或域名。最终路由地址由服务发现组件(Nacos/Eureka)解析得出:
-
selectServiceId()返回的是服务 ID(如order-service-prod),不是 URL - 网关调用时使用
lb://order-service-prod格式,由 Spring Cloud LoadBalancer 自动负载均衡到可用实例 - 新增一个灰度服务
order-service-canary?只需在 Nacos 注册该服务 + 更新策略配置里的 service-id,网关代码完全不动
规避伪多态,守住三条边界
很多项目看似用了多态,实则仍是 if-else 套壳。真落地要守住底线:
-
接口无状态:RouteStrategy 接口不能带
getChannel()或getVersion()方法,否则调用方又得先判断再取策略 -
注入不由代码控制:禁止在 Controller 或 Filter 里写
if (env == "prod") return prodStrategy;,一切路由决策必须收口到工厂和配置 - 元数据外置:策略启用开关、权重、降级阈值、服务映射关系,全部存在配置中心,不在代码里写死,也不用注解硬编码










