用受检异常显式定义渠道失败语义,结合策略模式封装容错行为,实现编译期可扩展与运行期热插拔的分层容错体系。
直接用受检异常 + 策略模式构建“可无限扩展的渠道容错层”,核心不在语法技巧,而在分层解耦与错误语义显式化。它不是让代码更“java”,而是让失败路径可识别、可路由、可插拔。
用受检异常定义渠道失败的业务语义
避免泛泛抛出 Exception 或 RuntimeException。为每个渠道失败场景定义专属受检异常,把“为什么失败”编译进类型系统:
-
ChannelTimeoutException:网关超时,适合重试或降级 -
ChannelAuthFailureException:鉴权失败,需人工介入或刷新凭证 -
ChannelRateLimitException:限流触发,应退避并记录配额消耗 -
ChannelDataCorruptionException:响应解析失败,说明协议不一致,需版本对齐
这些异常继承自统一基类(如 ChannelFailureException),既保持类型安全,又支持上层统一捕获和分发。
策略模式承载渠道行为与容错动作的绑定
每个渠道(微信支付、支付宝、银联)不再硬编码在 if-else 或 switch 中,而是实现一个 ChannelStrategy 接口:
-
execute(request):执行主流程,明确声明抛出哪些受检异常 -
fallback(request, cause):根据异常类型决定降级逻辑(返回缓存、走备用通道、兜底文案) -
shouldRetry(cause):判断是否重试(例如只对超时重试,不对鉴权失败重试) -
getRetryDelay(cause):返回指数退避间隔
新增渠道只需新增一个策略实现类,无需修改调度器——这就是“无限扩展”的实质:扩展 = 新增类,而非修改已有分支逻辑。
容错调度器统一编排失败处理流
写一个通用调度器(如 ChannelExecutor),接收请求和策略,按标准流程执行:
- 调用
strategy.execute(),捕获其声明的所有受检异常 - 依据异常类型匹配预注册的处理器(如
TimeoutHandler、AuthHandler) - 调用对应策略的
shouldRetry()和fallback(),自动完成重试/降级/熔断决策 - 全程记录异常分类、重试次数、最终结果,用于后续监控与策略调优
这个调度器本身不关心渠道细节,只依赖策略接口和异常契约——它就是你容错层的“中央控制器”。
配合注册中心实现运行时策略热插拔
把策略实现类注册到 Spring 的 Map<string channelstrategy></string> 或轻量注册中心(如 Redis Hash)。渠道开关、灰度比例、降级开关均可通过配置动态调整:
- 配置
channel.wxpay.enabled=false→ 调度器跳过该策略 - 配置
channel.alipay.fallback=mock→ 自动注入 MockStrategy - 异常统计达阈值 → 自动触发
CircuitBreakerStrategy替换原策略
此时,“无限扩展”不仅指编译期加类,也包括运行期加载、替换、组合策略——真正支撑渠道快速接入与故障隔离。
不复杂但容易忽略:受检异常强制调用方面对失败,策略模式把“怎么做”封装起来,二者结合,就把“渠道容错”从一堆 if-else 的防御性编码,变成了可演进、可审计、可配置的领域能力。










