RPC 技术原理
RPC ( Remote Procedure Call Protocol,远程过程调用协议 ): 客户端在不知道调用细节的状况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象同样 。 java
1.RPC要点
RPC 是协议 : 既然是协议就只是一套规范规则,也就须要有人遵循这套规范来进行实现 。 目前典型的 RPC 实现包括 : dubbo (注意是小写的,不是大写的 DUBBO 服务治理框架〉 、 Apache Thrift、 GRPC 、 Hetty等 。
网络协议和网络I/O模型对其透明 : 既然 RPC 的客户端认为本身是在调用本地对象,那么传输层使用的是 TCP 仍是 HTTP 协议, 又或者是一些其余的网络协议它就不须要关心了。
信息格式对其透明 : 这些调用与返回的参数会以某种信息格式传递给网络上的另一台计算机,这个信息格式是怎样构成的,调用方就不须要关心了 ,
RPC 框架都应该有跨语言能力:固然,现实状况下因为一些 RPC 框架的特殊工做场景 ,也没有强行要求其提供跨语言能力,例如只工做在 Java 语言下的 RMI 就是这样一套 RPC 框架。服务器
2.RPC要素网络
• Client: RPC 协议的调用者。最理想的状况是 RPC 调用者在彻底不知道有 RPC 框架存在的状况下发起对远程服务的调用。但实际状况来讲 Client 或多或少都须要指定RPC框架的一些细节。
• Server : 在 RPC 规范中 , 这个 Server 并非提供 RPC 服务器 IP、端口监昕的模块 。 而是远程服务上业务逻辑的具体实现(在 Java 中就体现为 RPC 服务接口的具体实现) 。其中的代码是最普通的和业务相关的代码,甚至其接口实现类自己都不知道将被某一个 RPC 远程客户端调用。
• Proxy: RPC 代理存在于客户端 , 由于要实现客户端对 RPC 框架“透明”调用,那么客户端就不可能自行去管理消息格式 , 不可能本身去管理网络传输协议,也不可能本身去判断调用过程是否有异常。这一切工做在客户端都是交给RPC框架中的“代理”层来处理的。
• Message Protocol : 一次完整的 RPC Client-Server 的交互确定要携带某种两端都能识别的,共同约定的消息格式。 RPC 的消息管理层专门对网络传输所承载的信息进行编号和解码操做。目前流行的技术趋势是不一样 的 RPC 实现,为了增强自身框架的效率都有一套(或者几套)私有 的 消息格式 。例如后文咱们将讲解的 一套 RPC 框架 Apache Thrift , 就 拥 有私有 化的 消息 协 议。固然 Ap ache Thri位 还支持通用的消息格式,如JSON )。
• Transfer/Network Protocol : 传输协议层负责管理 RPC 框架所使用的网络协议、网络I/O模型 。 例如 Hessian 的传输协议基于 Http (应用层协议) : 再例如 Apache Thrift的传输协议基于 TCP (传输层协议)。传输层还须要统一 RPC 客户端和 RPC 服务端所使用的网络I/O模型 。
• Processor:存在于 RPC 服务端,因为服务器端某一个 RPC 接口的实现特性(它并不知道本身是一个将要被 RPC 提供给第三方系统调用的服务)。因此在 RPC 框架中应该有一种“负责执行 RPC 接口实现”的角色。它的职责包括管理RPC接口的注册、判断客户端的请求权限、控制接口实现类的执行在 内的各类工做 。
• IDL :虽然 IDL (接口定义语言)并非 RPC 实现中所必须的。可是须要跨语言的RPC 框架必定会有 IDL 部分的存在。这是由于要找到一个各类语言可以理解的消息结构、接口定义的描述形式 。 若是你的 RPC 实现没有考虑跨语言性,那么 IDL 部分就不须要。例如 Java RMI 就是一种专门在 Java 语言间进行使用的特殊的 RPC 框架,它设计之初就没有要求要有跨语言执行特性,因此 Java RMI 没有相应的 IDL 。
• 不一样的 RPC 实现都有必定设计差别。例如生成 Proxy 的方式不同 、 IDL 描述语言的语法不同、服务注册的管理方式不同、运行服务实现的方式不同 、 采用的消息格式封装不同、采用的网络协议不同,等等。框架
3.典型的 RPC 框架介绍
1)Java RMI : Java RPC , Java Serializable, TCP, java
2)GRPC : Google, ProtoBuf, HTTP/2, 众多语言
3)Thrift :FaceBook, Thrift(私有二进制,LVQ,JSON), TCP, 众多语言
4)Hetty :Netty/Hessian, 私有二进制, HTTP, 众多语言
5)WebService: XFire/CXF, XML, HTTP, 众多语言网络传输协议