原文地址:http://www.syyong.com/architecture/Simple-understanding-of-RPC.htmlphp
RPC(Remote Procedure Call Protocol)—— 远程过程调用协议。这个概念术语在上世纪 80 年代由 Bruce Jay Nelson 提出。它是一种经过网络从远程计算机程序上请求服务,而不须要了解底层网络技术的协议。RPC 协议假定某些传输协议的存在,如 TCP 或 UDP,为通讯程序之间携带信息数据。在 OSI 网络通讯模型中,RPC 跨越了传输层和应用层。RPC 使得开发包括网络分布式多程序在内的应用程序更加容易。html
RPC 采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,而后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器得到进程参数,计算结果,发送答复信息,而后等待下一个调用信息,最后,客户端调用进程接收答复信息,得到进程结果,而后调用执行继续进行。json
\RpcClient::serv('User')->handler('UserInfo')->getUserInfoById($id);
Protocol Buffers (a.k.a., protobuf) are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data.服务器
Protobuf 是一种二进制数据序列化协议,相对 xml、json 这些协议来讲,它具备更小、性能更好、效率更快的优点。一样由于是二进制协议也就带来了可读性更差问题。目前尚未官方支持的 php 扩展,但有好比 php-protobuf 这样的开源扩展。Protobuf 对数据序列化后可用于 RPC 框架的数据传输交互。网络
Thrift 最初由 facebook 开发用作系统内各语言之间的 RPC 通讯,它提供了全套的 RPC 解决方案,包括序列化机制、传输层、并发处理框架等。并发
Thrift经过一个中间语言(IDL, 接口定义语言)来定义 RPC 的接口和数据类型,而后经过一个编译器生成不一样语言的代码(目前支持 C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 和 OCaml),并由生成的代码负责 RPC 协议层和传输层的实现。
Thrift 其实是实现了 C/S 模式,经过代码生成工具将接口定义文件生成服务器端和客户端代码(能够为不一样语言),从而实现服务端和客户端跨语言的支持。用户在 Thirft 描述文件中声明本身的服务,这些服务通过编译后会生成相应语言的代码文件,而后用户实现服务(客户端调用服务,服务器端提服务)即可以了。其中 protocol(协议层, 定义数据传输格式,能够为二进制或者 XML 等)和 transport(传输层,定义数据传输方式,能够为 TCP/IP 传输,内存共享或者文件共享等)被用做运行时库。框架
Thrift 支持多种协议格式的序列化和反序列化,如二进制,json 格式。这让用户能够更加灵活的选择协议的具体形式。更完美的是,协议是可自由扩展的,新版本的协议,彻底兼容老的版本!socket