java - 在 Tomcat 或 Wildfly 中使用 Java Web 应用程序进行多租户
问题描述
我有一个使用在 Tomcat 8.5 上运行的 JSF 的 Java Web 应用程序。每个租户都有多个用户,并有自己的 URL,例如:
example.com/tenant1 example.com/tenant2 ... example.com/tenant100
这目前是通过为每个租户部署一次相同的 WAR 文件来实现的,所以我们有
租户1.war,租户2.war,...租户100.war
每个租户在同一个数据库上都有自己的架构,并且应用程序通过 Tomcat 8.5 中的 JNDI 使用自己的数据库登录名。它还使用容器管理的安全性来处理用户登录。
到目前为止,这工作正常,但随着更多租户(领域)的添加,启动时间开始滞后 - 每个要部署的 WAR 文件大约需要 3 秒。有没有更有效的方法来解决这个问题,以便我们只使用一个 WAR 文件,但仍然有单独的数据库(或模式)和安全性来隔离租户?
我看到 Spring 在这里有一种方法和Hibernate multitenancy,但我没有使用 JPA/Hibernate 或 Spring。
目前在 Tomcat 上运行,但如果存在,我可以切换到 Wildfly 并使用其他一些 JEE 解决方案。
任何更通用的架构方法也值得赞赏。
解决方案
处理多租户的最佳方法是拥有一个代码库,这是多租户的最高级别。
在您的场景中,您可以设置过滤器来拦截传入的请求,然后使用租户信息将分段 1 标识为租户名称。
一旦获得,将有一个TenantContext
租户信息,如数据库架构等。这可用于为数据库查询设置正确的数据上下文。
高温高压
推荐阅读
- linux - 如何插入'|' 两个词之间?
- gitlab - 如何实现 git hooks 服务器端或 Gitlab 级别
- javascript - React - 文件上传器
- c++ - 如何为我的 3 个数据成员中的每一个调用 set 方法,然后显示我的 set 方法设置的值?
- python - 为什么这个字典解包不起作用
- assembly - 32 位保护模式不适用于多个程序集文件
- hibernate - 为什么 HQL 中的 SUM 返回 Long 而不是 Double?
- facebook - 页面所有者的快速回复
- php - 下拉菜单选择不导航到链接
- javascript - 使用具有一个参数的函数计算数组中元素的重复次数