具有不同部署计划的多租户
Multi tenancy with varying deployment schedules
目前正在使用 JBoss 5.2 + Java 8(即将升级 JBoss)。我们有机会通过强大的多租户支持核心来振兴应用程序,因此假设这可以从头开始。
我们的 Java+Spring 应用程序是一个简单的网络应用程序:
- 公开各种 REST 服务以供我们的客户端实现(移动原生 + 浏览器)使用。
- 连接各种系统以完成 'tenant' 实施。
我们利用我们的标准化 client/server 模式构建我们的租户实施,并在每一侧进行定制。在服务端,这涉及到连接到各种外部服务,包括特定租户的后端系统以进行查询或最终产品提交。
这是一种领域驱动设计,将各种服务视为基于接口的可插入实用程序。这些服务基本上充当我们标准化域对象的翻译和 request/response 处理程序。目前,各种服务接口、公共服务和特定于租户的模块被分解成单独的项目,并通过 JAR 格式的 POM 一起进行 maven。另请注意,我们目前只有一个控制器层,因为 client/server 接口已针对我们的解决方案进行了标准化。
我的问题是:我们如何在不关闭 JVM 的情况下支持各种租户的发布?
当前的想法是能够动态交换租户 JAR 依赖项。现在,特定于租户的服务由 spring bean 注入指定 - 租户配置由 URL 请求确定(由会话令牌保护)。
考虑以下 3 个租户的场景:
- 租户 A 每月在星期六凌晨 3 点释放
- 租户 B 希望 agile/security 每 2 周在星期六上午 9 点释放一次
- 租户 C 希望每季度星期三晚上 8 点发布计划中的开发版本
肯定需要保证应用程序的安全,所以不想破坏class加载做任何黑幕。
任何 help/direction 将不胜感激,并将更新我们最终的内容。
提前致谢!
到目前为止,我想出的是一个托管多个 WAR 的 JVM。
组件分离到自己的项目中:
- 'core' - 控制器、网络服务工厂等。
- 服务接口
- 域对象
- 租户实现(每个都有自己的)
这种项目拆分允许单独构建它们并利用 Maven 的版本控制系统(快照)。
每个实施(租户)现在都有一个 'app' 项目,将各种组件和服务整合在一起。这是一个与租户实现不同的项目 - 允许其他项目重用该项目,这些项目将使用相同的域对象。这些 'app' 项目将为应用程序和子组件提供所有配置,并构建到它们自己的 WAR.
部署过程如前所述 - 单个 JVM 在 starting/stopping WAR 时不会循环。我们目前 运行 是 JBoss 的旧版本,因此扰乱 class 加载器一直是主要问题,但还不错。希望将 WAR 升级或分离到 JBoss.
下他们自己的服务器区域
打算通过 JAR 的数据库存储研究自定义 class 加载程序,或者转向 Docker 设置。
目前正在使用 JBoss 5.2 + Java 8(即将升级 JBoss)。我们有机会通过强大的多租户支持核心来振兴应用程序,因此假设这可以从头开始。
我们的 Java+Spring 应用程序是一个简单的网络应用程序:
- 公开各种 REST 服务以供我们的客户端实现(移动原生 + 浏览器)使用。
- 连接各种系统以完成 'tenant' 实施。
我们利用我们的标准化 client/server 模式构建我们的租户实施,并在每一侧进行定制。在服务端,这涉及到连接到各种外部服务,包括特定租户的后端系统以进行查询或最终产品提交。
这是一种领域驱动设计,将各种服务视为基于接口的可插入实用程序。这些服务基本上充当我们标准化域对象的翻译和 request/response 处理程序。目前,各种服务接口、公共服务和特定于租户的模块被分解成单独的项目,并通过 JAR 格式的 POM 一起进行 maven。另请注意,我们目前只有一个控制器层,因为 client/server 接口已针对我们的解决方案进行了标准化。
我的问题是:我们如何在不关闭 JVM 的情况下支持各种租户的发布?
当前的想法是能够动态交换租户 JAR 依赖项。现在,特定于租户的服务由 spring bean 注入指定 - 租户配置由 URL 请求确定(由会话令牌保护)。
考虑以下 3 个租户的场景:
- 租户 A 每月在星期六凌晨 3 点释放
- 租户 B 希望 agile/security 每 2 周在星期六上午 9 点释放一次
- 租户 C 希望每季度星期三晚上 8 点发布计划中的开发版本
肯定需要保证应用程序的安全,所以不想破坏class加载做任何黑幕。
任何 help/direction 将不胜感激,并将更新我们最终的内容。 提前致谢!
到目前为止,我想出的是一个托管多个 WAR 的 JVM。 组件分离到自己的项目中:
- 'core' - 控制器、网络服务工厂等。
- 服务接口
- 域对象
- 租户实现(每个都有自己的)
这种项目拆分允许单独构建它们并利用 Maven 的版本控制系统(快照)。
每个实施(租户)现在都有一个 'app' 项目,将各种组件和服务整合在一起。这是一个与租户实现不同的项目 - 允许其他项目重用该项目,这些项目将使用相同的域对象。这些 'app' 项目将为应用程序和子组件提供所有配置,并构建到它们自己的 WAR.
部署过程如前所述 - 单个 JVM 在 starting/stopping WAR 时不会循环。我们目前 运行 是 JBoss 的旧版本,因此扰乱 class 加载器一直是主要问题,但还不错。希望将 WAR 升级或分离到 JBoss.
下他们自己的服务器区域打算通过 JAR 的数据库存储研究自定义 class 加载程序,或者转向 Docker 设置。