基于Thrift的RPC中间件在航天信息系统中的设计与实现

2018-01-05 01:01孔维萍蒋晓肖肖永利
计算机测量与控制 2017年12期
关键词:序列化中间件调用

杨 帆,孔维萍, 蒋晓肖, 肖永利, 虢 华

(上海航天控制技术研究所,上海 200233)

基于Thrift的RPC中间件在航天信息系统中的设计与实现

杨 帆,孔维萍, 蒋晓肖, 肖永利, 虢 华

(上海航天控制技术研究所,上海 200233)

随着互联网技术的发展,大数据存储技术日趋成熟,针对系统应用实施中存在的跨平台和可扩展性问题,分析了在航天信息系统中远程服务调用的几种技术方法,提出了基于Thrift技术设的一种跨平台可扩展的远程调用中间件,利用Thrift框架的技术特点,有效提高了可扩展性和高效传输性能;实际应用表明,该技术方案在跨平台可扩展性有显著优势,大数据传输性能优越,较好地满足信息化项目的需求。

Thrift;远程过程调用;航天信息化

0 引言

国家十三五以来,互联网、移动互联网、物联网等信息化技术高速发展,带动了航天军工系统的信息化应用,多数型号设备实验测试软件也逐步从单机单软、专机专用的定制化研发模式向通用化、信息化的技术发展。刘杰等[1]介绍了航天信息化工程中云计算方面的应用情况,胡明明等[2]探讨了航天系统中信息化通用标准体系的构建,马昌超等[3]介绍了航天信息化的建设模式。本文调研了主流互联网产品的应用情况,根据阿里巴巴公司的实时数据传输平台[4],以及Facebook的开源日志收集系统[5]等的信息技术研究,结合航天信息化系统应用背景,提出了一种基于Thrift框架的跨平台、跨语言的远程过程调用协议(remote procedure call protocol,RPC)方案,并在自研的信息化项目能源系统(energy mangement system,EMS)、试验管理系统(test data management system,TDM)中成功应用,取得良好的效果。

1 基于Thrift框架的远程服务调用分析

1.1 远程服务调用应用分析

目前,远程服务调用的技术实现方式大致可分为三类[6]:第一类,采用分布式对象技术;第二类,基于过程的服务调用;第三类,通过WebService服务调用方式。

分布式对象技术是最早期提出的一种实现方式,主要技术有:RMI(remote method invocation,远程方法调用)/EJB(enterprise java bean, JavaEE服务器端组件模型),COM(component object model,组件对象模型)/DCOM(distribute component object model,分布式组件对象模型)/COM+和OMG (object management group,对象管理组织)提出的CORBA(common object request broker architecture,公用对象请求代理体系结构)[7]。其中比较流行的技术是微软提出的COM/DCOM和OMG对象管理组织提出的CORBA。COM/DCOM/COM+是基于组件的对象模型,DCOM比COM技术支持更多的通信协议,而且在分布式处理性能优于COM,COM+则在延续COM技术的基础上增加了分布式网络应用程序的设计和实现[8]。CPRBA技术广泛应用在分布式产品中,解决了分布式环境下软硬件系统的互连问题。实际应用中,上述技术均要求客户端和服务端应用明确的同类型对象协议模型,在跨语言和可扩展性方面的应用有较高难度。

基于过程的远程服务调用主要指RPC,是基于客户端/服务器的分布式架构模型[9]。类似于本地API,部署在客户端的应用程序(Client)通过RPC的服务请求调用部署在在网络中某节点的RPC服务器端(Server)的服务。目前,主流的RPC技术有Facebook在2008年开源的支持跨语言特性的服务部署框架Apache Thrift,Hadoop创始人Doug Cutting领导开发的数据序列化系统Apache Avro以及Google发布的自动序列化、反序列化结构化数据的机制Protocol Buffers[10]。它们提供跨语言的序列化和通信支持,不仅解决了分布式对象技术的兼容性问题,同时在高并发,跨平台语言及大数据传输上有明显优势。

Web Service服务调用方式是通过Web访问实现,具有模块自包含和自描述特性的新型Web应用程序分支[11]。这种方式使用标准互联网协议,既是一种编程组件,又是一种远程服务调用方式。其中,HTTP协议为最常用的传输协议,最常见的消息交换方式为JSON-RPC、XML-RPC以及SOAP(Simple Object Access Protocol)等[12]。而Web Service在传输过程中携带的冗余信息多,在编码和解码xml文件上处理耗时也较高,因此,在处理信息系统的并发应用中对服务器的负载较高,导致性能较低[13]。

1.2 Thrift框架原理特点

经调研分析,Apache Thrift、Apache Avro 以及 Protocol Buffers 这3种主流的新型RPC框架在大数据传输、大规模并发调用中性能优异,尤其适合应用于云计算。考虑信息化系统中的对可扩展性,高并发和数据体量等方面的要求,进一步分析比较3种RPC技术方式的特点,得出Thrift框架最适合应用在信息化系统这种大型的的数据通信中间件搭建中,本文提出采用基于Thrift的RPC框架进行信息化系统中数据通信的中间件的设计方案。Thrift的框架结构如图1所示。

图1 Thrift框架技术结构示意图

如上图所示,Thrift 框架主要由4个部分组成,从上至下分别是应用层、框架层、协议层以及传输层。用户在应用层对业务逻辑进行自定义。Thrift的IDL对用户定义的应用层数据结构进行编译,生成Server/Client端代码框架和读写操作,即图中FooService.Client和Foo.Write()/Read()。TProtocol是负责管理不同类型数据编码方案以及序列化和反序列化的协议。TTransport用于实现数据传输的传输层,底层I/O通信负责实际的数据传输。

基于Thrift框架的通信协议,是通过内部序列化机制对数据进行简化,将数据以对象形式进行传输,本地Client端通过过程声明来调用远程Server端的方式实现数据的交换,提高了传输效率,降低了通信成本。Thrift结合其功能强大的软件堆栈和代码生成引擎,可以构建在C#,C++,Java,Python,PHP,Ruby,JavaScript,Perl等编程语言间实现高效无缝的服务[14]。Thrift软件框架支持的数据类型如表1所示。

service对应服务的类Thrift协议层通过数据的序列化和反序列化机制,如JSON, XML, Plain Text, Binary, Compact Binary 等,抽象数据结构的定义。传输协议主要分为文本和二进制两大类,为提高传输效率,大多数传输协议采用二进制类型,常用的TProtocol通信协议如表2所示。

常用Thrift框架传输层如表3所示几种。

常见的服务端类型如表4所示。

表1 数据类型表

表2 通信协议类型表

表3 传输层定义表

表4 服务端类型表

综合分析比较,以Thrift 框架作为信息系统通信中间件设计架构的主要技术解决方案,主要有以下优势特点:

1)跨平台语言,可扩展性强。Thrift框架支持包括主流的C++ 、Java 、C# 、Python 、PHP 、Ruby 、JavaScript 及Coaca 、Smalltalk、OCaml 等十余种编程语言,有效实现基于不同开发语言的应用系统的Server端和Client端无缝连接和数据交互,大大提高信息化系统的可扩展性。

2)高效性:相较于传统的 XML 和 JSON 格式和一般二进制数据编码格式而言, Thrift 具有更高效数据传输方式,支持更多类型对象进行序列化和反序列化,耗能更少。

3)易用性:Thrift框架更容易被研发人员理解并应用。用户使用Thrift 框架时,定义好描述数据传输协议、数据类型和服务的接口文件后,使用Thrift提供的编译器即可自动生成远程过程调用中间件的Server和Client端实现,协议层和传输层代码也自动生成。因此,用户无需手动编写基于不同语言、不同系统结构的通信中间件代码文件,只需维护统一的接口文件即可。

2 两种Thrift的RPC中间件实现

基于Thrift 框架的数据调用中间件实现主要分三步。首先要定义数据传输对象的标准格式,并定义接收或者发送数据的接口。Thrift框架支持多种类型数据传输,可以是原始数据字节类型数组,基于MySQL 的查询计算结构,也可以是文件数据流。第二步,通过Thrift 代码生成引擎为各系统生成数据接口的底层实现。第三步,实现具体产品测试数据传输的业务功能。数据标准格式和服务接口格式是通过Thrift 文件来描述的,该文件定义了数据的各项信息以及接口函数的原型。Thrift 根据该文件会生成特定版本的数据接口实现,开发者只需关心数据传输的业务。Thrift 引擎也可以编译出不同的语言版本,从而实现跨语言跨平台的调用。本节分别以Java 和 C#编程语言为版本介绍基于Thrift 框架中间件部署方法实现。

2.1 基于 Java的实现

本节以Java 语言为例,介绍Thrift 软件框架应用实现。实现中间件 Client端和 Server端部署时,需要在开发环境中引入libthrift.jar,log4j.jar 等公共jar 包,并编写创建Thrift 的IDL文档 Test.thrift ,执行thrift-0.9.3.exe -gen java Test.thrift 命令,调用Thrift编译器生成Test.java 公共文件,部署过程示意如图2所示。

图2 基于Java的Thrift框架部署图

如图2所示,Client端调用Server端的 TestServiceClient.java 代码。Server端的 Process 类对象实现RPC请求处理的核心Test.Iface 接口,并启动TestServiceServer.java。Server 端和Client 端利用 Test.java 提供的API进行远程服务调用。

Thrift服务器端的流程如下:

1)创建服务端口通道(TServerTransport);

2)确定传输协议(TProtocolFactory);

3)创建数据处理器 (Processor);

4)创建数据传输协议(Protocol);

5)基于Processor、TProtocolFactory和TServerTransport创建服务器模型(Server);

6)运行Server。

此处框架的服务端采用高效密集的二进制编码格式 TCompactProtocol 进行数据传输,Server端代码示例如下:

public static void main(String[] args) {

try {

TServerTransport serverTransport = new TServerSocket(7911);

TProtocolFactory proFactory = new TCompactProtocol.Factory();

TMultiplexedProcessor processor = new TMultiplexedProcessor();

processor.registerProcessor("Test",new Test.Processor

(new Test.Impl()));

TServer server = new TThreadPoolServer(new Args(serverTransport).protocolFactory(proFactory).processor(processor));

System.out.println("Start server on port 7911...");

server.serve();

} catch (Exception e) {

/*异常处理*/

}

}

当服务需要处理大量数据更新时,Server 端使用 TThreadPoolServer 线程池服务模型,采用标准的阻塞式 I/O,预先创建一组线程处理请求,当有客户端连接过来时,从线程池里分配可用的连接处理客户端请求。

客户端通过调用服务端的方法传输定义好的 Test 对象。具体的步骤为:

1)创建数据传输方式(Transport);

2)创建数据传输协 议(Protocol);

3)创建客户模型(Client);

4)调用 Client 的相应方法。 核心代码如下:

public static void main(String[] args) {

try {

TTransport transport=new TSocket(ip, port);

Transport.open();

TProtocol protocol = new TMultiplexedProtocol(new TCompactPortocol(transport),"Test");

ProductTestInformationService.Client client = new Test.Client(protocol);

/* 服务端提供的接口方法*/

transport.close();

server.serve();

} catch (TException e) {

/*异常处理*/

}

}

2.2 基于C#的实现

基于C#语言实现信息系统中间件搭建时,需要在工程中引用Thrift开源框架编译生成的Thrift.dll,根据用户定义的Thrift 的IDL文档 Test.thrift ,执行thrift-0.9.3.exe -gen csharp Test.thrift 命令,调用Thrift编译器生成 Test.cs 公共文件,部署过程示意如图3所示。

图3 基于C#的Thrift框架部署图

Client端调用Server端的 TestServiceClient.cs 代码。Server端的实现Test.Iface 接口,并启动TestServiceServer.cs服务。Server 端和Client 端利用 Test.cs 提供的API 进行远程服务调用。由于C#语言的限制无法使用非阻塞的多线程服务端,此处使用 TThreadPoolServer 线程池服务模型,采用标准的阻塞式 I/O。工程中Server 端核心代码如下:

public void Start()

{

try

{

TServerSocket serverTransport = new TServerSocket(9090, 0, false);

//一个端口注册多个服务

TMultiplexedProcessor processors = new TMultiplexedProcessor();

Test.Processor testProcessor = new Test.Processor(new Test Impl());

processors.RegisterProcessor("Test", testProcessor);

//多线程服务器

TServer server = new TThreadPoolServer(processors, serverTransport);

server.Serve();

}

catch (Exception x)

{

/*异常处理*/

}

}

Server 端使用 TThreadPoolServer 线程池服务模型,创建一组线程处理请求,当有Client端连接请求时,为其分配可用的连接处理线程。

客户端通过调用服务端的方法传输定义好的 Test 对象。具体的步骤为:

1)创建数据传输方式(Transport);

2)创建数据传输协 议(Protocol);

3)创建客户模型(Client);

客户端核心代码如下:

static void Main(string[] args)

{

try

{

TTransport transport = new TSocket("localhost", 9090);

TProtocol protocol = new TBinaryProtocol(transport);

Test.Client testClient = new Client.Client(protocol);

transport.Open();

Console.WriteLine("Test Client Calls");

transport.Close();

}

catch (Exception x)

{

/*异常处理*/

}

}

3 应用实例

近年来信息化技术迅速发展,航天应用系统紧跟时代步伐,所内自主研发了能源管理系统(energy mangement system,简称EMS)、试验管理系统(test data management system,简称TDM)等多个信息化项目。针对信息化平台特点,本文基于Thrift 框架设计了灵活的跨语言数据通信远程服务调用中间件方案,有效解决信息化项目中各个系统技术架构迥异,协议开发难度大等问题。本文以EMS系统为例,将此方案在各信息化系统中进行广泛推广和应用。

能源管理系统是响应国家 “十三五”号召,全方面为实现“指标能分解、责任能落实、监管能有效、考核有实效”目标,践行人人参与的节能减排,以信息化技术,科学实现能耗减排而自主研制的信息化系统。能源管理系统为航天研发,产品生产的节能用能管控提供良好的信息化管控手段,改变既有的人工干预管理的方式,采用硬件与软件结合,通过实时高效的采集电、水等计量仪表设备的数据,进行数据整理和统计分析,通过数据建模和图表绘制,以信息化手段进行数据管理,为能源的监控和管理提供强有力的数据支撑,及监管条件,有效实现精细化管理,提高工作效率。系统提供数据预警及设备报警功能,能随时发现跑、冒、滴、漏,有效地保证工业生产中的能源的高效利用,杜绝能源浪费。EMS系统组成结构如图4所示。

图4 基于Thrift的EMS框架示意图

能源管理系统中数据存储层是采用C#语言实现,前台B/S端采用Java语言实现,本文提出的基于Thrift框架设计的远程调用中间件,有效的解决此类异构系统的接口服务调用问题,设计人员只需定义好数据传输对象格式,无需针对编程语言的差异额外开发协议转换模块,大大降低系统开发时间,提高开发效率。

能源管理系统中使用Thrift 框架技术作为B/S应用层、数据采集提取层与数据存储中心的服务调用中间件,根据系统数据通信协议定义的对象服务IDL文件,通过Thrift提供的编译器生成接口代码。当前台用户在界面上通过Client端发起服务请求时,服务注册组件寻找业务的绑定信息并获取指定链接,调用Server端的服务,继而Server端返回调用结果,展现给用户。Thrift技术是整个业务调用的关键桥梁,为远程服务调用提供可靠性能保障。

4 结束语

本文通过分析常用的几种远程服务调用方法,提出基于Thrift 实现的RPC 中间件方案,并应用在航天信息化系统建设中,并以C# 和Java 两种语言构建典型的Server/Client应用,展示了Thrift 框架的使用。信息化系统架构中数据通信中间件通过Thrift 框架的跨平台跨语言以及数据高效传输等特点,提高信息化系统的可扩展性,大大降低系统的研发成本。相较于基于传统的WebService 的解决方案,实施难度更低,研发成本更小,且具有更高的传输效率,尤其在大数据交换和存储方面表现优异,在信息化系统的实施中具有良好的应用前景。

[1] 刘 杰, 丁向峰, 柴旭东,等. 云计算在航天信息化工程中的应用与探讨[J]. 军民两用技术与产品, 2011(10):12-14.

[2] 胡明明, 杨前进, 段 晓. 航天器信息化标准体系构建初探[J]. 航天标准化, 2015(1):18-22.

[3] 马昌超, 陈金兰. 航天信息化建设模式探讨[A].中国宇航学会计算机应用专业委员会2004年学术交流会,2004.

[4] 周 豪. 大数据量下的实时数据报表系统的设计与实现[D].北京:北京交通大学, 2016.

[5] 李 俊. 基于块聚集的MapReduce性能研究与优化[D]. 北京:北京交通大学, 2014.

[6] 李 洋. 云计算中可扩展的远程服务调用机制的设计与实现[D]. 哈尔滨:哈尔滨工业大学, 2012.

[7] 胡 珉,许占文,张 宇. 用 Java RMI 实现 JDBC 远程调用的介绍[J]. 沈阳工业大学学报,2003,25(1):65-68.

[8] David S. Platt. Understanding COM+ [M] :55-79.

[9] 孙统风,孟现飞,姜利群. 基于RPC 的Agent 通信模型及其实现[J]. 现代计算机,2003 (7):10-13.

[10] 史栋杰. 5种快速序列化框架的性能比较[J]. 电脑知识与技术,2010(34):9710-971.

[11] 程晓飞. 基于 REST 架构的 Web Services 的研究与设计[D]. 武汉:武汉理工大学, 2010(5):15-23.

[12] 许卓明,栗 明,董逸生. 基于 RPC 和基于 REST 的 Web 服务交互模型比较分析[J]. 计算机工程,1003,29(20):6-8.

[13] 袁 赟. Java 与 Restful Web Service.电脑知识与技术(学术交流)[J].2007,4(21):780-782.

[14] 周 康, 李 觊, 董科军,等. 一种基于Thrift的日志收集分析系统[J]. 科研信息化技术与应用, 2015(2).

Design and Implement of RPC Middle Ware Based on Thrift Frame in Aerospace Information System

Yang Fan, Kong Weiping, Jiang Xiaoxiao, Xiao Yongli, Guo Hua

(Shanghai Aerospace Control Technology Institute, Shanghai 200233,China)

With the rapid development of internet, big data storage technology is gradually maturing. This paper analyze and compare several popular remote service invocation mechanisms in aerospace information application, then proposed a remote service invocation middleware based on the Thrift framework, which has a better transmission performance and expandability. The application indicates that, based on these techniques, the middleware is effective and flexible to expand, satisfying the needs of the projects.

Thrift; RPC; aerospace information

2017-04-12;

2017-05-10。

杨 帆(1988-),女,硕士研究生,主要从事卫星地面测试系统以及信息化软件,大数据存储方向的研究。

1671-4598(2017)12-0279-04

10.16526/j.cnki.11-4762/tp.2017.12.072

TP391

A

猜你喜欢
序列化中间件调用
Java Web反序列化网络安全漏洞分析
如何建构序列化阅读教学
某物资管理调度系统的数据序列化技术
核电项目物项调用管理的应用研究
系统虚拟化环境下客户机系统调用信息捕获与分析①
RFID中间件技术及其应用研究
基于Android 平台的OSGi 架构中间件的研究与应用
Java 反序列化漏洞研究
云计算环境下中间件的负载均衡机制研究
利用RFC技术实现SAP系统接口通信