那位仁兄能解释一下什么是OSGi,还有Karaf


最近在研究OpenDaylight和ONOS,发现都用到了OSGi这种体系架构,但是开发并不知道怎么用,想请各位大神帮忙解释解释,让我有个系统了解。
已邀请:

胖欧巴 - 在SDN的路上渐行渐远

赞同来自: 小爱 NoName


今天好多人邀请,这假放的也是爽。
-------------------------------------------------分割线----------------------------------------------
言归正传,之前在研究ODL的时候整理过OSGi的一些知识,分享一下,感谢度娘吧。
这是官方英文解释翻译版:OSGi service platform是一个开放并且提供统一接口标准的体系框架,基于这个体系框架,服务提供商,程序开发人员,软件提供商,服务网管运营商,设备提供商能够协调地联合起来开发,部署以及管理向用户提供的各种服务。
OSGi_Strcture.png

灰色部分是OSGi的基础也就是在任意一个本地操作系统上安装有java虚拟器就可以运行OSGi,换言之OSGi是基于Java的架构。
其中Execution Environment、Modules、Life Cycle、Service、Security是从五个不同的角度对OSGi的架构进行划分。体系结构的最上层就是OSGi的统一接口Bundles。
Execution Environment是CVM + CDC + FP + PP组成的JVM配置,framework的modules这一方面功能将主要负责bundle的安装部署,更新和卸载,以及bundle在设备的物理存储(如果有的话)。在这个层次,每个bundle都是独立的,它的安装,升级和卸载完全不依赖任何其他bundle,这点framework提供了强大的隔离性。Life Cycle专门负责对bundle的解析(比如关联两个有相互依赖关系的bundle),启动(相当于运行应用程序)和停止(相当于停止应用程序)。这个层次中,bundle间的逻辑关系被创建起来,这些关系能否成功的创建,将会直接影响bundle的成功解析和启动。Service Registry可以认为是一个数据库,bundle启动后,可以向这个数据库注册它动态提供的服务。只要bundle不被停止,且bundle不主动撤销注册的服务,这个服务将一直保存在这个数据库中供其它bundle来查询和使用。而Services就是由bundle运行时提供的具体服务对象,这些服务对象的存在,使得framework具有极其动态的特征,并为framework运行时提供灵活强大的功能。
Jar文件是bundle的唯一格式,也就是说,我们要运行bundle,必须把代码打成jar文件。而jar文件可以带有manifest文件,这个文件对bundle是不可缺少的。OSGi规范里面,通过定义一系列适用于bundle的manifest关键字(bundle manifest header)来扩展manifest文件。
比如,开发人员在manifest中添加下面一行:
Bundle-Activator: aa.bb.cc.FamilyInfo
这样,在bundle被部署到framework后,framework就可以通过读取manifest的关键字来获得BundleActivator的具体实现类名,并通过reflection机制产生BundleActivator的实例。

依赖文件
OSGi规范里面,通过定义一系列适用于bundle的manifest关键字(bundle manifest header)来扩展manifest文件。
OpenDaylight中有的OSGi框架中的信息存放在MENIFEST.MF文件中,其中主要代码如下:

1 Manifest-Version: 1.0
2 Bnd-LastModified: 1394981967537
3 Build-Jdk: 1.7.0_25
4 Built-By: FLY_YE
5 Bundle-Activator: org.opendaylight.controller.switchmanager.internal.Act
ivator
6 Bundle-ManifestVersion: 2
7 Bundle-Name: switchmanager.implementation
8 Bundle-SymbolicName: org.opendaylight.controller.switchmanager.implement
ation
9 Bundle-Version: 0.4.1.SNAPSHOT
10 Created-By: Apache Maven Bundle Plugin
11 Import-Package:

其中,行1为manifest版本号,行3是基于的JDK版本,行5为绑定Bundle的类也就是OSGi插件的入口,在bundle被部署到framework后,framework就可以通过读取manifest的关键字来获得BundleActivator的具体实现类名,并通过reflection机制产生BundleActivator的实例。行6为用于Bundle的manifest版本,行7是Bundle的名称,行8为osgi specification 4强制要求的关键字,每个bundle都必须有唯一的symbolic name,行9为Bundle的版本,行10是Bundle的建立方式,行11是必须使用的,列出该bundle需要从其他bundle所引入的package(s)(提供该package的bundle必须在其manifest中有Export-Package:。

入口
在启动后通过Activator进入每个插件,这些Activator均继承自类ComponentActivatorAbstractBase,其中包含了初始化、销毁、配置、插件启动和停止等公共方法,每个插件都有其自身的Activator用来提供特有的服务,在Switch Manager中主要涉及到类的绑定和功能的加载。
public Object[] getImplementations() {
    Object[] res = { SwitchManager.class };
    return res;
}


上述代码为绑定模块的方法,主要通过该入口与Switch Manager产生依赖。
configureInstance(Component c, Object imp, String containerName)用来增加相应的服务。
getGlobalImplementations()用于增加全局依赖——SwitchManagerCLI.class,该类中包含了相关的插件启动、停止,shownodes、shownodeconnectors信息。

胖欧巴 - 在SDN的路上渐行渐远

赞同来自: NoName zhaoguoquan


这个是问度娘的答案,仅作参考。
Karaf是Apache旗下的一个开源项目.Karaf同时也是一个基于OSGi的运行环境,Karaf提供了一个轻量级的OSGi容器,可以用于部署各种组件,应用程序

君子一诺 - 软件测试外加小小编一枚

赞同来自: NoName


Karaf是Apache旗下的一个开源项目.Karaf同时也是一个基于OSGi的运行环境,Karaf提供了一个轻量级的OSGi容器,可以用于部署各种组件。
OSGi是OpenDaylight的旧版本,就在氢版本中,他加载每一个模块,如OpenFlow plugin,GUI,controller等;
Karaf用在Helium氦版本中,他可以加载你需要的模块。
我觉得karaf比较好用,而且在Helium版本中还支持of1.3协议。

xm - 插件化开源开发平台JXADF

赞同来自:


http://osgi.jxtech.net 是一个很优秀的OSGI开发平台,前端、后台代码都在Bundle中,还有在线演示呢。

xm - 插件化开源开发平台JXADF

赞同来自:


JXADF

JXADF控制台

要回复问题请先登录注册