最近需要实现一个支持多租户的SAAS平台,大概的思路就是:每个租户独立一个数据库,独立一个域名,在nginx配置域名时,添加一个特殊的header字段,后台数据层根据这个header字段的值自动切换数据源。 Nginx配置在header中设置自定义字段tenant,给每个域名指定一个唯一的tenant值,后台将根据该值切换数据源。 自定义拦截器获取当前租户标志通过拦截器获取header中的租户标志,再通过InheritableThreadLocal把租户标志绑定到当前线程,数据层可以通过该标志切换数据源。 注册拦截器自定义连接器管理类,添加上面自定义的拦截器,获取租户标志。 数据源注册服务器类加载配置文件初始化数据源对象到内存。其中DataSourcePropertyLoader为自定义的配置文件加载类,可以根据实际情况自己实现。 自定义动态数据源自定义动态数据源,用于替换springboot默认数据源管理器,通过获取线程中绑定的租户标志查找数据源。 配置类重定义dataSource对象,替换springboot默认的数据源对象。 大功告成!分别使用www.jnhn01.cn和www.jnhn02.cn两个域名访问同一个接口时会自动切换到不同的数据库。 |
|