SPI扩展机制

1. 概述

当集成基础能力无法满足客户需求时,平台提供SPI扩展机制,用户可以在不影响上层使用的前提下,通过手写客开代码,实现统一身份认证、免登、单点登录、移动 App 接入、接口鉴权、基础能力厂商通道扩展等能力,解决个性化集成需求。

2. 能力架构

能力架构图

3. SPI 机制实现说明

3.1. spi jar 包项目开发并打包

下载帮助文档中对应功能 spi 示例的 demo 项目按需实现对应业务接口,并打包成 jar 包

  • spi 扩展 jar 包项目实现注意事项

img.png

  • 打包

1721907175054

3.2. 配置 jar 包动态加载必须的配置信息

将客开实现的 jar 包上传到私服或服务器本地, 配置到对应服务的配置中(nacos 或 yaml 文件) 配置完成后, 重启 spi jar包里实现的接口对应的项目即可

3.2.1 如果项目中配置了私服, 并通过私服管理扩展 jar 包的情况

验证 nacos 中 public 或项目中是否存在以下配置, 如果不存在则添加,如果存在则忽略

# public 配置确认
seeyon:
  # 开启 spi 动态扩展的私服配置, 用于从私服里拉取扩展 jar 包
  dynamic:
    loader:
      type: maven # 固定值
      maven:
        releaseUrl: release库地址
        snapshotUrl: snapshot库地址
        username: 账号
        password: 密码

对应项目中的 nacos 或 yaml 配置文件配置内容

# 对应服务配置
seeyon:
  spi:
    enable: true # 固定值 true
    spi-plugins:
      # 上传到私服里的扩展 jar 包的 GAV(groupId / artifactId / version)坐标。 maven: 开头
      # 固定格式 maven: 开头, 冒号后面没有空格, - 后面一个英文空格
      - maven:com.seeyon,xxx-xxx-xxx,x.y.z

注意:

spi-plugins的值:- maven:com.seeyon,xxx-xxx-xxx,x.y.z, 短横杠 后面 1 个英文空格, 前面 6 个英文空格

maven:xxx.xxx,xx-xx-xx,x.y.z 整体字符串中间 没有空格

所有缩进,以 两个英文空格 为标准, 不要使用 TAB 缩进

配置内容都是在 英文输入法 下配置,不要使用中文输入法

扩展 jar 包如果依赖外部 jar 包,也要将外部 jar 包对应的坐标配置到 seeyon.spi.spi-plugins

3.2.2 如果项目中未配置私服,通过服务器文件管理 jar 包的情况

对应服务 nacos 配置(Maven是有私服的,file是没有私服的)

# 对应服务配置
seeyon:
  spi:
    enable: true # 固定值 true
    spi-plugins:
      # 固定格式: file: 开头, 冒号后面没有空格, - 后面一个英文空格
      - file:/data/xxx/xxx.jar

注意:

  1. 两种配置根据项目情况取其一即可,jar包放到对应位置后,要确认jar包是否完整,对比下本地打的jar包大小,与服务器上的是否一致
  2. spi-plugins的值:- file:/data/xxx/xxx.jar, 短横杠 后面 1 个英文空格, 前面 6 个英文空格
  3. file:/data/xxx/xxx.jar 整体字符串中间 没有空格
  4. 所有缩进,以 两个英文空格 为标准, 不要使用 TAB 缩进
  5. 配置内容都是在 英文输入法 下配置,不要使用中文输入法
  6. 扩展 jar 包如果依赖外部 jar 包,也要将外部 jar 包对应的坐标配置到 seeyon.spi.spi-plugins

3.3. 视频讲解

4. xxxSpiUtil 工具类说明

工具类位于对应项目 api 包中的 util 下, 主要提供 spi 扩展 jar 包里的类的实例化获取, spring 管理的 bean的获取、调用、nacos或yaml中的配置信息获取功能

其中 ctp-user-api jar 包中还包含 request 对象的获取功能

4.1. 工具类介绍

以 ctp-user-api 中的 CtpUserSpiUtils 为例

@CtpUserComment("spi 扩展包工具类,可以获取 bean 的实例,通过配置 key 获取 nacos 或 yaml 配置内容等")
public class CtpUserSpiUtils {

    @CtpUserComment("获取指定类的单例实例")
    public static <T> T getInstance(Class<T> clazz) {
    }

    @CtpUserComment("获取获取被 spring 管理的指定类别的 Bean 对象")
    public static <T> T getBean(Class<T> clazz) {
    }

    @CtpUserComment("获取指定名称和类型的 Bean 对象, 获取被 spring 管理的 bean 的对象")
    public static <T> T getBean(String beanName, Class<T> requiredType) {
    }

    @CtpUserComment("调用指定 Bean 的指定方法并返回结果, beanName 是主服务中的 bean,jar 包中想用时可以通过此方法调用")
    public static <T> T invokeBean(String beanName, String methodName, Object... params) {
    }

    @CtpUserComment("通过 key 获取属性配置值, 属性配置可以是 yaml 文件也可以是 nacos 配置")
    public static String getPropertyByName(String key) {
    }

    @CtpUserComment("获取 request 对象")
    public static HttpServletRequest getRequest() {
    }
}    

方法说明:

  • getInstance(): 获取 spi jar包内的类的实例, 使用单例模式,保证每个类只被实例化一次。 注: 不会获取到 Spring 管理的 bean 的实例
  • getBean(): 获取 spring 管理的 bean 的实例, 注: 不会获取到 spi jar包内的类的实例
  • invokeBean(): 调用 spring 管理的 bean 的方法
  • getPropertyByName(): 获取 nacos 或 yaml 配置文件中的配置信息
  • getRequest(): http 的 request 对象

5. 注意事项

5.1. 配置完spi jar包重启项目失败

排查:日志搜索SPIJar || 动态加载spi的插件 查看原因

tail -n 10000  xxx-info.log | grep -C 50 '日志搜索SPIJar'

1720668371813

5.2. 配置信息不对(配置格式层级不对)

举例如下

1720668395517

根据实际上传的版本来,比如此例中应该是

1720668448122

5.3. 配置中含有中文的空格,字符导致

字符-及后面的空格等全部要求是英文才可以,配置手写重新敲一遍配置

1720668462281

6、能力清单


统一身份认证

支持通过SPI扩展机制,接入三方统一身份认证系统。

免登-中间页模式

支持三方异构系统免登进入COP平台SPI扩展能力。不支持免登地址中携带自定义参数

免登-中间页扩展模式

支持三方异构系统免登进入COP平台SPI扩展能力。支持免登地址中携带自定义参数

单点登录

支持通过SPI扩展机制,扩展集成应用免登中的单点登录模式。

移动插件

支持通过SPI扩展机制,扩展移动插件(移动管理-移动插件)。

接口鉴权

支持通过SPI扩展机制,扩展集成应用接口中的接口鉴权模式(集成应用-接口-安全认证)。

基础能力厂商通道

适用于COP平台已完成接入能力的通道扩展。如COP平台已接入短信服务,并已适配华为云通道、腾讯云通道。若系统使用中,需要使用阿里云或其他第三方通道,则可以通过SPI机制快速完成适配接

最后修改 November 25, 2024: docs(devops): 更新 SPI 扩展文档 (0df6080)