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)
问题
-
如何在不使用第三方框架的情况下提供 rest service 暴露?
暴露 rest service 利用,osgi 自带的 HttpService 服务,再通过 org.eclipse.equinox.servletbridge.BridgeServlet 把服务桥接出去
- 关于现有的 SpringMVC 单体应用,如何将每一个 controller 中的所有 methods 封装为 bundle 中的 bean services 对外统一暴露而不是 one by one?
- 如何在 Bundle 使用 Spring Annotation/ 是否可以使用?
- 如何将现有 SpringMVC 项目直接生成一个 full bundle 以提供对外暴露 services, 并且对现有项目无侵入或很少侵入?
基于众多原因:
- 社区停滞维护,技术较陈旧
- 第三方开源框架可以实现,问题是对于我们原有系统改动太过巨大。
- 未来遇到的问题无法得到外部解决,只能我们自身针对性对底层进行扩展。
- 对于初中级朋友来说,学习成本太高(我翻阅了国内外大多数资料)
- 如果不能重新编写新项目的话,对于原系统的改造成本太高。
- …
替代方案
我选择放弃该方案,使用 Servlet 3.0 提供的热插拔来实现插件模式,只是需要重新加载应用上下文,因此,建议各位部署多实例节点,在升级服务时,采用灰度发布来降低影响。
奔跑的人生 | 博客园 | segmentfault | spring4all | csdn | 掘金 | OSChina | 简书 | 头条 | 知乎 | 51CTO