RPC(远程调用框架)
一、 RPC定义
RPC(Remote Procedure Call Protocol)——远程过程调用协议,是一种通过网络从远程计算机请求服务,就像调用本地方法一样,不需要了解底层网络技术的协议。RPC跨越了传输层和应用层,很容易开发分布式应用。
RPC框架通常包括五个部分:
-
User
-
User-stub
-
RPCRuntime
-
Server-stub
-
Server
这 5 个部分的关系如下图所示

User发起一个远程调用,它实际是通过本地调用调User-stub。User-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPCRuntime 实例传输到远端的实例。远端 RPCRuntime 实例收到请求后交给 Server-stub 进行解码后,发起本地调用Server服务,调用结果再返回给User 端。
二、常用的RPC框架
目前常见的RPC框架:
gRPC
gRPC是一个高性能、通用的开源RPC框架,主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言(java,C++,go, objective-c,python,ruby,php,node,C#)。
Thrift
thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, C#, JavaScript, Node.js等编程语言间无缝结合的、高效的服务。
Dubbo
Dubbo是一个分布式服务框架(java),以及SOA治理方案。其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。
RCF
远程调用框架(Remote Call Framework, RCF)是一个可跨平台的IPC/RPC通信框架,使用C++编写。RCF并未使用独立的接口定义语言(IDL),而是直接采用C++定义RCF接口。
RCF框架功能:
· 支持单向和双向消息。
· 支持批量单向消息。
· 支持发布/订阅风格消息。
· 支持UDP上的多播和广播。
. 支持通过HTTP和HTTPS进行隧道传输。
· 支持多种传输方式 (TCP、UDP、Windows named pipes、UNIX local domain sockets)。
. 支持传输层信息压缩(Zlib)与加密(Kerberos、NTLM、Schannel、OpenSSL)。
. 支持异步远程调用。
. 支持双向连接,用于服务器到客户端的消息传递。
. 支持IPv4与IPv6。
· 健壮的版本支持。
· 内置序列化框架。
· 内建文件传输功能。
· 支持ProtoBuf。
RCF特点:
C++编写,我们要编写进程间通信的C ++组件,可以无缝整合。
简单,编译和使用简单。RCF采用C ++代码描述接口,不需要单独编写和编译IDL文件。构建更简单,开发更灵活。
可移植,RCF采用标准C ++编写,支持多种编译器、平台。
可伸缩性强,可以根据平台选择高效网络实现(IOCP on Windows, epoll on Linux, /dev/poll on Solaris, kqueue on FreeBSD)。从进程IPC到大型分布式系统都适用。
高效,序列化(内置、protobuf)方式比XML及JSON等方式更具效率。另外,在一些关键路径上使用了零拷贝(远程调用参数或数据不会进行内部复制, RCF::ByteBuffer类型数据序列化/反序列化不会拷贝)、零堆内存分配(使用相同的参数进行两次远程调用,则在同一连接上,RCF不会为第二次调用分配堆内存)。
RCF支持多种传输机制、线程模型以及多种消息传递方式(单向/双向,单向批量、发布/订阅,请求/响应)、异步调用与调度、传输层压缩、加密认证。
RCF比较稳定,成熟。RCF自2007年发布,已被大规模商用,主要用户:爱立信、西门子、惠普等公司。
三、RCF 编译
RCF以源代码形式提供(http://www.deltavsoft.com),RCF2.2和RCF3.0版本可以下载。下载的源码包:
RCF3.0只能在支持C++11以及C++14的编译器上编译。与RCF2.2相比,RCF3.0不再支持JSON-RPC、不用Boost.Serialization进行序列化、重新实现文件传输、采用proxy endpoints实现server to client通信。
RCF没有强制依赖第三方库,zlib、OpenSSL和 ProtoBuf依赖是可选。RCF可以直接编译到应用中,也可以编译成静态或动态库、然后链接到应用中。RCF在编译时,可以根据需要开启或关闭某些功能
| Feature define | RCF feature | Default value |
|---|---|---|
| RCF_FEATURE_SSPI | Win32 SSPI-based encryption (NTLM, Kerberos, Schannel) | 1 on Windows. 0 otherwise. |
| RCF_FEATURE_FILETRANSFER | File transfers(C++17) | 0 |
| RCF_FEATURE_SERVER | Non-critical server-side functionality (server-to-client pingbacks, server objects, session timeouts) | 1 |
| RCF_FEATURE_PROXYENDPOINT | Proxy endpoints | 1 |
| RCF_FEATURE_PUBSUB | Publish/subscribe | 1 |
| RCF_FEATURE_TCP | TCP transports | 1 |
| RCF_FEATURE_UDP | UDP transports . | 1 |
| RCF_FEATURE_NAMEDPIPE | Win32 named pipe transports | 1 on Windows. 0 otherwise. |
| RCF_FEATURE_LOCALSOCKET | Unix local socket transports | 0 on Windows. 1 otherwise. |
| RCF_FEATURE_HTTP | HTTP/HTTPS transports | 1 |
| RCF_FEATURE_IPV6 | IPv6 support | 1 |
| RCF_FEATURE_SF | RCF internal serialization | 1 |
| RCF_FEATURE_LEGACY | Backwards compatibility with RCF 1.x and earlier | 0 |
| RCF_FEATURE_ZLIB | Zlib-based compression. | 0 |
| RCF_FEATURE_OPENSSL | OpenSSL-based SSL encryption. | 0 |
| RCF_FEATURE_PROTOBUF | Protocol Buffer support. | 0 |
3.1 RCF编译成静态库
设置编译静态库的编译开关,设置include目录<rcf_distro>/include,添加RCF.cpp,编译生成RCF静态库。
3.2 RCF动态库编译
设置编译动态库的编译开关,设置define RCF_BUILD_DLL=1,设置include目录<rcf_distro>/include,添加RCF.cpp编译生成RCF动态库。
3.3 RCF直接编译至应用程序
VS编译方法:
新建空的项目,设置include目录<rcf_distro>/include。将<rcf_distro>/src/RCF/RCF.cpp添加至项目中,编写用户源码,然后进行编译。
g++编译方法:
g++ user-defined.cpp <rcf_distro>/src/RCF/RCF.cpp -I<rcf_distro>/include -lpthread -ldl -o user-defined
四、基于RCF框架编程(如何利用RCF框架编写远程调用)
4.1 RCF框架
RCF框架传输层采用Asio库实现,Asio是一个成熟的高性能后端C++网络库。RCF客户端默认是单线程同步模型,也支持异步调用。RCF服务端默认单线程同步调度,也支持多线程(线程池)、异步调度。
4.2 接口
RCF中的远程调用基于接口,RCF中的接口使用RCF_BEGIN()、 RCF_METHOD_() 以及RCF_END() 宏来标识。
RCF接口简单示例:
RCF_BEGIN(I_Calculator, “Calculate”)
RCF_METHOD_R2(int, Add, int, int); //----> int Add(int,int)
RCF_METHOD_V3(void, Sub, int, int, int&); //void Sub(int,int,int&)
RCF_END(I_Calculator)
RCF_BEGIN()宏格式:RCF_BEGIN(compile_time_name, runtime_name), runtime_name可以省略,省略时默认为compile_time_name。
RCF_METHOD_()宏的名称取决于方法的参数数量,以及方法是否具有返回类型。命名约定如下:
RCF_METHOD_{V|R}{}() - 定义RCF方法返回void(V)或非void®,并获取n参数,n范围从0到15。例如,RCF_METHOD_V0()定义一个void返回类型、无参数的函数。
RCF方法返回类型和参数类型可以为任意C++数据类型,但是类型必须存在serialize()函数。RCF方法的参数类型可以为值类型、指针、引用(const, 非const),而远程调用返回类型可以值类型或者非const引用。
RCF_END() 宏格式:RCF_END(compile_time_name)
宏展开相当于定义了RcfClient< compile_time_name> 类, 以及类方法。
RCF接口中的每个方法都有一个唯一方法ID,第一个方法ID是0,后续方法ID为前一个方法ID加1。单个接口中能定义的方法数量有限,默认情况下,最大数量为100个,可以调整RCF_MAX_METHOD_COUNT的值进行修改,但是最大允许值为200。
RCF接口需在远程调用客户端与服

本文介绍RPC定义及常见框架,重点阐述RCF框架。RCF用C++编写,功能丰富、特点突出,如支持多种传输和消息方式、高效序列化等。还讲解了RCF编译方法、基于其框架的编程步骤、版本控制,分析了性能优缺点,并解答常见问题。
589

被折叠的 条评论
为什么被折叠?



