五、OpenDaylight应用基础开发(MD-SAL Notification)

本文探讨了MD-SAL中的Notification实现,基于Disruptor高效处理机制,介绍了如何配置和使用Notification服务接口,以及如何通过Blueprint在OpenFlow PacketIn消息监听和 Yang定义的notification发布中应用。涉及的关键技术包括Blueprint配置、ODL扩展和通知监听器的注册。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 MD-SAL Notification简介及实现原理

可参考文章:https://blog.youkuaiyun.com/yinqingwang/article/details/53765496

1.1 Notifications简介

模型驱动(MD-ModelDriving)的方式,其中模型指的是YANG模型,YANG模型定义了通知(Notification)和远过程调用(RPC)的标准格式。Opendaylight中通知(notification)的实现方式简介如下:
通知(notification)是一种发布订阅/模式(Publish/Subscribe)。发布者发布通知,接收者接收通知,从而实现消息的交互功能。定义了YANG模型后,ODL会自动生成相应的Java代码。

Notification相比较与rpc,rpc是请求响应机制,Notification属于发布与订阅机制,松耦合。

提供者发送的组播消息,该消息会发送给所有订阅的消费者(multicast message which is send by provider and is delivered to subscribed consumers)

1.2 Notification实现原理- Disruptor简介

  • Disruptor 是实现了"队列"的功能,而且是一个有界队列,也可以被看作是一个轻量级的消息中间件,所以它的应用场景自然就是典型的"生产者-消费者"模型的应用场合
  • Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架

1.3 Disruptor实现特点

在这里插入图片描述
通过序号取模获取位置。
set只是将数据的更新,节省new的开销,节省GC的开销。
无锁的机制对性能有个数量级的增加

1.4 配置

在这里插入图片描述
等待策略:首先按照spin time进行while循环,如果在这个时间段没有新的数据,就会调用thread.yield()放弃当前线程操作,再执行park time等待时间时间,还没数据的话,才会thread.sleep()放弃对CPU的占用。这样就能满足CPU不要百分百被循环占满,又能满足高效的取数据。

2 MD-SAL Notification服务接口介绍

获取服务发布消息

消息发布服务的接口
<reference id="notificationService" interface="org.opendaylight.controller.md.sal.binding.api.NotificationPublishService"/>

void putNotification(Notification notification) ;
ListenableFuture<?> offerNotification(Notification notification); //等待队列空闲
ListenableFuture<?> offerNotification(Notification notification, int timeout, TimeUnit unit)

2.1 监听实现

订阅notification
将我们的实现类注册到NotificationListener中订阅

Notification Yang定义
notification toasterOutOfBread {}
notification toasterRestocked {
   leaf amountOfBread {
          type uint32;
  }
}

NotificationListener接口
public interface ToasterListener extends NotificationListener {
   void onToasterOutOfBread(ToasterOutOfBread notification);
   void onToasterRestocked(ToasterRestocked notification);
}

2.2 注册Notification监听器

<bean id="kitchenService" class="org.opendaylight.controller.sample.kitchen.impl.KitchenServiceImpl"          init-method="register" destroy-method="unregister">    <argument ref="toasterService"/>  </bean>
<odl:notification-listener ref="kitchenService"/>

3 背景知识-Blueprint

Blueprint是OSGI的一部分

先介绍下OSGi服务层
bundleContext.registerService(interface,instanse,metadata)
bundleContext.getServiceReference(interface);
	bundleContext.getService(ref);
ServiceListener—不能监听之前的
ServiceTracker

Blueprint是针对OSGi的依赖注入解决方案,用法非常类似Spring。当使用服务的时候,Blueprint会马上创建并注入一个代理(Proxy)。对这些服务进行调用时,如果服务在当前不可用的话,将会产生阻塞,直至能够获取到服务或超时。

3.1 blueprint配置标签

bean:对定义的类实例化
reference reference-list :获取到一个OSGI的服务
service:发布一个OSGI的服务

3.2 ODL Blueprint Ext(扩展)

odl:type 发布一个OSGI的时候可以指定一个type,通过type不同来区分同一个服务接口的不同实现
odl:rpc-implementation 注册rpc
odl:rpc-service 获取rpc
odl:notification-listener 监听订阅notification
odl:clustered-app-config – odl:default-config 配置

配置使用介绍:http://www.deepsdn.com/archives/36
ODL Blueprint Ext实现代码:controller/opendaylight/blueprint

3.3 ODL Blueprint配置注意点

!!配置注入的变量名在类定义中,首字母一定要小写,不能大写!!
使用blueprint配置后,pom中不能有Bundle-Activator配置
两个Blueprint配置文件中的服务不能相互依赖

4 开发实战

  1. 注册监听OpenFlow的PacketIn消息,收到消息后打印消息类型,订阅notification
  2. 用Yang定义一个notification,发布notification

4.1 注册监听OpenFlow的PacketIn消息

PacketProcessingListener是OpenFlowPlugin中定义的一个Notification。
注册监听notification就要实现这个Listener,实现处理PacketIn的这个方法。
在这里插入图片描述
在这里插入图片描述
实现Listener接口,在blueprint中注册进去,这样就可以在监听的方法里做出一些处理
在这里插入图片描述

4.2 用Yang定义一个notification发布给其他服务使用

发布一个notification就要构造notification消息,构造之后通过odl提供的notification push services来发布
首先定义yang
在这里插入图片描述
然后生成一个Listener,实现这个Listener就可以实现订阅,监听这个notification
在这里插入图片描述
构造notification消息
在这里插入图片描述

最后发布这个notification:
首先获取osgi发布的服务,然后注入到我们的发布类中
在这里插入图片描述

在这里插入图片描述
我们可以订阅这个notification进行处理
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值