opendaylight总体架构分析模块,osgiBundle与floodlight之间的简单对比SAL层之OFPacket的处理流程Md-SAL-模型化驱动简单分析Clustering-集群•OSGi:由于采用OSGi体系结构,其技术提供一种面向服务的架构,将应用视为对等模块的相互协作,•SAL:整个架构引入了业务抽象层,将服务抽象化,使得上层(北向)和下层(南向)之间的调用相互隔离.•MD(ModelDrive):使用Yang工具,使用业务模型驱动来设计接口、实现业务功能,根据yang文件,Yang工具直接生成业务管理的“骨架”,主要用于南北接口数据的适配,使开发者真正专注于具体业务。•集群(Infinispan):用开源的数据网格平台实现Controller的集群。•南向北向:南向使用Netty来管理底层的并发IO,北向使用REST接口。核心技术2020/1/10与Floodlilght的简单区别•采用OSGI框架,各模块间功能隔离开来,有利于扩展性、而且可以动态部署。OSGI的依赖关系管理,有多种实现方式,可以通过DependencyManager对象来注册服务,并通过反射注明依赖的服务。而Floodlight只是单纯的java包之间的引用,扩展性不好,支持的南向接口少,目前只有OF1.0;但是易于上手。是一个Openflow控制器.OpenDayLight中的bundles•核心基类:ComponentactivatorabstractBase实现了Osgi提供的BundleActivator,以自己定义的容器接口iContaineraware,从中发现各个bundle之间、Componet之间、全局和容器Container之间的依赖和调用关系。•bundle的抽象基类,管理全局和容器相关的服务,当然bundle本身就是一个大服务。•Container是OpenDaylight中的一个网络域,有很多链接信息、整个域网络信息等,由ContainerManager管理容器。而OSGI管理各个bundle;•每个具体的接口实现和容器的Container为关键字通过DependencyManager(依赖管理)创建一个Componet,每个Component就是一个服务,里面说明了导出的接口和依赖的接口。DM以Component的形式来管理依赖关系。7主要方法如下:•Start(context)启动方法,会遍历其所提供的实现,依次配置依赖关系。•getGlobalImplementations()获取全局的实现类,其导出接口的实现类。•getImplementations()获取容器相关的实现。•Configureglobalinstance(c,Imps[i]),c是前面提到的component•configureInstance()在一个容器中配置实现的依赖关系。•containerCreate(StringcontainerName)配置Componet,里面说明了导出的接口和依赖的接口,最后放到dm及缓存中。会在CM的bundle启动中调用。•CreateServiceDependency()生成服务依赖对象,需要被子类调用,在配置componet的依赖关系的时候需要用到。Bundle启动过程•1)每个bundle都会从start(context)启动,先根据osgi上下文信息,生成bundle对应的dependencymanager对象,•2)再获取全局相关的服务,每个实现通过dm创建一个componet,接着配置这个componet。这里每个Component就是一个服务,里面说明了导出的接口和依赖的接口•3)然后将这个componet放到dm和缓存(并发map:dbglobalinstances)中。接着向osgi容器注册iContaineraware接口以便容器的生命周期转换点调用。•4)最后调用bunndle的钩子函数init()。该函数的功能代码的注释已经概括的很明确。9ArpHandler•ArpHandler所实现的接口有Ihostfinder,Ilistendatapacket,Icacheupdateaware,•如前在所介绍的,其没有全局的实现,不会在启动过程中,配置Component,其会在先而会在ContainerManager,启动后,调用在调用configureInstance,配置依赖关系。bundle启动过程中导出这个接口,并通过Createservicedependency()生成服务依赖对象。其所依赖的对象,都是其它budnle所导出的接口,如依赖于SAL层的DataPacketService,DijkstraImplementatio,这个模块中所导出的Irouting接口,负责寻路。完成对ARP报文的处理。SAL服务抽象层主要作用将服务抽象出来,不管控制器和网络设备之间使用何种协议,提供协约国的一服务,是odl的核心设计,支持多种南向协议,为各模块和应用提供一致的服务,这些服务的实现,是由插件公开(基于已存在的组件(如OF)和网络设备的功能))的所提供的接口,但是与SAL是松耦合的。具体将请求,映射到相应的插件,完成服务。所提供服务•DataPacketServices为数据报文的处理,提供服务•TopologyService为应用提供节点和链路的更新信息,•Inventoryservice为如节点或者节点连接提供API查询•FlowProgrammingService流编程服务•Resourceservice资源服务,对于一个Packet-in的处理过程•OF中的核心,Controller南向设备通信的控制台,与Flooodlight中的Controller类功能类似,相对简化,Of报文首先到达Controller,会将此报文发送对已经注册过监听of报文的类中进行处理,其中DatapacketMuxDemux只处理packet-in报文,其会进一步处理,交由处理DiscoveryService(处理的是LLDP),其后,交给实现了IpluginoutdatapacketserviceSAL层处理,最后交给实现了Ilistendatapacket监听报文的应用。这与Floodlight处理报文的过程同。DataPacketservices•举例来说报文的简单处理过程•首先OF组件收到APR,需要交到ARPHandler处理,•将首先根据类型,调用IPOPS到SAL,交由SAL层•Sal中的datapacketservice实现了IPOPS•其会通过dispacthPacket()方法,•其会调用实现IListendatapacket的应用,•最后会将其送到ARPAPP处理。TopologyService•如前面所讲,报文经Controller处理后,,DiscoveryService收到报文,因为其实现了Idatapacketlisten,所以其能在DataPacketmuxdemux中处理of报文的过程中,处理这个链路processDiscoveryPacket()报文。交给实现了idiscoverylistener,的TopologyserviceshimImplementsIdiscoverylistener,•在这个类中,有个进程,一直在运行着,一但有更新,就会,将其notifyedge(edgeEdge,UpdatetypeType,SetpropertyProps)•而后,其交给监听了Itopologyserviceshimlistener,将其交给topologyservices,处理,交给SAL层的Topology类,这个会调用IListenTopoUpdates遍历监听数组。s.edgeUpdate(topoedgeupdateList);MD-SALMd-SAL分析•Md-sal的主要功能是促进提供者和使用者之间的管道。它可以提供提供者和使用者之间的管道在不同的容器中。它将连接到一个消息总线和共享数据存储的集群opendaylight容器。•提供者或消费者在md-sal中注册。从而,一个消费者可以找到所需的供应商。提供者可以生成通知,消费者可以接收通知,并从提供者获取数据。•插件sal角色(消费者或生产者)定义的sal中的数据是被移走或存储数据。提供者可以将数据存入sal的,一个消费者可以从sal读取数据。•Md-sal提供请求路由和基础设施服务,以支持服务,但它不提供服务本身;由插件提供服务。•Yang使得Componet之间、plugin、北向等api,使得这种接口和ad-salREST接口相比更抽象,符合模型驱动(MD)的思想。16MD-SAL架构Broker功能:1.consumer&provider注册2.PRCs路由3.Notificationhub4.系统状态访问和修改TheConsumer&ProviderBindingisgeneratedfromYANGschema.通过BindingIndependentConnector类Md-sal-Bundles之serviceTrackerAbstarctBrokerAwareActivatorImplBundleActivator为基Bunddle;每个Md-SAL的Consumer,Provider分别继承AbstarctBrokerAwareConsumer;AbstarctBrokerAwareProvider;在这个类中有个BindAwareBroker,这个是MD-SAL层的核心•Start方法中startImpl(context);然后新建一个ServiceTracker(BindAwareBroker).open后,后会追踪服务;当有服务注册时,OSGI会触发addingservice();在本实现中,即BindAwareBroker这个在OSGI中实现后,会通过context.getService(getService(servicereference(bindingawarebroker))得到BindAwareBroker的实现,得到后会新建一个线程;onBrokerAvaiable(broker,context);AbstarctBrokerAwareConsumer在这个方法中,完成Consumer的注册,会broker.RegisterConsumer(this,cotext);BingAwareBroker提供三种InfrastructureService,•YangModuleServiceGetPpcService(class);•NitificationServiceNotificationservice•DataStoreAccessAndModificationDatabrokerservice•在其实现中,会初始化这三种服务,并注入其实现,然后在为OSGI中注册;•然后在前面通过addingservice()中很到的getService(servicereference(bindingawarebroker));中得到其它注册来的borker;得到后,会将Consumer注册到这个broker中,得到ConsumerContext,后调用各自Consumer的onSessionInitialized(ConsumerContext);其中会通过getPrcService与getSALservice得到这三类服务;BindingIndependentConnector这个类,主要负责与BA与BI之间的交互过程;完成BA到BI,与BI到BA的过程;在其成员变量中,有MapingService;及BA与BI的服务,LearningSwitch•Learningswitch继承了Abstractbindingawareconsumer在Onsessioninitialized(){}Learningswitchmanagermu