Skip to content

介绍

多租户功能模块对以下第三方库进行适配:

  1. mybatisplus多租户插件自动配置
  2. 对redis StringRedisSerializer类进行重写,在redis存储中key格式为 租户id:key
  3. 对jetcache SimpleCacheManager类进行重写cachename格式为租户id+ ":" + cacheName ,以保证不同租户key或者cachename不会相同
  4. beansearch 多租户支持 多租户首先从http请求报头中读取tenant-id报头,如果没有读取到,并且使用了satoken,会从satoken环境中去获取租户id。

依赖库

名称描述
zebra-spring-boot-starter-mybatis-plus
spring-boot-starter-web
zebra-spring-boot-starter-cache
zebra-spring-boot-starter-bean-searcher不是必须
zebra-spring-boot-starter-satoken不是必须
forest-spring-boot-starter不是必须
spring-cloud-starter-openfeign不是必须
dubbo-spring-boot-starter不是必须

快速开始

引入

xml
<dependency>
		<groupId>io.github.zhanghongbin</groupId>
		<artifactId>zebra-spring-boot-starter-tenant</artifactId>
</dependency>

多租户配置,提供对多租户的启用,禁用及非多租户表的排除配置。

名称类型描述
enabledbooleanrue启用,false 禁用,默认为 true
excludesList非多租户表的排除 示例:
- sys_menu
- sys_tenant
id-typestring默认为String,还可以是Integer
yml
zebra:
  tenant:
	enabled:
	excludes:
    id-type:

框架适配清单

名称是否必须描述
forest已适配
redis已适配
mybatisplus已适配
jetcache已适配
beansearch已适配
dubbo已适配

TenantHelper

TenantHelper 提供快捷获取有关租户信息的静态方法。

名称类型描述
isEnabled()boolean是否启用 -静态方法
getIdType()String获取当前租户id-静态方法
setIgnore(Runnable runnable)void设置忽略租户
setIgnore(Supplier<T> handle)T设置忽略租户
dynamic(Serializable tenantId, Supplier<T> handle)T设置租户
setDynamicTenantId(Serializable tenantId)void设置租户
clearDynamicTenantId()T清理设置租户
isIgnore()Boolean是否忽略租户
<T> T getTenantId()泛型获取租户id

当使用setDynamicTenantId方法完成后,一定要使用clearDynamicTenantId进行清理

TenantAuditedEntity

提供带审计的泛型类,业务实体可以继承此类,此类有一个属性为tenantId,继承了AuditedEntity,第一个泛型参数为租户id类型,第二个为用户id类型,使用方式如下:

java
public class SysConfigEntity extends TenantAuditedEntity<String, String> {

		/**
		 * 参数主键
		 */
		@TableId(value = "config_id")
		private Long configId;

		/**
		 * 参数名称
		 */
		private String configName;
}

TenantLoginUser

多租户登录用户类,此类有一个属性为tenantId,在多租户环境下,登录用户对象需要继承此类

java
@Data
public class CurrentLoginUserDto extends TenantLoginUser<String, String> implements Serializable {

    /**
     * 部门ID
     */
    private Long deptId;

    /**
     * 部门类别编码
     */
    private String deptCategory;

    /**
     * 部门名
     */
    private String deptName;

    /**
     * 用户唯一标识
     */
    private String token;

    /**
     * 菜单权限
     */
    private Set<String> menuPermission;

    /**
     * 角色权限
     */
    private Set<String> rolePermission;

    /**
     * 用户昵称
     */
    private String nickname;

    /**
     * 角色对象
     */
    private List<RoleDto> roles;

    public CurrentLoginUserDto(String tenantId, String userId, String userName, String deviceType, int userType) {
        super(tenantId, userId, userName, deviceType, userType);
    }
}

高级阶段

TenantIdAcquirer 类

获取租户id,只有以下一个方法

名称类型描述
<T extends Serializable> T getTenantId(HttpServletRequest request)t获取租户id

默认实现了从http报头中获取租户id

java
public class TenantIdAcquirer {

    /**
     * header 中获得租户id
     *
     * @param request 请求
     * @return
     */
    public <T extends Serializable> T getTenantId(HttpServletRequest request) {
        String tenantId = request.getHeader(TenantHelper.HEADER_TENANT_ID);
        if (TenantHelper.getIdType().equals("Integer") && !StrUtil.isEmpty(tenantId)) {
            return (T) Integer.valueOf(tenantId);
        } else if ("".equals(tenantId)) {
            tenantId = null;
        }
        return (T) tenantId;
    }
}

还有一个实现类SaTokenTenantIdAcquirer继承了TenantIdAcquirer类,从satoken环境中获取租户id,如果想自定义获取租户id,可以继承TenantIdAcquirer类, 并重写getTenantId方法,然后把此类标记@Component或@Bean。