面向服务的通信中间件的研究与应用

2023-10-31 06:58
信息记录材料 2023年9期
关键词:序列化服务端调用

伍 新

(航空工业西安航空计算技术研究所 陕西 西安 710068)

0 引言

在嵌入式领域,软件通常采用单体架构,在该架构下,开发者能够在软件系统设计的同时设计各个电子控制单元(electronic control unit, ECU)的通信系统;嵌入式系统处理的数据量相对较小,对带宽的依赖也较小,一般采用控制器局域网总线(controller area network, CAN)面向信号的方式来设计通信系统[2]。

随着芯片工艺和通信技术的发展,软硬系统的处理能力进一步提升,业界为解决单体架构可扩展性差的瓶颈,将互联网技术领域中面向服务的软件架构(service-oriented architecture, SOA)引入嵌入式领域[3],SOA是面向服务的架构,整个系统由一个个服务组装而成,各服务内部体现为高内聚特性,服务之间则是体现为低耦合特性[4],因其高内聚、低耦合、拓展性强等特性,为单体架构的拓展性差、维护成本高的问题提供了一种可行的解决方案。以太网因其具有应用广泛、通信速率较高、成本低廉和可持续发展潜力大等优势[5]备受开发者青睐,为了解决网络数据处理的技术瓶颈,将以太网应用于该领域,鉴于可扩展性和以太网相适应的需求设计了SOMEIP。

1 SOMEIP特点与通信机制

SOMEIP采用客户端服务器的通信架构,客户端可根据服务接口类型,使用远程服务调用机制,通过数据序列化与反序列化使得数据可以在网络中传输,通过服务发现机制来动态地获取可用的服务实例,通过发布订阅机制来管理服务的发布与订阅关系。该协议隶属于应用层,且紧靠传输层,为具体业务逻辑提供调用接口,同时提供数据的封装与解封功能。

面向信号的通信,消息发送方会将发送内容放到一个缓冲区中,缓冲区的数据会按照CAN总线配置的周期发送至对端缓冲区,待对端使用数据时就从缓冲区中取出。该设计未考虑数据的供需关系,可能造成负载过重。面向服务的通信,则是规避了这一缺陷,实现了按需通信,同时为避免对同一服务的多次调用,提供了发布订阅机制,实现了一次订阅,多次接收。

此外SOMEIP作为通信中间件,实现了业务逻辑与底层通信之间的解耦,上层业务的扩展不会影响底层通信的运行,具有很好的扩展性。

1.1 SOMEIP特点

SOMEIP的特点是采用面向服务的设计模式,将原有的功能模块抽象成一个个具体的服务,ECU在需要某项功能时,可以通过它来跨ECU异步调用具体服务。其核心优势包括:(1)满足嵌入式领域对软硬件资源的限制。(2)具有很好的兼容性,如文献[6]给出的SOMEIP与CAN之间的数据转换。(3)可从小平台扩展到大型平台,可以在不同的操作系统上实现,甚至可以在没有操作系统的情况下实现。

1.2 通信机制

SOMEIP协议是以服务为单位管理数据信息的,服务由若干方法、事件和域构成。方法是服务的某项具体功能,是客户端调用的对象。事件用于发布订阅,可以周期性或者当事件触发时向订阅者主动发送信息,其内嵌一个消息结构,服务方可自定义所要发送的内容。域是针对服务中的某个具体属性而设计的,主要对外提供属性的获取、设置和通知接口,客户端可通过获取和设置接口实现对服务端属性值的获取与设置,当客户端订阅该域时,通知还可以像事件一样,主动提供通知,此两者的区别在于消费者在订阅域后,通知会主动通知消费者,而事件不会。

SOMEIP就这3种接口提供对应的通信机制,分别是基于方法通信、基于事件通信和基于域通信。其中基于方法通信又根据是否需要返回值而分为请求有回复和请求无回复2种。在基于方法通信中请求有回复和请求无回复的区别在于前者具有返回值,可以保证远程过程调用的正确性,而后者则是无返回值的,因此对于远程过程调用正确与否不得而知。其通信机制如图1所示。

图1 SOMEIP通信原理图

客户端与服务端在收发消息时,有多种通信机制,选择何种通信机制取决于消息类型的选择,协议定义的消息类型如表1所示。

表1 消息类型

对于请求有回复通信,客户端可创建REQUEST类型的消息,并得到服务端发来的RESPONSE类型的消息;对于请求无回复通信,客户端仅需创建REQUEST_NO_RETURN类型的消息,通过接口发给对端即可。至于事件通信和域中的通知,服务端会创建NOTIFICATION类型的消息发给订阅者。

2 VSOMEIP

VSOMEIP是SOMEIP的开源框架,实现了SOMEIP协议中提出的各项功能,该框架解决了微服务框架中注册中心单一而造成的单点故障问题。

2.1 VSOMEIP结构

VSOMEIP通过一个应用对外提供一套接口来给用户使用,在该应用中内嵌一个路由对象来实现该框架的核心功能。路由对象又分为主模式和代理模式,其中主模式下的路由对象充当注册中心和网关的角色,代理模式下的路由对象充当代理路由的角色,代理路由将核心业务发给主路由处理。在本地可以有多个应用,只有一个应用的路由对象是主路由,其他应用的路由对象是代理路由,可以通过配置文件设置主路由,默认第一个应用中的路由对象为主路由。其结构如图2所示。

图2 框架结构图

其中代理处理对象主要处理本地逻辑,远程逻辑则是通过服务发现对象生成对应报文并由主路由广播。

2.2 VSOMEIP工作机制

VSOMEIP采用的IP地址为基本端口+偏移量的方式,其中偏移量就是每个应用的ID值。主路由模式下的应用,在初始化时就获取了该ID,而其他应用在开始工作前需要向主路由注册,一方面是获取ID值,另一方面则是维护与主路由的连接。注册完成后,就可以回调对应的接口来进行后续逻辑,比如服务端执行服务以及事件的注册、客户端执行服务的请求调用与事件的订阅等。

服务端服务或者事件的注册都是向本地注册中心发送一个注册命令和注册信息,在注册中心生成对应对象并保存到对应列表中,区别在于服务注册后会通过注册中心的服务发现对象生成并广播发布报文而事件不会,原因在于事件在逻辑上是隶属于某个服务的,此外服务注册完成后还会利用本地的请求列表通知对应的请求者。

客户端请求某服务实例的具体方法以及订阅某事件都是通过应用来实现的,在初始化时会将自定义的函数绑定到应用对应结构中,等到条件满足时回调对应函数。对于本地逻辑,请求某个服务时会向主路由发送对应命令,主路由会告知对应服务的ID,然后客户端就可以发起连接并将消息发送到对端;对于远程逻辑则是通过服务发现对象生成并广播寻找服务的报文,获取到对应ID后在主路由端维护与远程服务的连接,客户端在调用时会先将消息发给主路由,然后通过该连接发送到远端。事件的订阅则是在事件的列表中添加对应应用的ID,本地与远程的区别在于本地只需要发送对应命令给主路由,而远程则需要主路由生成并广播对应报文。

2.3 服务发现工作机制

服务发现是实现远程服务发布发现以及事件订阅的功能组件,其核心任务是了解服务的状态和位置。当服务端与客户端不在同一机器时,则通过该模块产生并广播服务发现报文来完成。服务发现报文采用条目+选项的方式实现服务的远程发布与发现、事件的远程订阅与取消等功能。条目对服务发现的功能进行抽象,根据用于服务和事件分为2大类,其具体分类和功能如表2所示。

表2 条目类型及功能

选项是用来辅助条目实现其功能的,提供条目缺乏的一些辅助信息,主要用来告知对方本节点业务的IP和端口信息,以便对方能通过该地址进行通信。

3 应用案例

本小节结合VSOMEIP,设计了嵌入式设备蜂鸣器服务的案例,如下所示:

Classbuzzer_server{

Public:

Buzzer_server() :app_(vsomeip::runtime::get()->create_application()),

state(false),volume(0){}

Voidinit(){}}--------------//app_initandbindon_Xintovsomeip

Voidstart(){}--------------//app_start

Voidstop(){}-------------------//unregisteron_Xandapp_stop

Voidon_open(){}----------//F&Fopenthebuzzer

Voidon_close(){}---------//F&Fclosethebuzzer

Voidon_state(){}----------------//testtheAPPisregisterediftruethenoffer_service

Voidon_set_volume(){}--------//fieldsetter

Voidon_get_volume(){}---------//fieldgetter

Voidon_notify_volume(){}-------//fieldnotifier

Private:

std::shared_ptrapp_;

Boolstate;//stateupordown

Unsignedintvolume;//voicelevel

};

本案例中只有一个开关state和音量volume以及用于和VSOMEIP框架相连接的app_,默认开关是关闭状态,音量为0;buzzer_server接口是本案例的构造函数;init、start和stop接口分别是本案例的初始化和开关接口,在初始化过程中须先对app_进行初始化,且在app_初始化完成后需要将自定义的接口通过app_对应接口绑定到VSOMEIP框架以备后续回调处理,开关接口则是通过app_调用VSOMEIP的开关接口;on_open和on_close接口则是蜂鸣器的开关接口,用户可通过请求有返回值方式来开启和关闭蜂鸣器;on_get_volume、on_set_volume和on_notify_volume_change接口则是针对volume字段而设计的field,用户可通过请求有返回的方式调用前两个接口来获取以及设置音量大小,后者是一个通知接口,当音量发生变化时主动通知音量的订阅者。

4 框架总结

VSOMEIP的核心优势是实现了SOA,并解决了注册中心单点故障的问题,同时实现了SOMEIP协议中定义的服务的注册与动态发现机制以及发布订阅机制,实现了客户端与服务端之间的按需通信,降低了网络负载,解决了面向信号通信中数据处理规模较小,数据发送未考虑对端需求从而造成网络过载的问题,同时也实现了协议中消息头部的序列化与反序列化功能。

同时该框架也存在一些不足之处:一是它目前是依赖于C++,且不能自动生成代码;二是它缺乏对复杂数据类型的序列化与反序列化处理,需要手动按照协议来处理,对开发人员不太友好,可能会降低开发效率,该框架中对服务实例全生命周期管理并未实现。针对前者,可以引入一个中间层来过渡,例如可以采用诸如ProtoBuf这类插件来生成不同语言的服务接口,并在服务中内嵌一个VSOMEIP的应用来实现,对外可以支持多语言,底层还是采用C++;针对复杂接口序列化与反序列化问题,可以将复杂数据类型定义成json格式,然后使用boost中的属性树,将json转为属性树,拓展VSOMEIP消息处理接口,使其能够加载boost属性树。针对服务实例全生命周期的管理,则可以拓展原框架中服务注册接口,添加服务实例的生命周期,并设计一个接口,周期性地判断该服务实例生命周期是否归零,如服务实例到期,则可进行后续下线处理。

猜你喜欢
序列化服务端调用
如何建构序列化阅读教学
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
云存储中基于相似性的客户-服务端双端数据去重方法
新时期《移动Web服务端开发》课程教学改革的研究
在Windows Server 2008上创建应用
基于系统调用的恶意软件检测技术研究
Java 反序列化漏洞研究
作文训练微格化、序列化初探
利用RFC技术实现SAP系统接口通信