爱恨交加:OSGi的Spring和EJB之路?

开发 后端
OSGi是Java的模块化规范,它解决了很多问题,并且其基于bundles的概念十分出众。然而它又有些复杂,没有强大和自动集成的测试组件来配合OSGi,你可能无法继续下去。本文分析了OSGi的这些优点和麻烦。

对于OSGi,有人评论称OSGi是“Spring之后的下一个big thing”。不过该文的作者后来又觉得,OSGi也有不少的问题,其中之一就是它在把技术变得复杂化。作者是这样说的:

51CTO编辑推荐:OSGi入门与实践全攻略

我对OSGi不怀疑并承认OSGi解决了许多问题,而且它支持一些出众的结构模型比如高模块化(high modularization)以及微服务(micro services)。然而从另外一个角度来说,在使用了OSGi几年之后,也体验了它在不同领域的表现(我是指开发领域)之后,我真的开始怀疑OSGi了。

这是我喜欢和讨厌的OSGi的一些方面:

它从几百个具有代表性的小bundle中创建出一个系统的概念非常棒。OSGi bundle很好的一点是它们定义了边界:不仅从依赖关系的意义上,而且从运行时间的意义上也是这样。每个bundle可以充当一个微应用,有自己的lifecycle和用户,每个bundle能够仔细地断定出哪个对象对外暴露。好好地使用它们,会带给系统以松耦合,并增加再使用的可能性。而与此同时,OSGi的lifecycle使life更加复杂。实际上,追踪服务和管理服务所引发的各个问题很讨厌(我曾看到过在它们的bundle activators使用大型的state machines来管理所有事情,这种样板化代码没有人愿意写)。幸运的是有Spring DM来帮我们管理这些。坦白说,如果没有Spring DM我绝不会动手开始OSGi项目。尽管Spring DM大大降低了bundle启动的复杂度,但仍然很麻烦。我仍然需要启动OSGi的运行时间、安装启动bundles,我还需要确保所有其他我所需要的bundles已经安装和启动。

我个人觉得,作为开发者,我们应当迫使自己执行系统的约束。我们不得不自动核对定义的限制,比如说,如果我们读取了一些我们并不想读取的类,构建程序就会失败。OSGi的版本概念,通过定义输入和输出包,将架构参数(architectural constraints)首次带入开发者的日常生活,并引入了一系列新的问题。OSGi是这样解决运行时间的版本问题的:它给每个bundle自己的class loader,并让class loader看起来像它所在的版本一样。这也带来一系列问题,因为它改变了你环境工作的方式。你的代码在所有你的单元测试中都可以通过,但一旦执行在OSGi的运行时间上,就会崩溃;Libraries崩溃因为这提升了运行时间中的类;Singletons被设计为静态对象不止一次地被创建,周而复始。当你在不断地调整你的模块构建说明时你会经常终止,而且绝对会在你的整个系统中传播反直观的依赖关系。Spring DM也是这个问题:通过在你的服务中添加一些指令并且不断地调整你的class loaders,你仍然需要调整和传送依赖关系。

尤其是类的导入更是带来很麻烦的问题。你很快会注意到,没有强大和自动集成的测试组件来配合OSGi,你无法继续下去

现在说一下我的结论:

在考虑OSGi之前,我会切实核实是否在不关闭系统的情况下我能否在运行时间中转换bundles,即使在这种情况下,我也会再次查看这些需求,来看看是否我会把他们限制在一个角落里,在这里我可以使用其他技术在动态时间上来动态地加载模块。还有其他选择可以生成这种结构条例(比如使用一个IOC container,使用独立的container来执行模块依赖等等……)许多这些东西都很接近KISS原则,避免所有其他附件的样板化代码并构建配置,这因此让你更加敏捷。

回归到我的题目上,还有一种技术拥有这样的特点(我是指让技术更加复杂),那就是EJB。Spring是最流行的实例:技术更加复杂,开发周期更加困难。也许我们会在未来的几年内在OSGi中看到同样的境遇?我无法断定,时间将验证一切。

【编辑推荐】

  1. OSGi近况总结:用户群蓬勃发展
  2. 2009甲骨文全球大会:OSGi将获得更多支持
  3. 你好,OSGi!OSGi入门必读系列
  4. OSGi 4.2规范已发布 新特性介绍
  5. OSGi是什么:Java语言的动态模块系统
责任编辑:yangsai 来源: CSDN
相关推荐

2018-04-20 15:50:30

CRT密码

2013-01-15 11:11:26

2009-06-22 13:44:00

JSFJava Web开发

2009-06-26 14:37:10

EJB和Spring

2009-06-18 15:24:08

Spring OSGi

2009-06-12 09:41:07

EJB3.0Spring

2017-09-18 15:09:42

苹果

2012-09-03 11:09:37

2009-06-01 10:28:03

SpringOSGi整合

2009-06-22 16:59:33

POJOSpringEJB 3.0

2009-03-03 10:06:00

IBMJavaOSGi

2009-09-27 09:29:56

OSGi和SpringSpring动态模型Spring DM

2014-08-13 17:01:20

清华同方

2009-06-26 14:54:18

Spring支持EJB

2019-01-08 08:03:57

5GB2BTO B

2022-09-02 12:13:22

TCPUDP场景

2009-10-09 13:42:56

Spring DataSpring DM

2009-06-11 15:26:05

EJB组件EJB容器

2009-09-28 13:13:16

设置Spring DM

2010-04-07 08:55:00

OSGiSpring
点赞
收藏

51CTO技术栈公众号