【问题标题】:Implementing plugin architecture in annotation based Spring Boot Application在基于注解的 Spring Boot 应用程序中实现插件架构
【发布时间】:2015-12-30 07:27:47
【问题描述】:

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

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

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

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

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

我对这里的概念以及它如何工作感到困惑。任何形式的帮助表示赞赏。如果有任何人都可以提供的例子,那就太好了。

【问题讨论】:

  • 我要实现类似的插件系统。你找到解决办法了吗?

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


【解决方案1】:

有两种可能的选择:

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

【讨论】:

    【解决方案2】:

    这篇文章是 3 年前的。但是,我想为正在寻找类似情况的解决方案的人回答这个问题。 看来 pf4j 是一个适合你的插件框架。除了支持native app之外,它还有spring-pf4j,所以你可以在spring中使用它。

    网址:https://pf4j.org

    【讨论】:

    • 如果有人想使用 pf4j,您可能还想看看sbp。它建立在 pf4j 之上,并提供与 SpringBoot 更好的集成。
    【解决方案3】:

    Java dyanmically load plugin 中所述,您有两种选择:

    1. 采用 OSGi 方式,将您的所有问题都考虑在内,但与 Spring 引导结合起来可能有点棘手
    2. 使用ServiceLoader

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

    您的最后一点可能很棘手,因为您必须考虑可能有多个服务可以满足相同的请求。再次借鉴 OSGi,这些服务通常是通过一个通用接口定义的,并且实现具有类似优先级的东西,如果有多个服务,则表明应该使用哪个服务。当然,您还可以定义其他方法来选择其中一种。

    【讨论】:

    • 我真的建议不要使用 OSGi 方式,它在传统的 jars 中运行良好,但是当谈到 spring 时,它一直给我带来奇怪的错误
    • 至少在 Java 9 中,我还没有找到在运行时检测插件的方法,所以是的,需要重新启动。
    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 2015-03-25
    • 2012-01-04
    • 2018-11-16
    • 1970-01-01
    • 2019-04-03
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多