OSGI规范深入浅出

一、OSGI简介

1、OSGI简介

OSGI(Open Service Gateway Initiative),即开放服务网关协议,是面向Java的动态模型系统。
OSGI是指由OSGI Alliance组织制定的Java模块化规范,OSGI规范的核心部分是一个框架,其中定义了应用程序的生命周期模式和服务注册。基于OSGI框架定义了大量的OSGI服务:日志、配置管理,HTTP服务(运行Servlet)、XML解析、设备访问、软件包管理、许可管理、用户管理、IO连接、Jini和UPnP等。
OSGI中文社区:http://www.osgi.com.cn/ 
OSGI官方网站:https://www.osgi.org/
OSGI框架实现了一个优雅、完整和动态的组件模型,组件(bundle)无需重新引导可以被远程安装、启动、升级和卸载。
OSGI服务平台提供在多种网络设备上无需重启的动态改变构造的功能。
为了最小化耦合度和促使耦合度可管理,OSGI技术提供了一种面向服务的架构,使组件动态地发现对方。
OSGI联盟已经开发了如HTTP服务器、配置、日志、安全、用户管理、XML等很多公共功能标准组件接口。标准组件的兼容性插件实现可以从不同计算机服务提供商得到。
OSGi的主要职责就是为了让开发者能够创建动态化、模块化的Java系统。

2、OSGI规范的组成

OSGI规范包括以下子规范:
A、Framework规范(OSGI核心,提供一个安全的可管理的Java Framework来部署可扩展的Java服务)
B、Package Admin Service规范(管理不同的Bundle之间的引用关系。当Bundle更新或者卸载时判断是否有其它的服务正在使用当前的Bundle)
C、Start Level规范(定义了启动和停止一个OSGi Service Platform时,不同的Bundles的启动或者停止的先后顺序)
D、Permission Admin Service规范(Bundle是否许可执行另外的Bundle的代码)
E、URL Handlers Service规范(怎样注册URL Schema,如何将java.io.InputStream对象转换为特定的Java对象)
F、Log Service规范
G、Configuration Admin Service规范
H、Device Access Specification
I、User Admin Service Specification
J、IO Connector Service Specification
K、Http Service Specification
L、Preference Service Specification
M、Wire Admin Service Specification
N、XML Parser Service Specification
O、Metatype Specification
P、Service Tracker Specification
Q、Measurment and State Specification
R、Position Specification
S、Execution Environment Specfication

3、OSGI的优点

OSGI的优势主要表现在以下几个方面:
A、热插拔的插件体系结构
基于OSGI的应用程序可动态更改运行状态和行为。在OSGI框架中,每一个组件都是可热插拔的,因此,对某一特定的组件的修改并不会影响到容器中的所有组件,运行中的大部分组件依旧能照常工作,部署一个新的Bundle时也不需要重新启动服务器。
B、可复用性
OSGI框架本身可复用性极强,易于构建真正面向接口的程序架构,每一个组件(Bundle)都是一个独立可复用的单元。基于OSGI独特的特性,进行企业开发的时候,对于新的开发,可以从企业的组件库中精简出可复用的模块,量身定做新的组件,最大限度的利用了已有的资源,降低开发成本,增强企业的竞争力。
C、高效性,稳定性
OSGI是一个稳定而高效的系统。OSGI作为一个微核的系统,其核心只有为数不多的几个JAR包。基于OSGI框架的系统的低耦合性,其结构的优势性保证具体的某一个组件不至于影响到全局,更不会因为局部的错误导致全局系统的崩溃。

4、OSGI的缺点

A、每个组件(Bundle)都由单独的类加载器加载,与一些Java EE项目中使用比较多的框架整合比较困难,如Spring MVC、Struts2等。
B、目前OSGI框架提供的管理端不够强大,现在的管理端中仅提供了基本的组件状态管理、日志查看等功能,像动态修改系统级别的配置(config.ini)、动态修改组件的配置(Manifest.mf)、启动级别等功能都尚未提供。
C、采用OSGI作为规范的模块开发、部署方式自然给现有开发人员提出了新的要求,需要学习新的基于OSGI的开发方式。

二、OSGI框架原理

1、OSGI框架简介

OSGI框架从概念上可以分为三层:模块层、生命周期层和服务层。
Module Layer:模块层主要涉及包及共享的代码;
Lifecycle Layer:生命周期层主要涉及组件的运行时生命周期管理;
Service Layer:服务层主要涉及模块之间的交互和通信。
架构设计——OSGI规范
OSGI Framework是OSGI Service Platform规范的核心组成部分,提供了一个通用的、安全可管理的Java framework。通过OSGI Framework可以支持一种叫做组件的Service application的部署和扩展。
OSGI兼容设备可以下载并且安装OSGI组件,也可一旦不再需要的时候删除。组件安装后会注册一定数量的Services,并被由同一个Framework下的其它组件使用。
在一个动态扩展的的OSGI环境中,Framework管理组件的安装和更新,同时也管理组件和Services之间的依赖关系。
Framework提供给组件开发者必须的资源来在Java平台上开发,为开发的组件提供了代码动态加载的功能, 也使得开发者开发、部署一个大规模的Services变的很容易。
其次,Framework为Java组件开发者提供了简明一致的编程模型,简化了开发部署的复杂性。编程模型允许开发者将自己的接口规范绑定到OSGI环境中的Service。
一个一致的编程模型帮助开发者可以应付一些可估计的危急错误。Framework将会运行在不同的硬件环境上,但一致的接口确保组件可以运行在一致的服务接口上。

2、模块层

模块层是OSGi框架中最基础的部分。
OSGi的模块化,是通过为Jar包添加metadata 来定义哪些类该暴露,哪些类该隐藏,其控制单元叫做组件Bundle(jar包)。 
Bundle是以jar包形式存在的一个模块化物理单元,包含代码、资源文件和元数据(metadata),并且jar包的物理边界也是运行时逻辑模块的封装边界。
Bundle是OSGi中的基本组件,其表现形式仍然为Java概念中传统的Jar包。
通过META-INF目录下的MANIFEST.MF文件对其予以进一步的定义。
通常一个MANIFEST.MF文件的内容如下:

  Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: Util
    Bundle-SymbolicName: com.ibm.director.la.util
    Bundle-Version: 1.0.0
    Bundle-RequiredExecutionEnvironment: J2SE-1.5
    Import-Package: org.osgi.framework;version="1.3.0"
    Export-Package: com.ibm.director.la.util;uses:="org.osgi.framework"
    Bundle-ClassPath: lib/junit.jar,

MANIFEST.MF文件存储的实际上是Bundle的元数据。
元数据的内容可以精确的定义Bundle的各种特征,同时能更好的对Bundle进行标识同时帮助用户对Bundle进行理解。

3、生命周期层

生命周期层在OSGi框架中属于模块层上面的一层,生命周期层的运作是建立在模块层的功能之上的。
生命周期层的主要功能是控制动态安装、开启、关闭、更新和卸载组件。
生命周期层能够从外部管理应用或者建立能够自我管理的应用(或者两者的结合),并且给了应用本身很大的动态性。 
Bundle的使用需要生命周期层的API与OSGi框架的生命周期层进行交互。

4、服务层

OSGi服务是注册到OSGi框架中的一个Java对象。注册的时候可以设置Service的属性。而在获取Service的时候可以根据属性进行过滤。
Bundle可以通过Bundle的上下文去注册Service或去查询Service。

三、模块层

1、模块化简介

模块化是将一个大型系统分解为多个较小的互相协作的逻辑单元,通过强制设定模块之间的逻辑边界来改善系统的维护性和封装性。
架构设计——OSGI规范
模块(module)定义了一个逻辑边界,模块本身精确地控制哪些类是完全被封装起来的,而哪些类需要暴露出来作为外部使用。开开发者可以轻松地将实现屏蔽在模块的内部,将公共API暴露在外部。

2、OSGI模块化与面向对象

面向对象编程中不会把所有功能都塞到同一个类。面向对象编程从问题域中发现多个事物,每个事物负责不同的功能,尽量做到高内聚和低耦合。面向对象的模块化粒度在类级别上。 
OSGi的模块化是通过为JAR包添加metadata来定义哪些类应该暴露哪些类又隐藏在包中,其控制可见性的粒度是在组件(JAR包)层面上的。 
OSGI模块化和面向对象思想所带来的能力都是通过控制可见性和可用性来保证高内聚和低耦合的,但粒度不同,一个是组件层面上,一个是对象层面上。

3、JAVA在模块化方面的局限

A、底层代码的可见性控制
Java提供了private、public、protected和package private(无修饰符)四种访问控制级别,提供了底层的OO数据封装特性。Packege具有分割代码的作用,但如果包中的代码要对包外可见,必须设置为public(protected,使用继承)。 
org.serc.helloworld.Hello.java:定义了一个接口

package org.serc.helloworld;  

public interface Hello {  
    void sayHello(); 
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值