在基于注释的Spring Boot应用程序中实现插件架构

我想在Spring Boot应用程序中实现插件架构。让我解释一下我的场景。我有一个主应用程序,它启动服务器,管理安全性等。该应用程序就像我的最终产品的根,它将包括此根应用程序和添加到其中的其他插件。

现在,插件本身就是Spring Boot应用程序,我可以通过在特定路径中动态搜索jar或将它们作为库添加到项目依赖项中来将其添加到根应用程序中。

插件有自己的配置,就像在主根应用程序内运行的应用程序一样。假设根应用程序运行服务器,则插件应用程序可能具有为我的产品提供功能的所有控制器(端点),Bean等。

这是前提,现在我想知道的是,

  1. 如何实现此体系结构?
  2. 根应用程序将如何与插件通信?
  3. 它们是否具有单独的应用程序上下文?
  4. 如何从根应用启动和配置子应用?
  5. 当应用程序收到来自客户端的请求时,考虑到我可能有很多插件,我如何将请求路由到特定插件内的特定控制器。

我对这里的概念以及它是如何工作的感到困惑。任何形式的帮助都是值得赞赏的。如果有一些任何人都可以提供的例子,那将是很棒的。


答案 1

这篇文章是3年前的。但是,我想为寻找类似情况解决方案的人回答这个问题。似乎pf4j是一个适合您的插件框架。除了支持本机应用程序外,它还具有spring-pf4j,因此您可以将其用于弹簧。

网址: https://pf4j.org


答案 2

就像Java dyanmically load插件中描述的那样,你有拖曳选项:

  1. 采用OSGi方式,这会考虑您的所有问题,但与Spring boot结合使用可能有点棘手
  2. 使用服务加载器

至少对于第二种方法,每个 jar 文件都应实现相同的接口,您可以使用该接口来注册 jar 文件的内容(类似于 OSGi 捆绑包的 start 方法)。通过这种方式,您可以分离每个jar文件的应用程序上下文,并仅在启动时使其可用(例如,您可以创建一个上下文层次结构,您可以在其中将jar的上下文添加到根上下文中)。

您的最后一点可能很棘手,因为您必须考虑可以有多个服务可以满足相同的请求。再次从OSGi中获取叶子,这些服务通常通过一个公共接口定义,并且实现具有类似优先级的内容,这将指示如果有多个服务,则应使用哪个服务。当然,您还可以定义其他方法来选择其中之一。


推荐