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

Java 允许模块化开发,同时仍在同一JVM中运行?,java,architecture,ipc,modularity,Java,Architecture,Ipc,Modularity,我们当前的应用程序在单个JVM中运行 我们现在将应用程序拆分为单独的逻辑服务,每个服务在其自己的JVM中运行 拆分是为了在不影响整个系统的情况下修改和部署单个服务。这减少了对整个系统进行QA的需要——只需要对与正在更改的服务的交互进行QA 对于服务间通信,我们使用REST、MQ系统总线和数据库视图的组合 我不喜欢的是: REST意味着我们必须将数据封送到XML或从XML封送 DB视图将系统耦合在一起,这打破了单独服务的整体概念 MQ/系统总线增加了复杂性 服务之间不可避免地存在一些代码重复 您

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

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

拆分是为了在不影响整个系统的情况下修改和部署单个服务。这减少了对整个系统进行QA的需要——只需要对与正在更改的服务的交互进行QA

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

我不喜欢的是:

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

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

我有点不明白您在这里真正想问什么。如果将应用程序拆分为在网络上运行的不同服务,则必须在某个地方进行数据编组

话虽如此,你调查过了吗?您可以在同一OSGi服务器中部署不同的(基本上是jar文件,其中包含定义接口的附加元数据),服务器将透明地促进这些捆绑包之间的通信,因为所有内容都在同一JVM中运行,也就是说,您可以像平常一样对不同捆绑包中的对象调用方法


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

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

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


如果您希望在不重新启动JVM的情况下部署新代码,那么OSGI是实现这一点的标准方法。(但我所知甚少。)

谢谢您的回复。服务器是如何“促进”捆绑包之间的通信的?我在编辑后的回复中对此进行了扩展。你只需调用所需的方法。我的意思是,你怎么能不拆分应用程序?让它在同一个JVM中运行,但让它被设计成可以单独部署应用程序的单独“模块”。通过这样做,你有了一些信心,应用程序中唯一发生变化的部分是“模块A”,而你所需要的QA就是“模块A”与应用程序其余部分之间的通信。这也将降低一个变更潜入另一个模块的风险,并在您只打算部署“模块a”时导致一些问题。啊。我已经进一步阐述了这一点。