写点什么

用 OSGi 完成应用的模块化——BPS 的设计选择

  • 2007-05-05
  • 本文字数:2137 字

    阅读完需:约 7 分钟

OSGi 是一个基于 Java 的服务平台规范,它是为那些需要长时间运行,动态更新并且对运行环境的影响尽可能小的系统制定的。迄今为止,很多工具厂商(Eclipse 是第一个)和应用服务器厂商(IBM、BEA、Oracle)都已经采用了 OSGi 来创建“微核与插件”的架构,这样一来,应用就可以被更好的模块化,并且可以在运行时动态装配。但是对于开发者而言,OSGi 更重要的特点则是:在开发应用时,它将成为更加优秀的组件模型。 JSR 291(OSGi 核心规范 R4.1)在经过多方争论后得出:

…为既有的 Java SE 平台定义了动态的组件框架,其中包括了组件的生命周期。这个动态的组件模型将会支持由组件组装应用和在组件之间隐藏实现细节,同时还会提供组件的生命周期管理功能。

当我们在 Java 的世界中使用组件开发时,OSGi 会成为我们的备选工具之一吗?有一家公司已经决定用 OSGi 来构建下个版本的产品架构,InfoQ 就这个话题,与该公司进行了交流。 BPS 是一家销售风险管理软件的 ISV ,该公司的产品可以帮助公司服从内部审计并遵守业务流程(例如,Sarbanes-Oxley 404 法案)。在那些规章制度以及对 IT 环境的要求都十分严苛的大型金融机构中,他们的产品已经成了主流。InfoQ 对 BPS 的首席架构师 Gavin Terrill 做了一次访问,在访问中 Gavin 谈到:

我们目前一直力求解决的问题是:怎样才能在一个 VM 里面,同时运行一个服务的多个版本。比如说,现在有两个应用程序,A 和 B,它们都与在我们的程序 C 集成。在 C 被部署以后,又增加了不少特性,用来支持 A 的下一个版本。那么我们该如何在不重启服务器,不更改任何 B 所依赖的功能的前提下,用新的代码来更新已部署的应用呢?而 OSGi 可以动态地提供组件(bundle),并为组件标记版本号,这样一来我们的问题就迎刃而解了。 我们的另一个目标是在代码库中引入面向服务(service oriented)的方式。注意这里的 S 和 O 都是小写的——我们希望系统可以做到松耦合,将概念和本地化测试分离,但是我们并不想用跨进程(out-of -process)的方式来实现,因为这样只会增加更多的复杂性,就像 Jini 和 DPWS(先前的 UPnP)一样。我们在产品中已经融入了这些想法,充分利用了 Java 中的接口,并利用 Spring 框架的依赖注入对这些接口做了相应实现。而 OSGi 则在这个基础上又有所提升,它以轻量级的方式把服务变得更加模块化。

就 OSGi 为什么比传统的 EAR/WAR 文件更好的话题,Gavin 说:

虽然现在已有的机制本身并没有什么问题,但我认为对于实际应用而言,EAR/WAR 的粒度显得太大了。如果我只需要改变一个 jar 文件,为什么我需要重启整个应用呢? 关于如何部署 Java 应用的话题,已经在 Java 社区中引发了大量的讨论,从 jar 文件的引入直到 JSR 277/294——“Java 模块系统(Java Module System)”(JSR 277)是 Java SE 7 的先行者,有趣的是,它第一眼看上去很像是从.Net 的 Assembly 思想中成型的——然而, OSGi 在 Eclipse 及其他应用中取得的成功给我们树立了信心。如果一样东西已经经过了重重考验,并且解决了我们曾碰到过的那些乱七八糟的部署问题,那还有什么好争的呢?

OSGi 的设计主旨与我们的需求很贴近:一个轻量级的进程内(in-process)服务容器框架,并提供了完整生命周期管理。

因为 BPS 的应用是架构在 Spring 基础上的,所以他们打算在新的架构中使用 Spring-OSGi 。最近,Spring OSGi 刚刚发布了第一个 Milestone。

使用 OSGi 来重新架构对 BPS 来说是一次巨大的冒险。Gavin 回忆说:“记得 2004 年的时候,BPS 决定冒险对产品进行重构,当时看上去采用 Spring 框架比起使用传统的 EJB 来,风险要大得多。但最终从开发人员和用户的反馈来看,这次冒险为我们赢得了大量的时间。这次采用 OSGi 对我们来说也是如此,因为它毕竟还处于发展初期,但我相信,在多年以后当我们架构 IT friendly,面向服务的企业级 Java 应用时,OSGi 就会成为事实上的标准了。”

OSGi 可以作为一种架构资产,来推动各个组织应用面向组件的软件开发。InfoQ 在去年 11 月曾报道过 Piero Campanelli 的分析报告,他在报告中列出了 OSGi 的如下几个优点:

  • 真正的组件开发——虽然组件开发概念很简单,但是真正开发组件化软件的时候,却是困难重重的。OSGi 的结构可以解决这些问题,例如依赖跟踪,版本跟踪和服务绑定。
  • 跨团队的安全开发——OSGi 的微核结构保证了组件和扩展是独立且可控的。
  • 公司项目的标准化管理——如果所有的项目都分解成 OSGi 组件,那么它们就可以很容易重用。 Eclipse repository 就是这样子的。
  • 版本跟踪——人们常常会有这样的疑问,“我可以集成这个库吗?”,亦或“它会不会与这个版本的另外一个库冲突?”,OSGi 所提供的标记版本的功能,就解决了这些疑惑。
  • 辅助架构设计——通过 OSGi,架构师无需进行完整的构建,就可以判断构建所依赖的类库是否依然可用。

InfoQ 一直在追踪报道 OSGi 的最新进展,请参见 InfoQ.com/OSGi (英文)和 InfoQ.com/cn/OSGi (中文)。

查看英文原文: OSGi for application modularity - one company’s design choice


译者简介:李剑中国Eclipse 社区插件开发版版主,在JavaEye 拥有 RCP 专栏,北航软件工程硕士。现就职于 Ethos ,热衷于设计模式,敏捷软件开发的研究与实践。为 InfoQ 中文站贡献内容,请邮件至 china-editorial@infoq.com

2007-05-05 08:301383
用户头像

发布了 197 篇内容, 共 63.9 次阅读, 收获喜欢 21 次。

关注

评论

发布
暂无评论
发现更多内容

Linux 基金会报告解读:开源 AI 重塑经济格局,有人失业,有人涨薪!

白鲸开源

人工智能 开源 AI 观点 开源AI

上海证券携手非凸科技,共筑开放共赢的私募服务新生态

非凸科技

Anolis OS 23 架构支持家族新成员:Anolis OS 23.3 版本及 RISC-V 预览版发布

OpenAnolis小助手

操作系统 risc-v 龙蜥社区 龙蜥操作系统 Anolis OS

KWDB多模分布式数据库助力共享打印机物联网IoT最佳实践落地,实现高效存储与查询时序数据

KaiwuDB

主键分布不均 SeaTunnel CDC 同步卡顿多日?这样优化终于通了!

白鲸开源

开源 主键 CDC Apache SeaTunnel CDC同步

开源 vs 付费:代练系统护航小程序源码的选择指南与性价比对比

DUOKE七七

MySQL uniapp vue2 thinkphp6

Databend 产品月报(2025年6月)

Databend

人工智能丨让你的AI更聪明,这7个开源MCP项目不要错过

测试人

架构师必备:业务扩展模式选型

量贩潮汐·WholesaleTide

架构 业务

龙蜥社区第 34 次运营委员会会议圆满结束

OpenAnolis小助手

操作系统 龙蜥生态

KaiwuDB 时序数据库深度解析:在物联网领域实战指南

KaiwuDB

FCPX插件-60个社交网络图形图标动画 mModules Essentials

晨光熹微

技术分享 | EC2多网卡与多IP配置

伊克罗德信息科技

你的救星来了!电脑硬盘坏了数据恢复教程,帮你找回重要资料

阿拉灯神丁

EasyRecovery 数据恢复软件 硬盘数据恢复 硬盘故障 数据丢失

以数据赋能高校:全域数据集成平台的应用场景

谷云科技RestCloud

数据处理 ETL 数据集成

冲刺IPO!摩尔线程以硬核技术叩响科创板大门

新消费日报

FCPX插件-165个社交媒体字幕条标题图形排版介绍宣传包装动画

晨光熹微

Sentieon 项目文章 | 通过深度测序对血浆中游离线粒体 DNA 进行定量和表征

INSVAST

生信分析 Sentieon 变异检测 生物信息分析服务 精准医疗

低代码×数智化OA:企业级敏捷办公的技术融合路径与实践验证

不在线第一只蜗牛

Confidential AI 实践:基于 Anolis OS 部署 Intel TDX 保护的 Qwen 模型

OpenAnolis小助手

AI 操作系统 龙蜥社区 Anolis OS Confidential AI

FCPX插件-82个音频元素信息图表图形动画 Infographic Elements Audio Motion

晨光熹微

FCPX模板-褶皱纸张元素定格动画图文快闪开场片头Stop Mption Opener

晨光熹微

MySQL行锁功过:怎么减少行锁对性能的影响?

量贩潮汐·WholesaleTide

MySQL 数据库

三级缓存解决了循环依赖问题?别被骗了,一级缓存就够了!

电子尖叫食人鱼

Java spring 缓存

低代码:JNPF+AI,解锁“智”造未来

引迈信息

最新 HarmonyOS API 20 知识库 重磅推出

万少

HarmonyOS

持续演进!Sermant 2.3.0 Release版本正式发布

华为云开源

开源 微服务架构 开源社区 字节码增强 流量治理

做到真正0丢失、0重复:Apache SeaTunnel 实现万亿级数据一致性全解密

白鲸开源

开源 数据同步 数据集成 Apache SeaTunnel

龙蜥大讲堂智算技术专场直播预告:围绕基于Anolis OS DCU部署、异构计算等主题分享

OpenAnolis小助手

操作系统 龙蜥社区 龙蜥大讲堂

10倍处理效率提升!阿里云大数据AI平台发布智能驾驶数据预处理解决方案

阿里云大数据AI技术

人工智能 大数据 数据分析 数据处理 智能驾驶

Cloud Kernel SIG季度动态:ANCK 5.10/6.6新版本发布,主线适配Sw8A&RSIC-V新平台

OpenAnolis小助手

操作系统 龙蜥sig

用OSGi完成应用的模块化——BPS的设计选择_Java_Floyd Marinescu_InfoQ精选文章