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

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

言归正传,之前在研究ODL的时候整理过OSGi的一些知识,分享一下,感谢度娘吧。

这是官方英文解释翻译版:OSGi service platform是一个开放并且提供统一接口标准的体系框架,基于这个体系框架,服务提供商,程序开发人员,软件提供商,服务网管运营商,设备提供商能够协调地联合起来开发,部署以灶斗行及管理向用户提供的各种服务。

灰色部分是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信息。

OpenDaylight(ODL)是Linux基金会负责管理的开源项目,是一款使用JAVA开发的控制器,提供一套基于SDN开发的模块化、可扩展、可升级、支持多协议的控制器框架,目的是推动SDN技术的创新实施和透明化。

SDN(Software Defined Network)即软件定义网络,是一种网络设计理念,或者一种推倒重来的设计思想。DN的理念是将原来封闭在通用网络硬件的控制平面抽取、独立出来并软件化为SDN控制器,这个控制器如同网络的“大脑”控制网络中的所有设备,而原来的通用网络硬件只需要听从SDN控制器的命令进行“傻瓜式”转发就可以了。其简单模型如图所示:

SDN网络的三大技术特征:

ODL控制器项目架构大致如下:

ODL在设计的时候遵循了六个基本的架构原则(以下来自opendaylight官方文档):

1、运行时模块化和扩展化(Runtime Modularity and Extensibility):支持在控制器运行时进行服务的安装、删除和更新。

2、多协议的南向支持(Multiprotocol Southbound):南向支持多种协议。

3、服务抽象层(Service Abstraction Layer):南向多种协议对上提供统一的北向服务接口。Hydrogen中全线采用AD-SAL,Helium版本AD-SAL和MD-SAL共存,Lithium和Beryllium中已基本使用MD-SAL架构。

4、开放的可扩展北绝销向API(Open Extensible Northbound API):提供可扩展的应用API,通过REST或者函数调用方式。两者提供的功能要一致。

5、支持多租户、切片(Support for Multitenancy/Slicing):允许网络在逻辑上(或物理上)划分成不同的切片或租户。控制器的部分功能和模块可以管理指定切片。控制器根据所管理的分片来呈现不同的控制观测面。

6、一致性聚合(Consistent Clustering):提供细粒度复制的聚合和确保网络一致性的横向扩展(scale-out)。

1、OSGi框架

OSGi(Open Service Gateway Initiative,直译为“开放服务网关”),是一个以Java为技术平台的动态模块化规范。OSGi中规定如何定义一个模块以及模块之间如何交互,Java模块被称为Bundle,OSGi就是为了使Bundle能更好的被复用。基于OSGi的应用是由一个个Bundle组成的,这些Bundle通过OSGi组织在一起,形成了一个系统。

OSGI框架分层:

2、Bundle

OSGi如果说是Java的模块开发体系,Bundle就是模块。OSGi中每个Bundle都有自己的类加载器,支持包级别的类导入和类导出,Bundle通过配置MANIFEST.MF,可以控制从Bundle导出的包,而没有导出的包则在Bundle外部是无法访问的。这样并猛游就完成了内部包和外部包的隔离。

3、KARAF是Apache旗下的开源项目,同时也是一个基于OSGI的运行环境,可以用于部署各种组件和应用程序。

4、Maven是现在Java社区中最强大的项目管理和项目构建工具。

5、Netty:java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。OpenDaylight南向使用Netty来管理底层的并发IO。

6、Jersey:开源的RESTful框架,实现了JAX-RS (JSR 311 &JSR 339) 规范。OpenDaylight北向使用Jersey提供REST接口。

还有其知则他很多用到的技术就不一一介绍了,有兴趣的朋友可以去网上搜索一下。

ONOS与OpenDayLight的本质区别如下:

1、 Opendaylight成立时间比ONOS早, 开发者也多过ONOS, 所以成熟度上ODL要超过ONOS的。

ODL主要是由各个厂商组成的一个开源平台, 南向支持包括Openflow在内的多种协议, 6月底发布的锂版本中ODL又增加了6种南向协议。 目前使用ODL的运行商也很多, AT&T Domain 2.0里面主要使用的就是ODL的SDN控猛枝制器, 另外comcast, cablelabs, telephonica还有Orange等大小运行商都在使用ODL, 目前在ODL上面开发的公司已经有20多家,预计明年会达到40-50家。

2、ONOS起源是斯坦福主导的ON.Lab, 去年底开始公开一些代码, 他们主要是从运行商的用例开始, 然后在分布,集群和高可靠等方面做了一些加强。因为他们目前的code base不大, 所以,比较容易做一些优化。 在功能,支持南向协议等方面, 还比不上ODL。

另外, ONOS目前不是模型驱动的, ODL中的MD-SAL,和蔽知嫌对YANG模型的支持是ONOS中没宏手有的。

3、ONOS目前还在起步阶段, 在数据中心中现在几乎没有支持, 在运行商领域ODL与ONOS各有千秋。 其实两者目前看互补程度甚至超过冲突部分。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12448964.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存