在基于注释的Spring Boot Application中实现插件架构

时间:2015-10-02 05:43:27

标签: java spring spring-mvc spring-boot plugin-architecture

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

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

插件有自己的配置,就像在主根应用程序中运行的应用程序一样。让我们说如果根应用程序运行服务器,插件应用程序可能拥有为我的产品提供功能的所有控制器(端点),bean等。

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

  1. 我如何实现这种架构?
  2. 根应用程序如何与插件通信?
  3. 他们是否有单独的应用程序上下文?
  4. 如何从root应用程序启动和配置子应用程序?
  5. 当应用程序收到客户端的请求时,我如何将请求路由到特定插件内的特定控制器,因为我可能有很多插件。
  6. 我对这里的概念以及如何运作感到困惑。任何形式的帮助表示赞赏。如果有一些人可以提供的例子,那将是非常好的。

3 个答案:

答案 0 :(得分:5)

Java dyanmically load plugin中所述,您有两个选项:

  1. 采用OSGi方式,将所有问题都考虑在内,但与Spring boot结合使用可能有点棘手
  2. 使用ServiceLoader
  3. 至少对于第二种方法,每个jar文件应该实现相同的接口,您可以使用它来注册jar文件的内容(类似于OSGi包的start方法)。通过这种方式,您可以分离每个jar文件的应用程序上下文,并且只在启动时使其可用(例如,您可以创建一个上下文层次结构,在其中添加jar的上下文添加到根上下文中)。

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

答案 1 :(得分:3)

此帖子是3年前的。但是,我想为想为类似情况提供解决方案的人回答这个问题。 pf4j似乎是一个适合您的插件框架。除了支持本机应用程序外,它还具有spring-pf4j,因此您可以在spring中使用它。

URL:https://pf4j.org

答案 2 :(得分:0)

有两种可能的选择 1.使用spring-plugin可以实现OSGi的功能。 https://github.com/spring-projects/spring-plugin 2.使用mirco-boot,它将使用弹簧后端和mircoserver前端。它还根据您的要求提供插件支持。你可以探索 https://github.com/aol/micro-server/tree/master/micro-boot