解析方式现在大概只知道这些,如果有好的方案欢迎大家补充。为了以为扩展方便定义一个TenantResolver接口:
/** * 解析租户 */ public interface TenantResolver { /** * 从请求中解析租户信息 * @param request 当前请求 * @return */ Long resolve(HttpServletRequest request); }然后可以将所有的解析方式都聚合起来统一处理:
/** * * @param domainMapper * @return */ @Bean public TenantResolver tenantConsoleTenantResolver(TenantDomainMapper domainMapper, ITokenService tokenService){ return new CompositeTenantResolver( new SysDomainTenantResolver(), new RequestHeaderTenantResolver(), new RequestQueryTenantResolver(), new TokenTenantResolver(tokenService), new CustomDomainTenantResolver(domainMapper) ); }最后再定义一个Filter来调用解析器,解析租户:
public class UaaTenantServiceFilter implements Filter { private final TenantInfoService tenantInfoService; public UaaTenantServiceFilter(TenantInfoService tenantInfoService) { this.tenantInfoService = tenantInfoService; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //从request解析租户信息 try{ TenantInfo tenantInfo = tenantInfoService.getTenantInfo((HttpServletRequest) request); TenantInfoHolder.set(tenantInfo); chain.doFilter(request,response); }finally { TenantInfoHolder.remove(); } } }TenantInfoService是获取租户信息的接口,内部还是通过TenantResolver来解析租户Id,然后通过id从系统数据库获取当前租户的信息。
总结解决完动态数据源、租户信息获取两个问题后,只是一小步,后续还有很多问题需要处理如:系统权限和租户权限、统一登陆和鉴权、数据统计等等。。。,相信这些问题都会解决的,后续再来分享。
推荐阅读十分钟入门RocketMQ
Spring Boot 构建多租户 SaaS 平台核心技术指南
Redis 缓存和MySQL数据一致性方案详解
Nginx 限流配置
深入探秘 Netty、Kafka中的零拷贝技术!
学习资料分享12 套 微服务、Spring Boot、Spring Cloud 核心技术资料,这是部分资料目录:
Spring Security 认证与授权
Spring Boot 项目实战(中小型互联网公司后台服务架构与运维架构)
Spring Boot 项目实战(企业权限管理项目))
Spring Cloud 微服务架构项目实战(分布式事务解决方案)
...
公众号后台回复arch028获取资料::