SPI框架
1. 背景
在复杂分布式系统(尤其是大型微服务架构)中,普遍存在以下痛点:
- 差异化逻辑膨胀: 随着业务多元化发展(多租户、多地域、多场景),同一接口需支持大量差异化实现。
- 硬编码耦合严重: 传统
if-else或策略模式导致逻辑分支爆炸,代码臃肿、维护困难、扩展性差。 - 能力复用性低: 公共横切逻辑(如日志、风控、校验)难以优雅地嵌入不同业务主流程。
- 动态路由缺失: 缺少基于运行时上下文(如业务场景、多租户等)自动选择实现的机制。
传统 SPI的局限性:
- 只能加载所有实现,无法根据请求上下文动态选择。
- 不支持实现类的嵌套组合与能力增强。
- 缺乏统一的编排和生命周期管理。
本 SPI 框架的目标: 提供一套基于业务身份的动态路由与能力组合框架,实现业务逻辑的解耦、灵活编排与高效复用。
2. 核心能力
- 业务身份定义与识别:
- 支持在请求入口处定义并提取唯一标识业务场景的
Identity(如:tenantId + region + productType + userIdType)。 Identity是路由决策的核心依据。
- 支持在请求入口处定义并提取唯一标识业务场景的
- SPI 接口与实现声明:
- 提供标准方式定义业务接口 (
SpiInterface)。 - 实现类 (
SpiImpl) 通过注解声明,并关联其支持的Identity模式 (支持精确匹)。
- 提供标准方式定义业务接口 (
- 动态路由引擎:
- 核心功能:根据请求携带的
Identity,实时、精准地路由到对应的SpiImpl实例。 - 支持优先级、默认实现、匹配规则配置化(可动态更新)。
- 核心功能:根据请求携带的
- 垂直能力:
- 代表核心业务逻辑主干,是解决特定业务场景的主要实现 (
SpiImpl)。 - 每个
SpiImpl封装一个完整的、针对特定Identity的垂直业务解决方案。 - 示例:
PaymentService接口的AlipayCnPaymentImpl(支付宝国内支付)、CreditCardUsPaymentImpl(信用卡美国支付)。
- 代表核心业务逻辑主干,是解决特定业务场景的主要实现 (
- 水平能力:
- Product 代表可复用的、与核心业务正交的横切关注点能力。
- 示例: 营销活动、满减业务、风控检查、监控埋点等等。
- 能力自由编排:
- 核心创新点: 框架允许将一个垂直能力 (
SpiImpl) 与零个或多个水平能力按需编排组合。 - 编排定义:通过JSON配置指定某个
SpiImpl在执行前后自动应用哪些Product及其执行顺序(priority)。 - 效果: 在核心业务逻辑 (
SpiImpl) 基础上,透明地叠加增强功能 (Product),形成最终执行链。 - 优势:
- 复用性: 水平能力一次开发,多处复用。
- 解耦: 核心业务逻辑与横切逻辑分离,代码更清晰。
- 灵活性: 不同
Identity,可为同一SpiImpl动态配置不同的水平能力组合。 - 可维护性: 新增/修改横切逻辑只需调整编排配置,不影响核心业务代码。
- 核心创新点: 框架允许将一个垂直能力 (

- 核心模块:
- 业务身份(
Identity): 携带业务场景标识的上下文对象。 - SPI 注册中心: 管理
SpiInterface、SpiImpl及其与Identity规则的映射关系。 - 路由策略引擎: 根据
Identity和路由策略(精确、优先级)查找最匹配的SpiImpl。 - 能力仓库: 注册和管理所有可用的水平能力实现。
- 编排配置: 存储和管理
SpiImpl与product链的绑定关系及执行顺序(JSON)。 - 编排执行引擎: 负责构建并执行
SpiImpl+product链。采用责任链模式。 - 上下文(
BizSession): 在执行链中传递请求、响应、中间数据的统一上下文对象。
- 业务身份(
- 关键流程:
- 请求接入: 框架拦截器/入口解析请求,生成
Identity。 - 路由决策: 路由引擎根据
Identity查找匹配的SpiImpl。 - 能力链构建: 编排引擎根据配置,查找该
SpiImpl关联的product链及其顺序。 - 链式执行:
- 执行核心
SpiImpl.execute(ctx)方法(垂直能力)。 - 执行所有
Product.execute(ctx)方法(水平增强)。
- 执行核心
- 结果返回: 最终结果返回给调用方。
- 请求接入: 框架拦截器/入口解析请求,生成
4. 解决的典型场景
- 多租户 SaaS 平台:
- 场景: 不同租户(
tenantId)需要不同的计费策略、权限模型等。 - 方案:
Identity=tenantId- 定义
BillingService、`AuthService`` 等 SPI 接口。 - 为每个租户实现特定的
SpiImpl(如TenantABillingImpl)。 - 公共能力如
DataIsolationProduct(数据隔离)作为水平能力编排到租户的SpiImpl上。
- 场景: 不同租户(
- 全球化业务适配:
- 场景: 同一业务在不同地域(
region)需遵守不同法规、支付方式、语言。 - 方案:
Identity=region + language + currency- 定义
PaymentService、ComplianceService、NotificationServiceSPI 接口。 - 实现
EuPaymentImpl(支持 SEPA/信用卡)、UsPaymentImpl(支持 ACH/信用卡)、CnPaymentImpl(支持 支付宝/微信)。 - 水平能力
LocalizationProduct(本地化翻译)、CurrencyConvertProduct(货币转换)、LegalComplianceProduct(合规检查) 按地域编排到支付实现上。
- 场景: 同一业务在不同地域(
- 差异化营销策略:
- 场景: 针对不同用户等级(
userLevel)或渠道(channel)提供不同的优惠计算、积分发放规则。 - 方案:
Identity=userLevel + channel- 定义
DiscountStrategyService、PointsServiceSPI 接口。 - 实现
VipDiscountStrategy、AppChannelPointsImpl等。 - 水平能力
AntiCheatProduct(反作弊)、PromoBudgetProduct(预算控制)、RealTimeAnalysisProduct(实时效果分析) 编排到策略实现上。
- 场景: 针对不同用户等级(
小结: 本 SPI 框架通过 业务身份驱动动态路由 和 垂直能力 + 水平能力自由编排,有效解决了复杂业务系统中差异化逻辑管理、公共能力复用和灵活扩展的核心痛点,显著提升系统的可维护性、可扩展性和开发效率。

SPI框架
https://leenotes.cn/posts/48575.html