OSGi是什么?

OSGi联盟现在将OSGi定义为一种技术:

OSGi技术是指一系列用于定义Java动态化组件系统的标准。这些标准通过为大型分布式系统以及嵌入式系统提供一种模块化架构减少了软件的复杂度。

这一系列的标准由OSGi联盟维护,标准的实现通常则称为OSGi容器或者OSGi服务平台。

OSGi标准

到现在为止应用最广泛的当属是2005年发布的R4。2003年Eclipse开始基于OSGi对Eclipse进行了重构,IBM的加入也影响了R4的制定,作为Eclipse内核的Equinox也成为OSGi标准的参考实现。OSGi各个版本的标准可以从osgi.org中下载。最新标准分为两个部分,OSGi Core和OSGi Enterpise

OSGi Core顾名思义,就是OSGi的核心标准,正是这个标准定义了一种动态化模块化的应用架构,其中主要定义了OSGi框架。OSGi框架提供了一个通用安全可管理的Java框架,能够支持可扩展可下载的应用(即bundles)的部署。OSGi框架是OSGi技术最基础也是最核心的部分。OSGi框架分为以下几层,如下图所示:

安全层基于Java2的安全机制增加了一些限制,并且弥补了Java标准的一些不足。

模块层定义了一个模块化Java模型,对Java部署模式的一些缺点进行了改进,并对bundle(bundle为OSGi中的组件模型,可以简单认为是增加了元数据的Jar包) 之间包的共享有严格的规定。模块层独立于生命周期层和服务层,使用时可以不需要生命周期层和服务层。生命周期层提供了对模块层的bundle 进行管理的API,而服务层提供了bundle之间的通信模型。

生命周期层为bundle 提供了生命周期管理API,为bundle提供了一个运行时模型,定义了一个bundle 如何启动、停止、安装和卸载。另外,生命周期层也提供全面的事件API,允许bundle去控制和操作服务平台。

服务层 为bundle开发者提供了一个动态、简明且并且统一的编程模型,通过解耦服务标准(即Java接口)和它的实现,能够简化服务bundle的开发和部署。这个模型允许bundle 开发者只使用他们自己的接口规范来绑定服务。这样接口的实现可以根据实际情况延迟到运行时来选择。框架通过使用服务层,为系统提供了一种扩展机制,成为hooks。Hooks是一种框架用来扩展功能的服务。

OSGi中统一的编程模型可以帮助bundle开发者应对很多情况下的扩展的问题,这一点非常重要,因为框架需要运行在各种硬件设备上,设备的不同硬件特性可能影响服务实现的许多方面。统一的接口使得软件组件能够匹配和组合,同时保证稳定的运行。

OSGi框架中bundle 可以在运行时通过服务注册中心选择一个可用的实现,bundle 可以注册新服务、接收关于服务状态的通知或者查找服务区以适配当前的设备。这使得一个bundle在部署后仍然具有可扩展性,新的bundle可被安装,已存在的bundle可修改和更新,而无需重新启动系统。

OSGi Enterprise由OSGi联盟的EEG(Enterprise Expert Group ) 制定,主要通过裁剪或者扩展OSGi框架(即OSGi Core)来定义技术需求与标准,以满足企业环境下IT软件基础设施的用况。OSGi Enterprise主要包括组件模型、分布式服务、Web应用于HTTP Servlet、事件模型、管理与配置服务、名称与目录服务、数据访问、事务支持以及其它一些支持服务。

OSGi的特点

OSGi已经被用于构建很多非常复杂的系统,比如IDE(Eclipse),应用服务器(GlassFish, IBM Websphere, Oracle/BEA Weblogic, Jonas, JBoss),应用框架(Spring,Guice),工业自动化等等。是什么特点使得OSGi称为这些系统的选择呢?

开发的角度来说,OSGi具有以下特点: 
● 复杂性的降低:基于OSGi的组件模型bundle能够隐藏内部实现,bundle基于服务进行交互。 
● 复用:很多第三方的组件可以以bundle的形式进行复用。 
● 简单:核心的API总过包括不超过30个类和接口。 
● 小巧:OSGi R4框架的实现仅需要300KB的JAR file就足够。在系统中引入OSGi几乎没有什么开销。 
● 非侵入式:服务可以以POJO的形式实现,不需要关注特定的接口。

部署和运行的角度来说,OSGi的动态化很大程度体现在系统的部署和运行时。这些特点包括: 
● 切合真实运行环境:OSGi框架是动态的,bundle能够进行即时的更新,服务可以根据需要动态增加或者删除。比如一个服务可以是一个网络中的设备,如果一个设备被监测到,则服务可以动态注册;如果设备被移除,则服务能够动态注销。在这样的运行环境中编程将需要耗费大量的开销来处理动态性,但是OSGi帮助开发者处理了绝大多数动态性方面的工作。 
● 易于部署:OSGi定义了组件是如何安装和管理的,标准化的管理API使得OSGi能够和现有和将来的各种系统有机的集成。 
● 动态更新:这是OSGi被最经常提起的一个特性,即所谓的“热插拔”特性,bundle能够动态的安装、启动、停止、更新和卸载,而整个系统无需重启。 
● 适配性:这主要得益于OSGi提供的服务机制、组件可以动态的注册、获取和监听服务,使得系统能够在OSGi环境调整自己的功能。 
● 透明:提供了管理API来访问内部状态,因此通常无需去查看日志,能够通过命令行进行调试。 
● 版本化:bundle可以版本化,多版本能够共存而不会影响系统功能,解决了JAR hell的问题。(这在开发时也提供了很大的帮助) 
● 快速:这得益于OSGi的类加载机制,和JAR包的线性加载不同,bundle委托式的类加载机制,使得类的加载无需进行搜索,这又能有效的加快系统的启动速度。 
● 懒加载:OSGi技术采用了很多懒加载机制。比如服务可以被注册,但是直到被使用时才创建。

此外OSGi还有一些其他的优势,比如: 
● 安全:OSGi提供了一个安全层,基于Java的安全模型增加了可用性。 
● 大公司的支持:OSGi联盟的成员里包含了很多业界有名的IT公司,比如Oracle, IBM, Samsung, Nokia, Progress, Motorola, NTT, Siemens, Hitachi, Deutsche Telekom, Redhat, Ericsson等。

OSGi的实现与扩展

OSGi框架最著名的三个实现包括Apache Felix, Equinox和Knopflerfish,这三个实现也是R4的认证实现。

Apache Felix :

Felix项目包含了一个OSGi R4服务平台(Service Platform)标准的实现,以及大量相关的OSGi功能与技术的实现。Felix下的子项目有二十多个。除了核心框架的实现,也对主要的OSGi服务进行了实现,同时还提供了iPojo这样的OSGi编程模型(后面我们将会详细介绍)。Felix还提供了一个强大的Shell,名叫Gogo, 用以与OSGi的交互。还记得OSGi易于部署的特点吗?基于OSGi提供的管理API,你也可以实现一个于OSGi平台的交互控制台,甚至是图形化或者Web形式的交互方式。Gogo也被接下来要介绍的Virgo所采用。当然,Felix也提供了支持OSGi开发的SDK,同时还提供了一个bundle的中央仓库。

Apache还有另外一个项目Aries,这个项目里主要基于Felix,对OSGi企业标准进行了实现。

Equinox:

Equinox是Eclipse 社区开发的 OSGi 框架,2008年开始Spring社区开始将Spring的编程模型引入到OSGi中,现在叫Spring DM,之后成为OSGi企业应用的标准,即Blueprint。可见,Gemini Blueprint是从Spring DM发展而来。使用Gemini Blueprint编写的代码更易于测试,同时与OSGi API是松耦合的。Gemini Web是OSGi Web Application Specification的一个参考实现,目的在于在OSGi环境下更好的支持Java EE中的Servlet模型。Virgo 项目EclipseRT项目的一部分,是一个完全模块化的Java运行时。Virgo自身就是设计为在Equinox之上的一个OSGi bundle集合。Virgo可以运行企业级Java应用以及基于Spring的应用。

Spring Source现在也维护着最大也是最全面的一个bundle仓库,叫做Enterprise Bundle Respository,将绝大多数Java企业级开发的Package转换为了OSGi bundle。当你真正将OSGi应用到实际开发中时,你就能体会到这样一个仓库给我们带来了多大的方便。

Knopflerfish :

Knopflerfish也是一个大名鼎鼎的开源OSGi服务平台实现,由Markwave公司实现,目前最新的版本支持OSGi R4 V4.2。除了提供运行环境外,Knopflerfish也提供了一套Eclipse的SDK,帮助开发者开发OSGi应用。

OSGi联盟

推动OSGi一直向前发展的OSGi联盟。OSGi联盟的主要目标是促进OSGi技术在应用,同时提升OSGi技术的市场价值,形成一个跨行业的生态系统。OSGi联盟现在主要做着以下几件事情:提供标准、提供标准的参考实现、提供OSGi的测试套件以及OSGi的认证。

OSGi联盟的正式成员分为三类:Strategic Members,Principal Members,Contributing Associates,成为这些成员都是要交年费的。同时OSGi联盟还提供一种免费的Supporter成员资格,希望推广联盟或者OSGi技术的组织都可以申请。

Strategic成员是最高级别的成员,管理整个联盟和标准的开发。Strategic成员有资格成为OSGi董事会成员、officer(干事)。Strategic成员可以进行OSGi的认证测试。所谓认证测试,就是实现了OSGi标准的产品如果通过OSGi联盟的测试,那就是通过认证了。OSGi联盟通过认证了,你的产品自然有公信力了。任何任务组织都可以申请成为Strategic 成员,不过年费也很高,一年得上交25000刀。像IBM、Oracle和Adobe这样的大公司都是strategic成员。

比Strategic成员更低一级别的是Principal 成员。Principal 成员可以领导专家组和社区,可以免费进行OSGi联盟的认证兼容性测试。250人以上的组织年费是20000刀,少于250人的组织年费是10000刀。

再下来就是Contributing Associates成员了。这一级别的成员主要关注技术,主要参与OSGi标准和技术的相关工作。Contributing Associates成员的年费是5000刀。大名鼎鼎的Eclipse基金会就是这一级别的成员。

Supporter成员那就很多了,毕竟是免费的,这里还能看到很多中国公司的身影了。Supporter成员有权在自己的站点使用OSGi的官方Logo,能够提出RFP,此外还有享受OSGi相关会议的折扣,接收OSGi的最新信息等。

OSGi-简介(01)的更多相关文章

  1. OSGi简介

    OSGi简介 OSGi是什么 下面来看看“维基百科”给出的解释: OSGi(Open Service Gateway Initiative)有双重含义.一方面它指OSGi Alliance组织:另一方 ...

  2. OSGI企业应用开发(一)OSGI简介

    一.OSGI简介 OSGI全称为Open Service Gateway Initiative(开放服务网关规范),有两个层面的含义,一方面它指OSGi Alliance组织:另一方面指该组织制定的一 ...

  3. mysql高可用架构 -> MHA简介-01

    作者简介 松信嘉範:MySQL/Linux专家2001年索尼公司入职2001年开始使用oracle2004年开始使用MySQL2006年9月-2010年8月MySQL从事顾问2010年-2012年 D ...

  4. OSGI简介(转)

    原文地址 目前,业内关于OSGI技术的学习资源或者技术文档还是很少的.我在某宝网搜索了一下“OSGI”的书籍,结果倒是有,但是种类少的可怜,而且几乎没有人购买.因为工作的原因我需要学习OSGI,所以我 ...

  5. OSGI简介—HelloWorld

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/wanghuan203/article/details/13631713 本次介绍的 HelloWor ...

  6. Redis系列---redis简介01

    一. 本章我们将用简短的几句话来帮助你快速的了解什么是redis,初学者不必深究 1 Redis简介 Remote Dictionary Server(Redis)是一个开源的使用ANSI C语言编写 ...

  7. unittest简介01

    前言 熟悉java的应该都清楚常见的单元测试框架Junit和TestNG,python里面也有单元测试框架-unittest,相当于是一个python版的junit. 一.unittest简介 1.先 ...

  8. 集腋成裘-08-ECharts -简介-01

    目标:让数据说话. 大数据时代的到来以及有效应用,大幅度提升了企业的管理能力.决策科学化与可执行性水平,推动传统决策方式朝着数据驱动转型.可视化数据分析对决策者产生的意义将在事前预测.事中感知以及事后 ...

  9. WCF简介-01

    WCF Windows Communication Foundation 1.1 新建一个"空白解决方案" 1.2 在解决方案中添加类库IBLL 1.2.1 添加接口IUserIn ...

  10. Springboot简介01

    前言: spring是近几年java中最具有代表而且最为流行的框架,spring是基于aop和IOC的思想,在我们的项目中充当了一个粘合剂的作用,既可以成为对象工厂,来管理我们的controller. ...

随机推荐

  1. 运维之Linux基础(二)

    运维之Linux基础(二) 1. file 命令基期用法 2. 文件系统 Linux的文件系统结构是树状结构,所有的文件都在/root跟目录下 /boot:系统启动相关的文件, 如:内核.initrd ...

  2. OpenCms JSP 模板开发——创建一个简单的JSP模板

    OpenCms中的JSP模板就是一个普通的JSP页面,在特定的位置使用标签来包含内容,在这个的例子中,我们将要开发一个简单JSP模板,这个模板只是在内容(如<html>.<body& ...

  3. tomcat-users.xml配置Manager登陆用户

    添加用来登陆tomcat-manager的用户 <tomcat-users> <!-- NOTE: By default, no user is included in the &q ...

  4. IP地址冲突

    IP地址冲突问题.. IP地址冲突多数是由于同一局域网内,有2台或者多台电脑设置了同一个本地IP地址,导致局域网内部IP冲突导致,,建议尽量将本地IP地址设置为自动获取--然后查看自动获取的IP地址是 ...

  5. 50行Python代码构建小型区块链

    本文介绍了如何使用python构建一个小型的区块链技术,使用Python2实现,代码不到50行. Although some think blockchain is a solution waitin ...

  6. jquery的2.0.3版本源码系列(3):96行-283行,给JQ对象,添加一些方法和属性

    jquery是面向对象的程序,面向对象就离不开方法和属性. 方法的简化 jQuery.fn=jQuery.prototype={ jquery: 版本 constructor: 修正指向问题 init ...

  7. Be the Best of Whatever You Are

    If you can't be a pine on the top of the hill, Be a scrub in the valley—but be The best little scrub ...

  8. python基础教程(五)

    字符串基本操作 所有标准的序列操作(索引.分片.乘法.判断成员资格.求长度.取最小值和最大值)对字符串同样适用,前面已经讲述的这些操作.但是,请注意字符串都是不可变的. 字符串的方法: 字符串从str ...

  9. Java Integer封装类的IntegerCache内部类

    个人理解,不喜勿喷,欢迎指正. 首先看下面这段代码,猜一下输出结果是什么 Integer a = 10; Integer b = 10; System.out.println(a == b); a = ...

  10. EF增删改查+使用Expression进行动态排序分页

    注:以下部分来自<ASP.NET MVC 企业级实战>一书的摘抄和改写以及部分个人学习心得. EF简单增删改查 增加 public static int Add() { using (No ...