在基于注释的 Spring 启动应用程序中实现插件架构
Implementing plugin architecture in annotation based Spring Boot Application
我想在 Spring 引导应用程序中实现插件架构。让我解释一下我的情况。我有一个主应用程序,它启动服务器、管理安全性等。该应用程序就像我最终产品的根目录,其中将包括这个根应用程序和添加到其中的其他插件。
现在,插件是 Spring 引导应用程序本身,我可以通过在特定路径中动态搜索 jar 或将它们作为库添加到项目依赖项来将其添加到根应用程序。
插件有自己的配置,就像主根应用程序中的应用程序 运行。假设如果根应用程序运行服务器,则插件应用程序可能具有为我的产品提供功能的所有控制器(端点)、bean 等。
这是前提,现在我想知道的是,
- 我怎样才能实现这个架构?
- 根应用程序如何与插件通信?
- 他们会有单独的应用程序上下文吗?
- 如何从根应用启动和配置子应用?
- 当应用程序收到来自客户端的请求时,考虑到我可能有很多插件,我如何将请求路由到特定插件内的特定控制器。
我对这里的概念及其工作原理感到困惑。任何形式的帮助表示赞赏。如果有任何人可以提供一些例子,那就太好了。
如Java dyanmically load plugin中所述,您有两种选择:
- 采用 OSGi 方式,它考虑了您的所有问题,但与 Spring boot
结合起来可能有点棘手
- 使用 ServiceLoader
至少对于第二种方法,每个jar文件应该实现相同的接口,你可以用它来注册jar文件的内容(类似于OSGi bundle的start方法)。通过这种方式,您可以为每个 jar 文件分离应用程序上下文,并且仅在启动时使其可用(例如,您可以创建一个上下文层次结构,在其中添加您将 jar 的上下文添加到根上下文)。
您的最后一点可能比较棘手,因为您必须考虑可能有多个服务可以满足相同的请求。再次借鉴 OSGi 的思路,这些服务通常是通过一个公共接口定义的,并且实现具有类似优先级的东西,如果有多个服务,它会指示应该使用哪个服务。当然,您还可以定义其他方法来选择其中之一。
有两种可能的选择:
- 使用spring-plugin 可以实现OSGi 类功能。
https://github.com/spring-projects/spring-plugin
- 使用微引导,这将使用spring引导后端和微服务器前端。它还根据您的要求提供插件支持。你可以探索
https://github.com/aol/micro-server/tree/master/micro-boot
这个 post 是 3 年前的事了。但是,我想为正在为类似情况寻找解决方案的人回答这个问题。
看来pf4j 是一个适合你的插件框架。除了支持native app,它还有spring-pf4j,所以你可以把它用到spring.
URL: https://pf4j.org
我想在 Spring 引导应用程序中实现插件架构。让我解释一下我的情况。我有一个主应用程序,它启动服务器、管理安全性等。该应用程序就像我最终产品的根目录,其中将包括这个根应用程序和添加到其中的其他插件。
现在,插件是 Spring 引导应用程序本身,我可以通过在特定路径中动态搜索 jar 或将它们作为库添加到项目依赖项来将其添加到根应用程序。
插件有自己的配置,就像主根应用程序中的应用程序 运行。假设如果根应用程序运行服务器,则插件应用程序可能具有为我的产品提供功能的所有控制器(端点)、bean 等。
这是前提,现在我想知道的是,
- 我怎样才能实现这个架构?
- 根应用程序如何与插件通信?
- 他们会有单独的应用程序上下文吗?
- 如何从根应用启动和配置子应用?
- 当应用程序收到来自客户端的请求时,考虑到我可能有很多插件,我如何将请求路由到特定插件内的特定控制器。
我对这里的概念及其工作原理感到困惑。任何形式的帮助表示赞赏。如果有任何人可以提供一些例子,那就太好了。
如Java dyanmically load plugin中所述,您有两种选择:
- 采用 OSGi 方式,它考虑了您的所有问题,但与 Spring boot 结合起来可能有点棘手
- 使用 ServiceLoader
至少对于第二种方法,每个jar文件应该实现相同的接口,你可以用它来注册jar文件的内容(类似于OSGi bundle的start方法)。通过这种方式,您可以为每个 jar 文件分离应用程序上下文,并且仅在启动时使其可用(例如,您可以创建一个上下文层次结构,在其中添加您将 jar 的上下文添加到根上下文)。
您的最后一点可能比较棘手,因为您必须考虑可能有多个服务可以满足相同的请求。再次借鉴 OSGi 的思路,这些服务通常是通过一个公共接口定义的,并且实现具有类似优先级的东西,如果有多个服务,它会指示应该使用哪个服务。当然,您还可以定义其他方法来选择其中之一。
有两种可能的选择:
- 使用spring-plugin 可以实现OSGi 类功能。 https://github.com/spring-projects/spring-plugin
- 使用微引导,这将使用spring引导后端和微服务器前端。它还根据您的要求提供插件支持。你可以探索 https://github.com/aol/micro-server/tree/master/micro-boot
这个 post 是 3 年前的事了。但是,我想为正在为类似情况寻找解决方案的人回答这个问题。 看来pf4j 是一个适合你的插件框架。除了支持native app,它还有spring-pf4j,所以你可以把它用到spring.
URL: https://pf4j.org