允许模块化开发,同时仍然在同一个JVM中运行?

时间:2010-03-14 20:43:19

标签: java architecture ipc modularity

我们当前的应用程序在一个JVM中运行。

我们现在将应用程序拆分为单独的逻辑服务,其中每个服务都在自己的JVM中运行。

正在进行拆分以允许修改和部署单个服务,而不会影响整个系统。这减少了对整个系统进行QA的需求 - 只需要与正在更改的服务进行QA交互。

对于内部服务通信,我们使用REST,MQ系统总线和数据库视图的组合。

我不喜欢这个:

  • REST意味着我们必须将数据封送到XML或来自XML
  • 数据库视图将系统耦合在一起,这会破坏单独服务的整个概念
  • MQ /系统总线增加了复杂性
  • 服务之间不可避免地存在一些代码重复
  • 您已经设置了n个JBoss服务器配置,我们必须进行n次部署,n次设置脚本等等。

是否有更好的方法来构建内部应用程序以允许模块化开发和部署,同时允许应用程序在单个JVM中运行(并实现相关的好处)?

2 个答案:

答案 0 :(得分:3)

我有点困惑你在这里问的是什么。如果将应用程序拆分为跨网络运行的不同服务,则必须在某处进行数据编组。

话虽如此,你有没有调查OSGi?您可以将不同的bundles(基本上是带有定义接口的其他元数据的jar文件)部署到同一个OSGi服务器中,服务器将透明地促进这些捆绑包之间的通信,因为所有内容都在同一个JVM中运行 - 即您调用正常情况下,不同包中对象的方法。

OSGi服务器将允许在运行时卸载和升级软件包,应用程序应该正常运行(如果以降级方式),只要遵守OSGi bundle lifecycle状态。

答案 1 :(得分:0)

听起来您的团队有一个手动QA流程,真正的问题是自动化回归测试,以便您可以快速,自信地部署新版本。将代码分解为单独的服务器是一种解决方法。

如果您愿意重新启动服务器,那么一种方法可能是将代码编译成单独的jar文件,并通过放入新jar并重新启动来部署模块。这在很大程度上是构建代码库的问题,以便不会出现错误的依赖关系,并且jar之间的调用是通过不改变的接口进行的。 (或者,使用抽象类,以便您可以使用默认实现添加新方法。)您的构建系统可以帮助确保单独部署的模块只能依赖于公共接口,而其他任何东西都是编译错误。但是请注意,当你交换你没有编译的jar时,你的编译器不会帮助你检测不兼容性,所以我不确定这是否真的避免了一个良好的QA过程。

如果要在不重新启动JVM的情况下部署新代码,则OSGI是执行此操作的标准方法。 (但我对此知之甚少。)