系列文章目录
文章目录
前言
RPC是分布式的基石,可以将各个业务代码和底层框架隔离开来,快速迭代更改业务代码,RPC也可以将不同语言如c++、Python、Go、Java等业务组件跨语言互相调用。
为什么用 RPC,不用 HTTP?
RPC 是一种设计,就是为了解决不同服务之间的调用问题,完整的 RPC 实现一般会包含有 传输协议 和 序列化协议 这两个。而 HTTP 只是一种传输协议。
一、RPC?
RPC(Remote Procedure Call)远程过程调,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序。可跨进程、跨计算机、跨系统调用函数。
RPC是一种服务器-客户端(Client/Server模式
RPC也是一种进程间通信的模式,程序分布在不同的地址空间里。如果在同一主机里,RPC可以通过不同的虚拟地址空间(即便使用相同的物理地址)进行通讯,而在不同的主机间,则通过不同的物理地址进行交互
二、RPC的运行模式
动态模式:依赖语言特性实现动态调用(反射、内省) ,python反射 Java,Php,Go
静态模式:(Interface Definition Language),生成存根代码stub,与应用代码一起编译 :c++ java
预编译接口 IDL 可以认为业务能力的一种描述,IDL只有一种,但是存根代码Stub可以编译为很多种语言
三、数据序列化
远程调用过程中双方不再同一个内存里,无法直接传递函数的参数,因此需要客户端把参数转换成字节流,传给服务端,然后服务端将字节流转换成自身能读取的格式,是一个序列化和反序列化的过程。
互联网上的机器大都通过TCP/IP协议相互访问,但TCP/IP只是往远端发送了一段二进制数据,因此为了建立服务还有很多问题需要抽象:
- 数据以什么格式传输?不同机器间,网络间可能是不同的字节序,直接传输内存数据显然是不合适的.
- 随着业务变化,消息的字段往往要增加或删减,怎么兼容前后不同版本的格式
3.1、文本型 json/xml
它们的结构就可以直接通过它的内容体现出来,所以它是一种显式结构的消息协议,可读性非常棒,但是它的缺点也很明显,有太多的冗余信息。比如每个字符串都使用双引号来界定边界,key/value 之间必须有冒号分割,对象之间必须使用大括号分割等等。。
{
"firstName": "John",
"lastName": "Smith",
"gender": "male",
"age": 25,
"address":
{
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
}
3.2、二进制 protobuf
是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单,缺点是可读性差。
四、RPC的调用
RPC的调用方式可以大体分为 同步调用和异步调用,基本如下:
AMI 异步方法调用(client)
AMD 异步方法分派(server) 诸多个client请求,怎么样高效并行分派 ,工作线程池
同步调用(阻塞)
单向调用 例如 心跳(client -> sever),
双向调用(连接复用)(Bidirection) 网络中存在 NAT,怎么反向复用。
五、RPC的Runtime层
RPC的runtime层,控制层,负责以下几方面的功能:
网络通信
异常处理
超时处理
流量控制
幂等问题 ,网络不好,client 重传,sever只需一次调用
TCP的incast问题: client 访问多server,造成网络堵塞
六、RPC的负载均衡
round-robin 服务器能力均等
adap 自适应学习
七、RPC 传输协议,TCP?HTTP?
使用 TCP 和使用 HTTP 各有优势:
传输效率:
TCP,通常自定义上层协议,可以让请求报文体积更小
HTTP:如果是基于HTTP 1.1 的协议,请求中会包含很多无用的内容
性能消耗, 主要在于序列化和反序列化的耗时
TCP,可以基于各种序列化框架进行,效率比较高
HTTP,大部分是通过 json 来实现的,字节大小和序列化耗时都要更消耗性能,所以可以跨语言调用
跨平台:
TCP:通常要求客户端和服务器为统一平台
HTTP:可以在各种异构系统上运行