【问题标题】:Which framework may I use for plugin handling in a web-app我可以使用哪个框架来处理网络应用程序中的插件
【发布时间】:2014-11-18 10:35:50
【问题描述】:

我想开发一个带有包含“组”的左侧菜单的 Java Web 应用程序(例如:spring-mvc),每个组作为一组链接可用于打开所代表的任何功能。

我希望每个“组”都可以使用 jar 方法独立部署,所以它会是这样的:

  • 我在 plugins 文件夹中放了一个新的 jar
  • 网络应用自动检测插件
  • 左侧菜单会自动显示一个新组
  • 单击新组的任何链接会调用新 jar 中包含的控制器,并且元素会显示在应用的中心 div 中

我的问题是:是否已经有任何框架来管理插件检测/注册?

我已经读到 OSGi 可能是一种接近这种架构的解决方案,但我不确定这是否是我需要的正确选择。

【问题讨论】:

  • 我过去曾两次使用过 OSGi,坦率地说,每次我的体验都非常糟糕。我也两次使用了 Portlets,并且能够获得与您正在寻找的结果相似的结果,但是开发和部署非常复杂。这些天来,对于像您这样的要求,我寻找 JavaScript 解决方案而不是 Java 解决方案。如果您可以选择 JavaScript,请查看 [Meteor](www.meteor.com) 或简单的 [NodeJS](www.nodejs.org)。

标签: java spring-mvc jar osgi hotdeploy


【解决方案1】:

我不知道任何支持您要求的特定框架,但我可以想到两种方法,您可以自己实现它或将它集成到现有的 Web 框架中。

OSGI:

Apache Felix FileInstall 模块可以自动安装和启动放入受监控目录的 OSGi 包。理论上,使用正确的服务器和 http 支持模块,您可以放入您的 webapp 捆绑 jar 文件,OSGi 容器将部署它们并将所有请求路由到 webapps web.xml 文件中指定的路径到您的插件。

在实践中,您必须事先了解很多有关 OSGi 的知识,并可能对 OSGi 规范的不同实现进行大量实验。 OSGi 听起来很适合你想要的功能,当然可以很好地完成这项工作,但如果你的项目很小,它可能会有点矫枉过正。

SPI:

如果您想要(更)简单的东西,请查看 SPI(服务提供者接口)API。不过,您需要使用 SPI 手动实现大多数功能。没有像 OSGi 中那样的插件生命周期,但如果您只想部署而不打算取消部署,那也没关系。你需要自己实现jar的动态加载,例如like described in this question

我不了解 Spring MVC,但实际上您应该能够将这种方法集成到任何支持在框架启动后动态添加页面的 Web 框架中。主应用程序需要在 web 框架中注册所有已安装的 webapp 服务并将它们添加到菜单组中。 webapps 可以从主应用程序加载站点布局、菜单、资产等,并添加自己的内容和功能,最好使用一些 DI 框架来完成所有这些。

【讨论】:

    【解决方案2】:

    虽然这可能仅在 Java 中完成,但您会为通常的问题(不稳定/缓慢的部署、庞大的应用程序、管理插件的冲突依赖项)付出代价。

    更好的方法是:

    • 创建其他应用程序可以注册的应用程序。我们称其为“核心”。 Core 知道存在哪些“组”。
    • 为每个组部署一个独立的应用程序。当他们开始时,他们可以使用简单的 Web 请求在核心中注册自己(查看 REST)。当他们下线时,他们可以注销自己。 Core 应不时对它们执行 ping 操作以找到已死的。
    • 在为链接创建 HTML 时,您有两个选择:要么让核心渲染链接直接进入插件,要么让核心成为一种接收所有事件并转发它们的代理。由于the same origin policy,第一个可能很难正确。

    这种方法的优点是:

    • 每个插件都真正独立于核心。如果一个插件需要版本 3 中的 JAR Foo 而另一个需要版本 4?没问题。
    • 如果一个或多个插件死机,其余功能仍然可用
    • 您将能够独立于其他插件测试每个插件。
    • 在插件之间使用 REST/JSON 接口将使它们易于更改。借助 AJAX,您可以直接从浏览器中使用这些界面。

    缺点:

    • 如果插件需要相互访问,您需要在插件之间发送消息。简单的方法调用是不可能的。

    【讨论】:

      猜你喜欢
      • 2011-07-03
      • 2021-01-11
      • 2014-08-30
      • 1970-01-01
      • 2022-11-20
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多