多租户的案例是 粉丝的创新性应用案例之一,思路巧妙并且实现方式简
单。
应用中,不同租户的数据是需要进行相互隔离的,比较常用的一种方式是不同
的租户采用不同的 存放业务数据,常规的做法是应用程序中根据租户 连接
到相应的 ,通常是需要启动多个应用实例,每个租户一个,但这种模式消耗的
资源比较多,而且不容易管理,还需要开发额外的功能,以对应租户和部署的应用实例。
在 出现以后,有人利用 的 拦截功能,巧妙的实现了 多租户
特性,传统应用仅做少量的改动,就直接进化为多租户的 应用,下面的内容是
用户提供的具体细节:
单租户就是传统的给每个租户独立部署一套 。由于租户越来越多,整个
部分的机器和运维成本都非常高,因此需要改进到所有租户共享一套 的模式
( 部分暂不改变)。基于此需求,我们对单租户的程序做了简单的改造实现 多租
户共享。具体改造如下: 部分修改: 在用户登录时,在线程变量
()中记录租户的 修改 的实现:在提交 时,从
中获取租户 添加 注释,把租户的 放到注释中。例如: !"
#$%&! '(在 前面建立 )* 层,代理所有 过来
的数据库请求。)* 层是用 实现的, 提交的 过来时在注释中指定
)* 层根据指定的 转发 请求。
此方案有几个关键点:
+ 变量的巧妙使用,与 ,- 的事务管理器一样的机制,线程的
一个 变量中保留当前线程涉及到的数据库连接、事务状态等信息,当
. 的某个事务托管的业务方法被调用时,,- 自动完成数据库连接的建立或
重用过程,当此方法结束时,自动回收数据库连接以及提交事务。在这里,操作数据库的
线程中以 变量方式放入当前用户的 以及对应的数据库
(),则此线程随后的整个调用方法堆栈中的任何一个点都能获取到
用户对应的 ,包括在 /01 的驱动程序中。
+ 的 拦截机制, 提供了强大的 注解机制,可以用来影响
的路由,用户可以灵活扩展。在此方案中,: !"#$%&! 这个注
解就表明此 将在 %& 这个 (2中执行
+改造 /01驱动,/01 驱动是开源的项目,在这里实现对 的
拦截改造,比在程序里实现,要更加安全和可靠
评论0