【问题标题】:How to share business logic among multiple applications如何在多个应用程序之间共享业务逻辑
【发布时间】:2013-03-18 16:46:57
【问题描述】:

我们必须开发和维护许多不同规模、范围和生命周期的基于 Java Web 的应用程序(针对同一家公司)。其中一些是巨大的,而另一些只是简单的页面,可能只存在几个月(或几天),有些已经实现并且需要重构。

尽管有一个共同点,他们需要访问(几乎)相同的信息。

问题

由于公司处理数据的复杂性,我们必须处理许多不同的来源,其中一些是从古代继承下来的。我们的领域对象可以映射到许多这些来源。例如,合同域对象映射到我们的主数据库,但其相关(物理)文件存储在文档服务器中,与之相关的活动存储在 NoSQL 数据库中。因此,添加、删除、搜索这些对象中的任何一个都涉及许多内部操作。

我们的数据源是(尽管可以是任何数据源):

  • AS400(使用 DB2 作为数据库)
  • Documentum 文档管理器
  • 蒙古数据库
  • 外部网络服务
  • 其他遗留来源

我们通常使用 Glassfish 作为应用服务器,使用 maven 作为我们的构建工具。

目标

我们的目标是创建一个我们所有应用程序都可以访问的业务层或库,它是:

  • 紧凑
  • 一致
  • 易于使用
  • 易于维护
  • 可从许多不同的客户访问

到目前为止我们发现了什么

我们已经苦苦挣扎了几个星期,但仍然找不到完全令人满意的东西。一些解决方案:

  • 将所有业务逻辑打包在一个或多个 jar 中:非常容易共享,但所有应用程序都必须包含所有 jar 依赖项和配置文件,并负责安全、缓存和其他内容。难以维护(我们必须在每个项目发生变化时更新 jars)。

  • 创建一个包含所有逻辑的 Ejb 项目并远程访问它:易于维护、安全、缓存和配置只需实现一次。我们害怕远程调用的惩罚。正如我们在研究中注意到的那样,这似乎是一种不好的做法(我们对 ejb 没有太多经验)。

  • 创建一个包含所有内容的 Ear 项目并使用本地访问:嗯,这比远程版本快,但维护起来很麻烦。

  • 去 OSGI:我们有点害怕这个,因为它不像 Ejb 那样流行,我们从来没有认真使用它。

这类问题有常见的做法吗?

非常感谢!

【问题讨论】:

  • 我已经有一段时间没有做一些 EJB 了。你能解释一下为什么你需要单独的 BL。对于数据方面,您是否使用 DAO 模式?是否可以通过这些映射到多个来源?应该可以管理多个数据源。
  • 感谢您的超快速回答!这实际上是主要思想。我们想使用 DAO 来封装所有脏东西。问题是如何从“客户端”应用程序访问这些 DAO。
  • 如果您正在构建一个全新的应用程序,我会推荐一种 osgi 方法。但如果你打算移植很多东西并且团队是 osgi 的新手,我不会推荐它。

标签: java jakarta-ee maven architecture ejb


【解决方案1】:

我不建议将所有逻辑放入 1 个 EAR 项目并使用本地访问。如果你在一个地方有很多代码,那么维护、测试、部署等都会变得更加困难。

我将创建具有公共依赖项的多模块 maven 项目。依赖项之一 - 具有业务逻辑和 DAO 访问权限的服务,它将公开 API。使用 Maven 项目,您可以轻松控制 POM 文件的版本。不同的项目可能使用不同版本的公共服务。 Maven 将为您处理版本控制。但是,它需要一些配置和实施工作。

您提到的另一个选项 - 带有远程 EJB 的独立 EAR 也应该可以正常工作。不要担心远程调用的性能和数量,除非您的负载很重。只需在客户端缓存远程 EJB 存根即可避免不必要的 JNDI 查找。

我个人更喜欢由 Maven 管理的共享依赖项的第一个选项。它清晰且易于维护,易于管理版本、部署、配置。使用 Maven,您无需为每个项目手动更改 jar 文件,您可以简单地使用 Nexus 等工具

【讨论】:

  • 谢谢安东。到目前为止,我们有一个由 6 个模块(所有业务逻辑和域对象)组成的多模块 maven 项目。我理解你的意思是我们可以将每个客户端应用程序作为另一个独立的 maven 项目并将业务 API 作为依赖项调用,对吗?在这种情况下,这意味着我们将为每个客户端应用程序部署一个业务 API,在这种情况下,我们将不得不使用不同的应用程序服务器。
  • 是的,如果您将业务逻辑提取到单独的 maven 项目中,您可以将其作为对所有应用程序的依赖项。在这种情况下,您可以根据需要使用不同的应用程序服务器
猜你喜欢
  • 1970-01-01
  • 2021-02-02
  • 2011-09-14
  • 1970-01-01
  • 2015-11-10
  • 2016-02-14
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多