Published on

Java Saas 定制化插件开发

Authors
  • avatar
    Name
    Prover
    Twitter

Saas 多租户定制化插件

一个为 Java 开发者提供 Saas 多租户定制化功能的库

安装

还未上传到 Maven 仓库,可以先从源代码仓库中复制过去

saas-dpi-y: 这是一个为 Java 开发者提供 Saas 多租户定制化功能的库 (gitee.com)

示例

原业务类

  • 上层接口

    public interface ISysDepartService extends IService<SysDepart>{
    
  • 具体实现类

    @Service
    @Primary // 避免接下来使用 @Autowired 报错
    public class SysDepartServiceImpl extends ServiceImpl<SysDepartMapper, SysDepart> implements ISysDepartService
    

针对租户A需要定制化 SysDepartServiceImpl 类的方法(例如保存的时候要添加额外的信息或逻辑)

使用插件:

  1. 创建一个 ISysDepartService 的实现类,并使用 @SaasPlugin 注解表示这个类要被哪个租户使用并重写相关的方法即可

    @Component
    @SaasPlugin("1")
    public class SysUserDepartServiceAImpl extends SysDepartServiceImpl{
    

    注意,这里是继承了 原业务类/具体实现类,因为可能大部分的方法都不需要改变,那么就使用默认的,需要定制化的方法重写即可

  2. 在需要使用 ==定制化业务的实例对象的类== 上使用 @UseSaasPlugin 注解并内部定义相关属性

    @UseSaasPlugin(ISysDepartService.class)
    public class SysDepartController {
        
        @Autowired
    	private ISysUserDepartService sysUserDepartService;
    

    这一块的设计有问题,可能很多地方都需要业务定制的对象,每个类上都加该注解太麻烦了,后续优化

  3. 因为需要根据租户信息(tenant_id)切换业务实例,所以库中提供了 cn.prover.context.TenantContext 类,通过该类注入租户信息(tenant_id)即可

    TenantContext.set("1")
    
    /*
    * !!!注意,由于内部使用了 ThreadLocal 来保存了租户信息,所以在使用后要调用 clear 方法
    *  - 比如通过 HandlerInterceptor 在请求进来和退出后保存和删除租户信息
    */
    TenantContext.clear()
    

已知问题

  • 性能问题(还没测试,有无大佬能给个测试方案(doge )
  • 如果是多定制业务逻辑类嵌套调用,会出问题,因为内部是用 ThreadLocal 保存的一个目标业务类,如果是多个嵌套调用就会报错

补充

开发者只是个刚上班的小菜只因,市面上也不知道有什么类似的库莫得,比较喜欢钻研就做了,有什么不足还希望大佬们多多指导

特别感谢

  • 唐总
  • 鸡哥

源码解析

TODO:挖坑挖坑

加载中...