这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天
以前在做一个规模不大的系统的时候,用的是单体架构,一台服务器部署上一个应用和数据库也就够了。 但是现代化互联网公司业务逐渐扩大,服务逐渐细分,很多服务之间需要通过远程分布式接口调用通讯,即不同的服务不是部署在同一个服务器上,比如订单服务在 A 服务上,付款服务在另一个服务上,有同步调用、也有异步调用,这个时候我们就需要远程调用不同的服务,使用的时候调用远程服务就像调用本地服务一样,引入一个 jar 包,就能通过 this.xxx( ) 一样调用远程服务,这背后的机制就是通过 RPC 技术。
一次RPC的完整过程
IDL文件:IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信
生成代码:通过编译器工具把IDL文件转换成语言对应的静态库
编解码:从内存中表示到字节序列的转化称为编码,反之为解码,也常叫做序列化和反序列化
通信协议:规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据
网络传输:通常基于成熟的网络库走TCP/UDP传输
PRC的好处
单一职责,有利于分工协作和运维开发
可扩展性强,资源使用率更优
故障隔离,服务的整体可靠性更高
PRC框架
编解码层
通过代码生成工具把IDL文件转换成不同语言对应的lib代码,里面封装了编解码的逻辑
一、数据格式
语言特定的格式:许多编程语言都内建了将内存对象编码为字节序列的支持,例如Java有Java.io.Serializable
文本格式:JSON、XML、CSV等文本格式,具有人类可读性
二进制编码:具备跨语言和高性能等优点,常见有THrift的BinaryProtocol,Protobuf等
二、选型
兼容性:支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度
通用性:支持跨平台、跨语言
性能:从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长
协议层
概念
特殊结束符:一个特殊字符作为每个协议单元结束的标示
变长协议:以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度
协议构造
LENGTH:数据包大小,不包含自身
HEADER MAGIC:表示版本信息,协议解析时快速校验
SEQUENCE NUMBER:表示数据包的seqID,可用于多路复用,单连接内递增
HEADER SIZE:头部长度,从第14个字节开始计算一直到PAYLOAD前
PROTOCOL ID:编解码方式,有Binary和Compact两种
TRANSFORM ID:压缩方式,如zlib和snappy
INFO ID:传递一些定制的meta信息
PAYLOAD:消息体
网络通信层
网络库
提供易用API:封装底层Socket API、连接管理和事件分发
功能:协议支持:tcp、udp、和uds等;优雅退出,异常处理等。
性能:应用层buffer减少copy、高性能定时器,对象池