2010-03-14 32 views
2

我们当前的应用程序运行在单个JVM中。允许模块化开发,同时仍在同一个JVM中运行?

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

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

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

我不喜欢这个:

  • REST意味着我们必须从XML元帅数据/
  • DB意见夫妇的系统连接在一起,其违背了独立服务的整个概念
  • MQ /系统总线增加了复杂性
  • 服务之间不可避免地存在一些代码重复
  • 您已经设置了n个JBoss服务器配置,我们必须执行n个部署,n numb呃建立脚本等等等

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

回答

3

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

话虽如此,你有没有调查过OSGi?您可以将不同的bundles(基本上是带有定义接口的额外元数据的jar文件)部署到同一个OSGi服务器中,并且服务器将透明地促进这些bundle之间的通信,因为所有内容都在相同的JVM中运行 - 即您调用不同的捆绑包就像你通常那样。

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

+0

感谢您的回复。服务器如何“促进软件包之间的通信”? – 2010-03-14 21:00:41

+0

我已在编辑的回复中对此进行了扩展。您只需调用所需的方法即可。 – 2010-03-14 21:02:22

+0

我得到的是怎样才能不把应用程序分开?为了让它运行在同一个JVM中,但它的设计使您可以单独部署应用程序的单独“模块”。通过这样做,您可以确信应用程序中唯一发生变化的部分是“模块A”,您只需“模块A”和其他应用程序之间的通信即可进行QA。而且这也会降低更改进入另一个模块的风险,并且当您要部署的所有内容都是“模块A”时会导致一些问题。 – 2010-03-14 21:04:30

0

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

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

如果要在不重新启动JVM的情况下部署新代码,那么OSGI是实现该目标的标准方法。 (但是我对此知之甚少)

相关问题