Java 将一个大型单片应用程序拆分为两个应用程序有什么好处?

Java 将一个大型单片应用程序拆分为两个应用程序有什么好处?,java,web-services,jakarta-ee,weblogic,microservices,Java,Web Services,Jakarta Ee,Weblogic,Microservices,我们目前有一个大型的单一J2EE应用程序(weblogic/DB2)。这是一个典型的OLTP应用程序。我们正在考虑将此应用程序拆分为两个应用程序,其中每个应用程序都有自己的数据库,而另一个应用程序无法直接访问该数据库。这也意味着每个应用程序都需要为另一个应用程序所需的功能公开一个接口 那么,将这样一个现有应用程序拆分为两个应用程序的潜在主要好处是什么呢?我们不能在不了解该应用程序的全部内容、业务规则是什么、如何划分应用程序以及两个应用程序如何共享业务规则的情况下权衡利弊。 将一个应用程序划分为两

我们目前有一个大型的单一J2EE应用程序(weblogic/DB2)。这是一个典型的OLTP应用程序。我们正在考虑将此应用程序拆分为两个应用程序,其中每个应用程序都有自己的数据库,而另一个应用程序无法直接访问该数据库。这也意味着每个应用程序都需要为另一个应用程序所需的功能公开一个接口


那么,将这样一个现有应用程序拆分为两个应用程序的潜在主要好处是什么呢?

我们不能在不了解该应用程序的全部内容、业务规则是什么、如何划分应用程序以及两个应用程序如何共享业务规则的情况下权衡利弊。
将一个应用程序划分为两个应用程序不仅仅是将java类划分为两个组。这需要从不同的角度进行深入分析。希望这能有所帮助。

大多数应用程序在90%的时间内使用10%的代码

微服务的核心思想是现代SOA。您可以在特定于微服务的特殊云中弹性地扩展应用程序的关键部分。云是一个弹性集群,其中每个节点都是一个虚拟服务器(XEN或VMware等)。Cloud可以根据负载系数自动扩展或收缩节点计数,无需手动注意

对于经典的单片应用程序,您需要扩展整个单片应用程序。通常这类应用程序使用大量RAM,并且需要强大的硬件或强大而昂贵的虚拟服务器。单片的另一个缺点是,如果您需要发布一个新的业务特性,发布周期将非常长,因为您已经用代码熵修改了庞大而复杂的代码库。这将需要时间/预算昂贵的回归测试。但您也有一个好处——与SOA方法相比,不同的应用程序部分(子系统和模块)可以更容易地集成,如果您有良好的应用程序设计,这是不可能的

另一方面,您可以将应用程序逻辑拆分为一组小型应用程序,例如称为微服务的应用程序。例如,您有一个只负责UI的微服务,即只有带有Angluar.js的Spring MVC,另一个用于业务逻辑和持久性的微服务,还有一个用于从社交网络获取数据的微服务。所有这些服务都使用一些web服务相互连接,这些web服务通常是RestFull的,但可以是SOAP或类似于Google Protocol Buffers RPC等的东西。因此,现在您可以只自动扩展UI微服务,而不必触及业务逻辑和社交网络微服务,这对性能至关重要。您甚至可以在一个薄弱环节更新UI微服务,因为仅UI测试不像业务逻辑测试那样昂贵。但也有一个缺点——集群结构变得更加复杂,需要更强大的团队来维护(通常使用一些基于Chef或Docker的脚本实现自动化)。实现子系统集成也很困难,您需要更仔细地考虑您的系统设计


所以,如果你有一个巨大而复杂的系统,它是高负载的(比如Amazon.com、Ebay、Facebook或stackoverflow)。SOA方法让您有机会在基础设施和硬件上节省一些资金。但它的开发成本会更高。如果您的系统非常简单,即只有几页的网吧网站,则首选整体式方法。

如果您不关心可扩展性,那么我将指出以下好处:

  • 提高了更改速度—缩短了功能从构思阶段到生产阶段的时间(降低了开发人员的复杂性)
  • 更低的测试成本(更小的测试范围)
  • 改进的质量(同样,更小的测试范围)

我建议至少将其拆分,以便只有一个应用程序需要otherHi@PaulJanssens的功能。谢谢您的评论,但不幸的是,这是不可能的。这是一个在过去10年中发展起来的大型单片应用程序,两个应用程序必须相互调用。我认为这是一个基于观点的问题。现在是实施执行OLTP的源项目并根据您的需要进行定制的最佳时机。我理解您不能用上面提供的信息权衡优势和劣势,但我主要是想了解潜在的业务好处。有什么好的理由将大型单片应用程序拆分为2。嗨@Lech,谢谢你的回答。我只是想知道,如果您只做了最小的工作,将现有应用程序拆分为2个,而没有对应用程序进行任何重新设计,那么您的回复中的这些好处是否适用。因此,您仍然需要维护相同的源代码(现在已拆分为accross 2应用程序)+接口的额外源代码。所以在复杂性、质量和测试方面,我认为这不会有太大的区别。我会说这会有很大的区别,因为在发生变化的情况下,您只测试一个部分(假设接口保持不变)。部署也是如此-除非更改接口,否则只部署一个部分。与回滚相同,除非更改接口,否则只能回滚解决方案的一部分,而不会影响对另一部分的更改。