介绍
多租户功能模块对以下第三方库进行适配:
- mybatisplus多租户插件自动配置
- 对redis StringRedisSerializer类进行重写,在redis存储中key格式为 租户id:key
- 对jetcache SimpleCacheManager类进行重写cachename格式为租户id+ ":" + cacheName ,以保证不同租户key或者cachename不会相同
- 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>
多租户配置,提供对多租户的启用,禁用及非多租户表的排除配置。
名称 | 类型 | 描述 |
---|---|---|
enabled | boolean | rue启用,false 禁用,默认为 true |
excludes | List | 非多租户表的排除 示例: - sys_menu - sys_tenant |
id-type | string | 默认为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。