Java EE 6 中的多租户支持

2022-09-03 16:05:07

我有一个现有的Java EE 6应用程序(部署在Glassfish v 3.1中),并希望支持多个租户。我目前在应用中使用的技术/API 是

  • EJB(包括 EJB 定时器服务)
  • JPA 2.0 (EclipseLink)
  • JSF 2.0
  • 断续器
  • JAX-RS
  • 我也计划使用CDI

据我所知,添加多租户支持仅影响持久性层。我的问题是:以前有人这样做过吗?转换应用程序的步骤是什么?这是否会影响持久性以外的其他层?

将有大量租户,因此,所有数据都将驻留在同一数据库架构中。


答案 1

持久层

从持久性层开始。完成此操作后,在体系结构中向上滚动。

您建议的架构将具有标识租户的 ID(例如。租户 Id)。每个表都将具有此 ID。在所有查询中,必须确保租户 Id 与登录用户的租户 Id 匹配。

这样做的困难在于这是一个非常手动的过程。

如果您使用Hibernate作为您的JPA提供商,那么有一些工具可以帮助您;即休眠过滤器

这些通常用于限制对多租户架构的访问(请参阅此处此处以获取更多信息)

我没有使用过EclipseLink,但它看起来也对多租户有很好的支持。鉴别器列看起来与休眠过滤器非常相似。

服务层

我假设您正在将 JAX-RS 和 JMS 用于服务层。如果是这样,则还需要考虑如何传递租户 Id 并对租户进行身份验证。如何防止一个租户访问另一个租户的 REST 服务?JMS也是如此。

用户界面层

你将不得不将UI中的登录名连接到Bean(Hibernate或Eclipselink),该Bean为过滤器/鉴别器设置 TenantId。


答案 2

告诉我们不同租户所需的数量以及分离和自定义程度。

如果你有少量的租户,我会建议创建一个可定制的“白标”产品。这使你有机会为一个租户创建一些特定的东西,而不会使问题过于复杂。此外,将每个租户的应用程序分开有助于进行维护。我们为一个只有几个不同租户的产品做了这个。

如果您有很多租户,这当然不再实用。我们做了同一产品的通用版本。然后,我们所做的就是在登录后通过id区分租户,从而将数据与其他租户分开。但是,在更改应用程序或其中的层方面仍然没有任何作用,id是分离数据所需的全部内容,并且工作流通过具有不同的bean或其他托管对象的实例来自动分离。


推荐