乐趣区

插件化开发-Poc之后我选择放弃OSGI

Poc 之后,我选择放弃 OSGI

TIPS:
如贵司允许重构老系统或者允许使用 OSGI 的第三方框架改造所带来的投入成本,并且评估之后 ROI 乐观,那么还是可以使用的。

Runtime Version

以下问题全部基于 Equinox 框架 & 使用 BluePrint 整合 Spring 框架

  • OSGI

    • org.eclipse.osgi 3.15.0v20190830-1434
  • Equinox version

    • Equinox 4.13
  • Spring Framework

    • 5.0.4P
    • 3.0.0
  • blueprint

    • 3.0.0.M1
  • mybatis

    • 3.5.3
  • mybatis-spring

    • 1.3.2
  • mysql

    • 5+/8+

现状

以下方案前提条件:不使用第三方框架(Camel/karaf…)。

  • Spring 3 整合
    使用 Spring3 实现了 SpringMvc 的整合,但是无法支持 Restful 支持。
    spring3 以后,好像就没有人维护 osgi 的版 jar 包了,想要使用更高版本,只能自己生成 bundle.
  • Spring5 整合
    基础 Spring Bean 注入通过 xml 方式已经成功,但是目前的 bundle 缺失较多,最重要的为 jdbc & transaction,spring 在 3.2 之后升级为 spring-tx,而且不提供 osgi 版本,造成我们现有项目大部分业务需要重构,工作量巨大(等同于重写 service)

问题

  1. 如何在不使用第三方框架的情况下提供 rest service 暴露?

    暴露 rest service 利用,osgi 自带的 HttpService 服务,再通过 org.eclipse.equinox.servletbridge.BridgeServlet 把服务桥接出去

  2. 关于现有的 SpringMVC 单体应用,如何将每一个 controller 中的所有 methods 封装为 bundle 中的 bean services 对外统一暴露而不是 one by one?
  3. 如何在 Bundle 使用 Spring Annotation/ 是否可以使用?
  4. 如何将现有 SpringMVC 项目直接生成一个 full bundle 以提供对外暴露 services, 并且对现有项目无侵入或很少侵入?

基于众多原因:

  1. 社区停滞维护,技术较陈旧
  2. 第三方开源框架可以实现,问题是对于我们原有系统改动太过巨大。
  3. 未来遇到的问题无法得到外部解决,只能我们自身针对性对底层进行扩展。
  4. 对于初中级朋友来说,学习成本太高(我翻阅了国内外大多数资料)
  5. 如果不能重新编写新项目的话,对于原系统的改造成本太高。

替代方案

我选择放弃该方案,使用 Servlet 3.0 提供的热插拔来实现插件模式,只是需要重新加载应用上下文,因此,建议各位部署多实例节点,在升级服务时,采用灰度发布来降低影响。


奔跑的人生 | 博客园 | segmentfault | spring4all | csdn | 掘金 | OSChina | 简书 | 头条 | 知乎 | 51CTO

退出移动版