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
、NotificationService
SPI 接口。 - 实现
EuPaymentImpl
(支持 SEPA/信用卡)、UsPaymentImpl
(支持 ACH/信用卡)、CnPaymentImpl
(支持 支付宝/微信)。 - 水平能力
LocalizationProduct
(本地化翻译)、CurrencyConvertProduct
(货币转换)、LegalComplianceProduct
(合规检查) 按地域编排到支付实现上。
- 场景: 同一业务在不同地域(
- 差异化营销策略:
- 场景: 针对不同用户等级(
userLevel
)或渠道(channel
)提供不同的优惠计算、积分发放规则。 - 方案:
Identity
=userLevel + channel
- 定义
DiscountStrategyService
、PointsService
SPI 接口。 - 实现
VipDiscountStrategy
、AppChannelPointsImpl
等。 - 水平能力
AntiCheatProduct
(反作弊)、PromoBudgetProduct
(预算控制)、RealTimeAnalysisProduct
(实时效果分析) 编排到策略实现上。
- 场景: 针对不同用户等级(
小结: 本 SPI 框架通过 业务身份
驱动动态路由
和 垂直能力
+ 水平能力
自由编排,有效解决了复杂业务系统中差异化逻辑管理、公共能力复用和灵活扩展的核心痛点,显著提升系统的可维护性、可扩展性和开发效率。