核心是用多态实现可插拔分流:定义统一routehandler接口,各策略类独立实现canhandle/handle,调度器遍历注册表执行首个匹配规则,新增策略只需加类+注解,主干零修改。

核心是把“该走哪条路”交给对象自己决定,而不是在业务主干里写一堆 if-else 判断类型再分发。多态在这里不是炫技,而是让分流逻辑可插拔、可监控、可独立演进。
定义统一的分流行为接口
所有分流规则必须实现同一个接口,比如 RouteHandler,只暴露一个关键方法:
- boolean canHandle(RouteContext context):判断当前请求是否归本规则处理
- void handle(RouteContext context):真正执行路由动作(如转发到A集群、打标为灰度、降级返回mock)
输入参数用通用上下文类封装全部可能字段(如 userLevel、bizType、region、isPreload),不硬编码字段名,避免接口随业务膨胀。接口保持稳定,新增规则不改它。
每个分流场景封装为独立实现类
每种业务分流策略对应一个具体类,各自实现判断和执行逻辑:
- VipTrafficRouter:查用户等级缓存 + 实时VIP白名单配置,命中则走高优通道
- RegionAwareRouter:解析客户端IP归属地,匹配就近机房节点列表
- CanaryTrafficRouter:读取发布系统开关 + 请求header中的canary-id,按比例放行
- FallbackRouter:检测下游服务健康度(熔断器状态 + 超时率),触发时自动切到兜底逻辑
每个类内部完成全部细节——查配置中心、调远程健康检查、打日志、埋点耗时,对外只暴露“能不能接”和“怎么接”两个契约。
用注册表+统一调度器驱动分流
调度器本身不写任何 if/else 或 switch:
- 启动时扫描所有 @Component 的 RouteHandler 实现类,按优先级或名称注册进 Map
- 执行时遍历注册表,依次调用 canHandle(context),首个返回 true 的 handler 执行 handle(context)
- 支持组合逻辑:CompositeRouter 也实现 RouteHandler,内部按顺序委托子规则,便于构建“先看VIP、再看地域、最后看灰度”的链式策略
日志、超时统计、失败原因统一在 canHandle() 和 handle() 入口埋点,方便横向对比各分流策略的命中率与性能。
保障运行时多态真正生效
写了 implements 不等于就多态了,必须守住几条线:
- 调度器持有的引用类型必须是 RouteHandler,不能声明为具体子类(如不能写 VipTrafficRouter r = ...)
- canHandle() 和 handle() 方法不能是 static、private 或 final
- 子类必须真正重写方法,签名(含返回值、参数类型、异常)完全一致
- 避免同名不同包的 RouteHandler 实现类混入 classpath,否则 Spring 可能加载错实例
这样建模后,加一条新分流规则,只需写一个类、加个 @Component、配个启用开关,主干调度代码一行不动。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











