一种远程过程调用方法和系统
技术领域
本发明涉及IPTV(Internet Protocol Television,交互式网络电视)技术,尤其涉及网元之间的通信技术。
背景技术
IPTV即交互式网络电视,是一种利用宽带有线电视网,集互联网、多媒体、通讯等多种技术于一体,向家庭用户提供包括数字电视在内的多种交互式服务的崭新技术。用户在家中可以有两种方式享受IPTV服务:(1)计算机,(2)网络机顶盒+普通电视机)。它能够很好地适应当今网络飞速发展的趋势,充分有效地利用网络资源。IPTV既不同于传统的模拟式有线电视,也不同于经典的数字电视。因为,传统的和经典的数字电视都具有频分制、定时、单向广播等特点;尽管经典的数字电视相对于模拟电视有许多技术革新,但只是信号形式的改变,而没有触及媒体内容的传播方式。
IPTV是利用计算机或机顶盒+电视完成接收视频点播节目、视频广播及网上冲浪等功能。它采用高效的视频压缩技术,使视频流传输带宽在800Kb/s时可以有接近DVD的收视效果(通常DVD的视频流传输带宽需要3Mb/s),对今后开展视频类业务如因特网上视频直播、远距离真视频点播、节目源制作等来讲,有很强的优势,是一个全新的技术概念。
现有的IPTV系统中,网元之间的通信往往采用Web Service的模式,或者是自定义的通信协议。
Web Service的模式的缺点是效率问题,虽然Web Service能够很好的解决异构问题,但是对于电信级应用,对通信的要求体现在高效,异步等方面,这些都是Web Service做不到的;而自定义协议也存在开发成本,协议的稳定性等问题。
Web Service的一个缺点就是同步调用,这是使用http协议的结果,假如服务器端是一个长过程的调用,那么Web Service就得阻塞在那里。为了避免这种情况,可以让Web Service立即返回,并在调用完成之后回调,但是这种方式增加了程序设计的复杂度。
因此,随着数字电视技术的发展,如何提高异步调用效率,成为急待解决的问题。
发明内容
本发明目的在于提供一种远程过程调用RPC(Remote Procedlure Call)系统,克服了WebService在效率,异步调用方面的不足,并且具有与平台无关,用户代码中心简单易用等特点。
为解决本发明的技术问题,本发明公开一种远程过程调用系统,包括:通信模块,序列化模块,调度模块和编译模块,其中,所述序列化模块,调度模块和编译模块均与所述通信模块连接,通过所述通信模块与其他通信设备通信,其中
所述通信模块,用于为RPC提供底层通信机制;
所述序列化模块,用于对传输的消息进行序列化和反序列化;
所述调度模块,用于对整个RPC调用进行调度,包括对异步调用的管理、超时机制、事务机制;
所述编译模块,用于为接口定义文件(IDL)、用户头文件、桩(stub)文件三者之间的转换提供支持。
较优的,所述底层通信机制包括传输控制协议(TCP)和流控制传输协议(SCTP)。
较优的,所述编译模块用于编译头文件为IDL,再由IDL生成客户端和服务器端的桩。
较优的,所述编译模块用于将头文件编译为接口定义语言文件、客户端桩代码和服务器端桩代码;用于将接口定义语言文件生成Protocol Buffer的序列化代码,用于将序列化代码和服务器端桩代码,客户端桩代码分别编译成为服务器端桩和客户端桩,其中所述客户代码和服务器代码分别链接自己的桩,成为完整的客户端程序和服务器端程序。
为解决本发明的技术问题,本发明还公开一种远程过程调用方法,其中,包括:
对传输的消息进行序列化和反序列化;
在接口定义文件(IDL)、用户头文件、桩(stub)文件三者之间的进行转换;
对整个RPC调用进行调度,包括对异步调用的管理、超时机制、事务机制。
较优的,所述在接口定义文件(IDL)、用户头文件、桩(stub)文件三者之间的进行转换具体包括:
编译头文件为IDL,再由IDL生成客户端和服务器端的桩。
较优的,所述在接口定义文件(IDL)、用户头文件、桩(stub)文件三者之间的进行转换具体包括:
将头文件编译为接口定义语言文件、客户端桩代码和服务器端桩代码;
将接口定义语言文件生成Protocol Buffer的序列化代码;
将序列化代码和服务器端桩代码,客户端桩代码分别编译成为服务器端桩和客户端桩;
其中,所述客户代码和服务器代码分别链接自己的桩,成为完整的客户端程序和服务器端程序。
较优的,还包括:
函数调用的所有形参,封装在一个以函数名为基础命名的结构体中,称为根(root)结构体;
以结构体为单位,做内存的序列化处理;
建立一个哈希表,将结构体类型和内存指针为哈希的key,结构体的内存为哈希的value;
从根结构体开始遍历,存储所有的子结构体,跳过在哈希表中的结构体,处理至RPC所支持的最基本数据结构为止。
与现有技术相比,本发明具有如下有益效果:
本发明公开一种远程过程调用(RPC)方法和系统,克服了Web Service在效率,异步调用方面的不足,并且具有与平台无关,用户代码中心简单易用等特点。
附图说明
图1为本发明实施例的一种基于Google Protocol Buffer的RPC通信系统结构示意图;
图2为本发明实施例的RPC在序列化调用参数时的一个示例图;
图3为本发明实施例的用户使用RPC的一个示意图;
图4为本发明实施例的远程过程调用RPC系统的结构示意图。
具体实施方式
本发明一种远程过程调用(RPC)方法和系统,克服了Web Service在效率,异步调用方面的不足,并且具有与平台无关,用户代码中心简单易用等特点。
远程过程调用RPC协议,一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP(Transmission ControlProtocol,传输控制协议)或UDP(User Datagram Protocol,用户数据报协议),为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
图1为本发明实施例的一种基于Google Protocol Buffer的RPC通信系统结构示意图,该系统包括:调用服务器11,服务器12和客户机13,其中服务器12和客户机13均与调用服务器11通信连接。调用服务器11内装有服务程序1,服务器12内装有服务程序2,客户机13内装有客户程序。
其中,调用服务器11处于多个网段,它可以连接客户机13与服务器12,客户机13想要调用服务器12中服务程序2,但是由于它和服务器12之间没有路由,所以无法调用。但是通过RPC命名机制的支持,客户机13可以对服务调用服务器11发起调用,由调用服务器11负责调用服务器12中的服务程序2,并将调用的结果返回给客户机13。
图2为本发明实施例的RPC在序列化调用的形式参数时的示例图,假设此调用的参数只有结构体A,那么序列化必须把结构体A所涉及到得所有内存都保存下来,发给服务端,RPC的序列化模块42对结构体A进行了遍历,这是一个递归的调用,因为事先不能确定这种结构体之间的指针构成了多复杂的内存结构。
当遍历到b3时,发现b3所组成的key已经在哈希中,哈希命中,不再继续做分析,从而避免了死循环。当内存指针更复杂时,处理的原则是一样的。
图3为本发明实施例的用户使用RPC的一个示意图,其过程可以如下所示。
步骤31,用户定义头文件。
步骤32,RPC的编译模块将头文件编译为接口定义语言文件、客户端桩代码和服务器端桩代码。
步骤33,将接口定义语言文件生成Protocol Buffer的序列化代码。
步骤34,将序列化代码和服务器端桩代码,客户端桩代码分别编译成为服务器端桩和客户端桩。
步骤35,客户代码和服务器代码分别链接自己的桩,成为完整的客户端程序和服务器端程序。
本发明提出了一种基于protocol buffer的远程过程调用(RPC)系统,其主要特点是:
1)平台无关性
RPC可以做到与系统平台和程序语言无关,以下重点描述服务器开发中常用的C语言的实现。用户代码中心(User-Code-Centered),RPC以用户代码为中心,定义良好的头文件设置不需做任何更改,用户可以方便的将现有的本地调用代码移植为远程调用。
2)简单性
简单性指用户使用简单、方便。该RPC还集成了Google Protocol Buffer的可扩展性、高性能和向后兼容等特点。
如图4所示,为本发明实施例的一种远程过程调用RPC系统的结构示意图,从功能上可以逻辑可以包括:通信模块41,序列化模块42,调度模块43和编译模块44。其中,所述序列化模块42,调度模块43和编译模块44均与通信模块41连接,通过所述通信模块41与其他通信设备通信。
通信模块41,用于为RPC提供底层通信机制,通信模块41的设计使得RPC系统可以使用各种通信协议,包括TCP和SCTP(STREAM CONTROL TRANSMISSION PROTOCOL,流控制传输协议)。
序列化模块42,由桩(stub)和Google Protocol Buffer共同完成,其作用是对传输的消息进行序列化和反序列化。
调度模块43的作用是对整个RPC调用进行调度,包括对异步调用的管理、超时机制、事务机制等。
编译模块44为接口定义文件(IDL)、用户头文件、桩(stub)文件三者之间的转换提供支持。该RPC是用户代码中心的(User-Code-Centered),因此用户提供自己的头文件,就可以由编译模块44编译此头文件为IDL,再由IDL生成客户端和服务器端的桩。
桩(stub)生成策略
生成桩的目的是提供客户端13和调用服务器11、12端的支持,以便用户无需书写代码,上调用远程的服务器就如同调用本地函数一样。桩包括客户端桩和服务器端桩,它们的相同部分是都需要把调用所涉及的内存传递到对方。因此如何序列化这些内存就成为一个重要的问题。
对于C这种过程式的语言来说,不能期望像java一样直接把类序列化或者反序列化,因此必须用一种抽象的方式描述C语言当中的内存。
本发明的RPC采取的策略描述如下:
1)函数调用的所有形参,封装在一个以函数名为基础命名的结构体中,称为根(root)结构体。
2)以结构体为单位,做内存的序列化处理。
3)建立一个哈希表,将结构体类型和内存指针为哈希的key,结构体的内存为哈希的value。
4)从根结构体开始遍历,存储所有的子结构体,跳过在哈希表中的结构体(即为已经处理过),否则处理至RPC所支持的最基本数据结构为止。
5)得到调用所涉及的所有内存。
本发明的RPC使用rpc://ip:port/service_name的方式命名RPC服务,类URI的命名使其获得良好的可读性和通用性,此外这种方式使得一台处于不同网段的机器有了做RPC代理的可能。
当一台调用服务器11处于不同网段时,它可以被设置为当收到一个不属于自己的调用请求时(即rpc字串中的ip不是自己的),转发此rpc调用,并且将调用的结果返回给请求的客户机13,如图1所示。
本发明的RPC提供版本校验特性,在通信程序中,由于接口版本问题所带来的问题很多,因此版本校验的特性有很大意义,本发明的RPC使用IDL文件的MD5值作为版本的描述信息,当发现客户机13和调用服务器11端的MD5值不一致时给予警告。
使用IDL文件的MD5值作为版本的好处是,可以不必要求用户头文件的一致,由于IDL是用户头文件生成的,对于不同的头文件,只要其意义仍一致,就认为是其版本没有发生变化。
本发明的RPC提供异步调用,采用事件驱动的方式为用户提供类epoll的接口,使得用户程序不必阻塞,从而得到更高的效率。