一、OSGI基本概念
OSGI是什么
1. OSGI指开放服务网关协议(OpenServices Gateway initiative)
2. OSGI技术指Java的动态模块化系统的一系列规范(OSGI联盟制定),有时也指OSGI联盟本身。
3. OSGI指Java平台的模块层(《OSGI inAction》)
OSGI生态系统的全貌
OSGI联盟
1. 职责
定义标准,提供标准的参考实现,提供OSGI的测试套件及OSGI的认证。
2. 三类正式成员
Strategic Members(IBM):战略成员
Principal Members(NEC):主要成员
Contributing Associates(Eclipse):贡献者
3. 非正式成员
Supporter (由中国公司的身影)
4. 工作模式
董事会和干事
专家组:核心平台专家组,企业专家组,Residential(住宅)专家组
Fellow:研发人员
Laureates:项目贡献者
模块和模块化
Java 模块化的局限性
1. 代码可见性
Java通过面向对象提供了一定的模块化特性(package及访问权限修饰词),但是对于public修饰的类,任何用户都可访问,通常java中可以通过设计模式控制某些类的访问权限。
2. Class path
Class path 中的jar包在运行时并没有明确的模块边界,多个版本的jar同时存在时有不确定性存在,(jar hell)如下图:
3. 部署域管理
在部署和管理上缺乏有效的支持,比如:模块的动态更新,整个系统的动态烟花,插件化开发。
OSGI提供了什么(详细讲解见后续章节)
模块层:代码的打包和共享
生命周期层:提供运行时管理以及对OSGi框架的访问接口
服务层:模块间的交互和通信
1.1、 模块层定义了OSGi中的模块Bundle
1.2 、Bundle是一个具有额外元数据的jar包
1.3、Bundle定义了其所包含的包的可见性,可以认为是在public/private/protected的基础上的一个扩展
模块层提供系统的结构,而生命周期层提供系统管理,以维持系统正常运行。生命周期层有两个作用:
2.1、 模块生命周期的操作(install,update,start,stop…)使得外部可以动态的管理和演化系统
2.2、 生命周期层定义了运行时上下文的接口,因此bundle本身可以和OSGi框架进行交互,从而实现内部自我管理
3. 服务层
服务层是JVM中的SOA(不能跨JVM?),和bundle一样,是动态的。服务层可以促进开发人员使用基于接口编程的方法,OSGi服务是Java Interface,服务的调用就是Java对象的方法调用
OSGi的最大优势
本质上,OSGi提供了更加严格的模块化特性,更严格的一致性检查,OSGi带来两个最大的优势:
基于接口编程,完全隐藏实现(促进你从架构上思考)
动态性(对扩展开放,即使是运行时)
OSGi为什么不流行
OSGi最初面向的领域是嵌入式,直到应用服务器和IDE开始采用OSGi,才开始引起更广发的注意。另外资料的匮乏带来的误解(只是嵌入式技术,重量级,复杂)以及lib支持不够(很多Lib不能在OSGi环境下运行)
Enterprise OSGi
企业应用往往具有大数据量,大并发量,复杂的业务等特征,因此更需要模块化(系统分层,分布式部署,协作化开发)
TCCL(SPI模式),反射技术在OSGi类加载机制下会有问题
小结
1. Java平台的模块化支持局限于细粒度的面向对象支持,OSGi提供了更粗粒度的模块化特征
2. OSGi框架针对Java模块化的局限性提供了强大而不失灵活的解决方案
3. 声明式和基于元数据的方法,使得OSGi使用一种非入侵式的方法提供了强大的模块化能力
4. 生命周期层定义了模块动态且可控的生命周期模型,从而简化系统管理
5. OSGi通过服务层鼓励采用基于接口编程的方法,从而将接口与实现进行分离。