SPI框架

1. 背景

在复杂分布式系统(尤其是大型微服务架构)中,普遍存在以下痛点:

  • 差异化逻辑膨胀: 随着业务多元化发展(多租户、多地域、多场景),同一接口需支持大量差异化实现。
  • 硬编码耦合严重: 传统 if-else 或策略模式导致逻辑分支爆炸,代码臃肿、维护困难、扩展性差。
  • 能力复用性低: 公共横切逻辑(如日志、风控、校验)难以优雅地嵌入不同业务主流程。
  • 动态路由缺失: 缺少基于运行时上下文(如业务场景、多租户等)自动选择实现的机制。

传统 SPI的局限性:

  • 只能加载所有实现,无法根据请求上下文动态选择。
  • 不支持实现类的嵌套组合与能力增强。
  • 缺乏统一的编排和生命周期管理。

本 SPI 框架的目标: 提供一套基于业务身份的动态路由与能力组合框架,实现业务逻辑的解耦灵活编排高效复用


2. 核心能力

  1. 业务身份定义与识别:
    • 支持在请求入口处定义并提取唯一标识业务场景的 Identity (如:tenantId + region + productType + userIdType)。
    • Identity 是路由决策的核心依据。
  2. SPI 接口与实现声明:
    • 提供标准方式定义业务接口 (SpiInterface)。
    • 实现类 (SpiImpl) 通过注解声明,并关联其支持的 Identity 模式 (支持精确匹)。
  3. 动态路由引擎:
    • 核心功能:根据请求携带的 Identity实时、精准地路由到对应的 SpiImpl 实例。
    • 支持优先级、默认实现、匹配规则配置化(可动态更新)。
  4. 垂直能力:
    • 代表核心业务逻辑主干,是解决特定业务场景的主要实现 (SpiImpl)。
    • 每个 SpiImpl 封装一个完整的、针对特定 Identity 的垂直业务解决方案。
    • 示例: PaymentService 接口的 AlipayCnPaymentImpl (支付宝国内支付)、 CreditCardUsPaymentImpl (信用卡美国支付)。
  5. 水平能力:
    • Product 代表可复用的、与核心业务正交的横切关注点能力
    • 示例: 营销活动、满减业务、风控检查、监控埋点等等。
  6. 能力自由编排:
    • 核心创新点: 框架允许将一个垂直能力 (SpiImpl) 与零个或多个水平能力按需编排组合。
    • 编排定义:通过JSON配置指定某个 SpiImpl 在执行前后自动应用哪些 Product 及其执行顺序(priority)。
    • 效果: 在核心业务逻辑 (SpiImpl) 基础上,透明地叠加增强功能 (Product),形成最终执行链。
    • 优势:
      • 复用性: 水平能力一次开发,多处复用。
      • 解耦: 核心业务逻辑与横切逻辑分离,代码更清晰。
      • 灵活性: 不同 Identity,可为同一 SpiImpl 动态配置不同的水平能力组合。
      • 可维护性: 新增/修改横切逻辑只需调整编排配置,不影响核心业务代码。

  • 核心模块:
    • 业务身份(Identity): 携带业务场景标识的上下文对象。
    • SPI 注册中心: 管理 SpiInterfaceSpiImpl 及其与 Identity 规则的映射关系。
    • 路由策略引擎: 根据 Identity 和路由策略(精确、优先级)查找最匹配的 SpiImpl
    • 能力仓库: 注册和管理所有可用的水平能力实现。
    • 编排配置: 存储和管理 SpiImplproduct 链的绑定关系及执行顺序(JSON)。
    • 编排执行引擎: 负责构建并执行 SpiImpl + product 链。采用责任链模式。
    • 上下文(BizSession): 在执行链中传递请求、响应、中间数据的统一上下文对象。
  • 关键流程:
    1. 请求接入: 框架拦截器/入口解析请求,生成 Identity
    2. 路由决策: 路由引擎根据 Identity 查找匹配的 SpiImpl
    3. 能力链构建: 编排引擎根据配置,查找该 SpiImpl 关联的 product 链及其顺序。
    4. 链式执行:
      • 执行核心 SpiImpl.execute(ctx) 方法(垂直能力)。
      • 执行所有 Product.execute(ctx) 方法(水平增强)。
    5. 结果返回: 最终结果返回给调用方。

4. 解决的典型场景

  1. 多租户 SaaS 平台:
    • 场景: 不同租户(tenantId)需要不同的计费策略、权限模型等。
    • 方案:
      • Identity = tenantId
      • 定义 BillingService、`AuthService`` 等 SPI 接口。
      • 为每个租户实现特定的 SpiImpl (如 TenantABillingImpl)。
      • 公共能力如 DataIsolationProduct(数据隔离)作为水平能力编排到租户的 SpiImpl 上。
  2. 全球化业务适配:
    • 场景: 同一业务在不同地域(region)需遵守不同法规、支付方式、语言。
    • 方案:
      • Identity = region + language + currency
      • 定义 PaymentServiceComplianceServiceNotificationService SPI 接口。
      • 实现 EuPaymentImpl (支持 SEPA/信用卡)、UsPaymentImpl (支持 ACH/信用卡)、CnPaymentImpl (支持 支付宝/微信)。
      • 水平能力 LocalizationProduct (本地化翻译)、CurrencyConvertProduct (货币转换)、LegalComplianceProduct (合规检查) 按地域编排到支付实现上。
  3. 差异化营销策略:
    • 场景: 针对不同用户等级(userLevel)或渠道(channel)提供不同的优惠计算、积分发放规则。
    • 方案:
      • Identity = userLevel + channel
      • 定义 DiscountStrategyServicePointsService SPI 接口。
      • 实现 VipDiscountStrategyAppChannelPointsImpl 等。
      • 水平能力 AntiCheatProduct (反作弊)、PromoBudgetProduct (预算控制)、RealTimeAnalysisProduct(实时效果分析) 编排到策略实现上。

小结: 本 SPI 框架通过 业务身份驱动动态路由垂直能力 + 水平能力自由编排,有效解决了复杂业务系统中差异化逻辑管理公共能力复用灵活扩展的核心痛点,显著提升系统的可维护性可扩展性开发效率

Github地址:https://github.com/leeco-cloud/spi.git


SPI框架
https://leenotes.cn/posts/48575.html
作者
Lee
发布于
2024年7月1日
许可协议