0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenDaylight中的RPC & Notification是什么

汽车电子技术 来源:码农与软件时代 作者:码农与软件时代 2023-02-14 15:15 次阅读

本篇作为MD-SAL核心内容的第三篇,我们将介绍RPC和Notification,并从进程内外的通信开始,着重介绍远程过程调用和发布-订阅机制,然后分析MD-SAL的通信交互过程。

图片

图片来自网络

一、通信基础

我们在编写单体程序的代码时,通常关注的是类和类之间关系的设计、类内的方法以及方法间的调用关系。在跨系统调用时,我们通常需要关注系统调用的接口,并根据接口文档进行编程,此时,涉及到跨系统、跨进程的调用。有关进程内外的通信分类大致如下:

图片

单体程序代码通常是进程内通信,也就是本地过程调用,在同一CPU、同一内存空间进行。进程间通信最原始的莫过于Socket通信,但写起来相对于比较麻烦,人们希望能够“简单地”编程,后来基于“如何实现分布式计算的编程?”这一课题,在论文《Implementing Remote Procedure Calls》中给出了方案,即“调用远程机器上的程序就像在本地机器的地址空间中一样。隐藏分布式环境重要的部分:对参数和结果的编解码、消息传递以及保留过程调用的语义”,提出了RPC的解决方案。

间接通信的本质是“中介者”通信,是一种“间接”通信。它使得发送者和接收者不需要知道彼此的身份,并且不需要两者同时在线,一方不在线的情况下也可以通信,实现了空间上和时间上的解耦。间接通信比较流行的技术有:

l发布-订阅系统:“中介者”;

l消息队列系统:发送者发送消息到队列中,接收者从队列中提取消息。

1.远程过程调用RPC

1.1基础

RPC系统由User、User-stub、RPCRuntime、Server-stub和Server等5部分组成。其中,User、User-stub和RPCRuntime的实例在Caller machine上执行;Server、Server-stub和RPCRuntime实例在Callee machine上执行。简单调用的交互过程:

①User发起一个远程调用,则调用user-stub;

②user-stub负责封装方法和参数放置,并放置到一个或多个包中,然后请求RPCRuntime;

③RPCRuntime将这些包可靠地传输给被调用者机器,同时,调用进程被挂起并等待结果包的返回;

④Server的RPCRuntime将包传送给Server-stub;

⑤Server-stub解包,并本地调用会调用Server中相对应的程序逻辑;

⑥Server的逻辑执行完成,则将结果返回给Server-stub打包;

⑦Server-stub将结果传给RPCRuntime;

⑧Server的RPCRuntime将包将被传送回给User machine;

⑨User machine进行解包,User得到返回结果。

图片

1.2 RPC框架

图片

2.发布-订阅(publish-subscribe)

我们通过发布订阅的一个开源实现Kafka来讲述发布-订阅机制。Kafka是一种高吞吐量的分布式发布订阅消息系统。如下图所示,producer发布消息,consumer从消息队列中获取消息,broker用来接收发送的消息并将这些消息路由至队列中。生产者将数据发布到他们选择的主题。 生产者负责选择分配给主题中哪个分区的记录。

图片

而消息是由Topic(主题)的形式组织起来的,一个Topic可以有0、1或多个consumer订阅。对于每个Topic,又可分为多个Partition(分区)。每个分区都是一个有序的,不可变的序列。 如下所示:

图片

Partition中的每个记录都分配了一个称为偏移的顺序ID号,它唯一地标识每个记录。如下所示:

图片

二、 MD-SAL ** RPC**

2.1.RPC定义

RPC采用YANG语言建模,使用“rpc”语句建模。我们以OpenDaylight示例-Toaster为例介绍:rpc make-toast定义RPC操作的方法名、input用于定义RPC操作的输入参数、output用于定义RPC操作的输出参数。如下图所示:

图片

2.2.代码编写

1.生成代码

YANG文件定义好之后,我们执行命令:mvn clean install,可自动生成:

l ToasterService:接口文件,定义与yang数据模型定义的RPC方法;

l MakeToastInput:提供make-toast调用的输入参数。

l MakeToastInputBuilder:用于创建MakeToastInput实例的具体类。

2.实现接口

编写OpenDaylightToaster实现ToasterService接口,添加makeToast函数代码。

图片

3. 注册RPC服务

使用blueprint注册RPC服务。

图片

  1. 调用makeToast服务

我们可以使用POSTMAN测试工具,或者编写应用APP调用makeToast函数,调用的请求为:

请求方法:POST

URL地址:http://localhost:8080/restconf/operations/toaster:make-toast

请求Body体:

图片

2.3 小结

从RPC的定义和代码编写不难看出,RPC的定义通过YANG语言来建模,RPC的访问可以通过RESTCONF协议进行,RPC的提供者通过blueprint来注册RPC服务。

三、MD-SAL Notification

3.1.Notification定义

在支持NETCONF协议的网络中,网络设备使用Notification消息向网络监控发送通知事件以说明网络设备的某种状态。OpenDaylight也采用了Notification消息通知,它被设计为一种发布/订阅模式。同样,我们以OpenDaylight示例Toaster来说明该机制。

在示例Toaster中,烤面包机不仅能烤面包,还能在没有面包的情况下,发送一个toasterOutOfBread通知,告知消费者现已无面包可烤。我们在YANG文件中定义这个通知,如下图所示:

图片

3.2.代码编写

1.生成代码

YANG文件定义好之后,我们执行命令:mvn clean install,可自动生成:

l ToasterOutOfBread:为toasterOutOfBread通知定义DTO接口。

l ToasterOutOfBreadBuild:用于创建ToasterOutOfBread实例的具体类。

l ToasterListener:实现烤面包机通知消费者的接口,定义每种通知类型的接收方法。

2.生产者实现通知

图片

3.生产者实现配置

OpenDaylightToaster需要访问MD-SAL的NotificationPublishService才能发送通知。 我们需要在blueprint文件中注入OpenDaylightToaster:

图片

4.消息者实现

我们来看下如何从控制器中以编程方式访问ToasterService,实现消费者KitchenService。示例中采用了“硬编码”的方式。如下所示:

图片

接下来,我们修改KitchenServiceImpl以实现ToasterListener接口和通知方法。

图片

KitchenServiceImpl需要在MD-SAL的NotificationPublishService中注册才能接收通知。 我们需要配置blueprint文件:

图片

这样就可以OpenDaylightToaster在发生OutOfBread事件时发送通知。

图片

3.3 小结

Notification采用的是发布订阅机制,本例中生产者为OpenDaylightToaster,消费者为KitchenServiceImpl,中间代理为MD-SAL,具体为YANG和NotificationPublishService。如下图所示:

图片

ToasterService接口通过YANG模型构建自动生成,OpenDaylightToaster是该接口的一个具体实现,通过blueprint实现关系的绑定。KitchenService理应采用YANG模型构建,但示例中采用的是硬编码的形式,在KitchenServiceImpl中直接声明ToasterService对象,如图中的①和①ɑ所示。无论是生产者还是消费者,都需要NotificationPublishService来进行消息的发布和订阅。

四、总结

文章写到这里,就将YANG、DataStore、RPC和Notification这3个在MD-SAL中非常重要的点讲述完了,在支持NETCONF协议配置的网络,还涉及到需要将网络设备的Yang文件mount到控制器以实现基于NETCONF的控制。下一篇我们将MD-SAL的各个点串联起来,形成一条线。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信
    +关注

    关注

    18

    文章

    5706

    浏览量

    134407
  • RPC
    RPC
    +关注

    关注

    0

    文章

    102

    浏览量

    11424
  • sal
    sal
    +关注

    关注

    0

    文章

    2

    浏览量

    2460
收藏 人收藏

    评论

    相关推荐

    鸿蒙OS跨进程IPC与RPC通信

    使用Proxy表示服务请求方,Stub表示服务提供方。 约束与限制 ● 单个设备上跨进程通信时,传输的数据量最大约为1MB,过大的数据量请使用匿名共享内存 ● 不支持在RPC订阅匿名Stub对象(没有向
    发表于 02-17 14:20

    R&S ZNLE矢量网络分析仪的主要特点及应用优势

    R&S®ZNLE 矢量网络分析仪契合“Measurements as easy as ABC”的标语: 易于配置、易于校准、易于测量。 闻名遐迩的优质设计、创新的用户界面以及紧凑尺寸使 R&
    发表于 12-09 09:29 1177次阅读

    R&S FSC3台式频谱分析仪的主要特点及应用范围

    罗德与施瓦茨的R&S®FSC是一款高性价比,小体积的台式频谱分析仪,它具备罗德与施瓦茨一贯的高品质,可以满足所有重要的频谱分析任务。R&S®FSC应用范
    发表于 12-09 09:41 919次阅读

    R&S FSL6台式信号分析仪的功能特点及应用范围

    R&S®FSL 是一款多功能而且经济实用的信号分析仪。R&S®FSL全系列标配28MHz的信号解调带宽,远高于其他同类产品。无论是频谱、噪声系数、ACL
    发表于 12-09 09:46 1126次阅读

    欧拉 Summit 2021 安全&可靠性&运维专场:主流备份技术探讨

    在openEuler Summit 2021 安全&可靠性&运维专场上,高冲对为数据安全而生,统信软件备份还原工具分享。
    的头像 发表于 11-10 17:42 1548次阅读
    欧拉 Summit 2021 安全&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;可靠性&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;运维专场:主流备份技术探讨

    串口mpu6050 &amp;&amp; 透传模块(LC12S_V2)教程

    软硬件1.串口mpu6050 &amp;amp;&amp;amp; 串口模块 &amp;amp;
    发表于 12-06 15:36 5次下载
    串口mpu6050 &<b class='flag-5'>amp</b>;&<b class='flag-5'>amp</b>; 透传模块(LC12S_V2)教程

    存储类&amp;作用域&amp;生命周期&amp;链接属性

    目录前言一、存储类&amp;amp;作用域&amp;amp;生命周期&amp;amp;链接属性的
    发表于 12-09 15:51 5次下载
    存储类&<b class='flag-5'>amp</b>;作用域&<b class='flag-5'>amp</b>;生命周期&<b class='flag-5'>amp</b>;链接属性

    嵌入基础:&amp;,|,^,~,<<,>>运算符使用

    &amp;,按位与功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位都为1时,结果位才为1。参与运算的两个数均以补码出现。1&amp;1=11&amp;0=00&amp;1=
    发表于 01-12 20:38 0次下载
    嵌入基础:&<b class='flag-5'>amp</b>;,|,^,~,<<,>>运算符使用

    ATT7053典型应用原理图&amp;PCB&amp;BOM

    ATT7053典型应用原理图&amp;PCB&amp;BOM免费下载。
    发表于 06-14 14:20 22次下载
    ATT7053典型应用原理图&<b class='flag-5'>amp</b>;PCB&<b class='flag-5'>amp</b>;BOM

    A2B车载音频总线-车机音频&amp;amp;amp;麦克风阵列测试

    基于美格信系统的A2B车载音频总线-车机音频&amp;amp;麦克风阵列测试应用笔记
    发表于 09-19 11:04 2445次阅读
    A2B车载音频总线-车机音频&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;麦克风阵列测试

    如何区分Java中的&amp;amp;和&amp;amp;&amp;amp;

    首先给i赋值为0,如果i大于10,并且i++等于1,则输出“错误”和i的值。否则输出“正确”和i的值。分别用&amp;和&amp;&amp;运行,观察运行结果的不同。
    的头像 发表于 02-24 10:46 1226次阅读
    如何区分Java中的&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;和&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;

    if(a==1 &amp;amp;&amp;amp; a==2 &amp;amp;&amp;amp; a==3),为true,你敢信?

    接下来咱们来尝试解决这个问题。假设 if(a==1&amp;&amp;a==12)是等于 true的,那么a肯定不可能是一个“普通的变量”。它势必要有能力在执行的时候能够动态改动值。
    的头像 发表于 05-08 11:01 755次阅读
    if(a==1 &<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>; a==2 &<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>; a==3),为true,你敢信?

    HarmonyOS &amp;amp;amp;amp;润和HiSpark 实战开发,“码”上评选活动,邀您来赛!!!

    出色的系统 助力优秀的设备 为应用开发者带来丰富的体验与想象空间 正如当HarmonyOS遇见润和HiSpark 这万物互联的时代 将由你的&amp;lt; 代码 &amp;gt;来定义
    的头像 发表于 04-11 15:33 831次阅读
    HarmonyOS &<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;润和HiSpark 实战开发,“码”上评选活动,邀您来赛!!!

    你使用shell脚本中的2&amp;gt;&amp;amp;1了吗?

    run_cmax > ./starrc_cmax.logs 2>&amp;1中的 2>&amp;1是啥意思?
    的头像 发表于 07-30 14:44 1071次阅读

    摄像机&amp;amp;amp;雷达对车辆驾驶的辅助

    摄像机&amp;amp;雷达担负着可辅助驾驶员安全驾驶的、高级驾驶辅助系统的传感功能。尼得科正在进一步推进摄像机&amp;amp;雷达的高性能化进程。
    的头像 发表于 11-26 10:02 520次阅读
    摄像机&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;雷达对车辆驾驶的辅助