技术学习总结 11 | 青训营

80 阅读2分钟

RPC框架分层设计

一、基本概念

①   本地函数调用

②   远程函数调用(RPC:Remote Procedure Calls)

RPC需要解决的问题:①函数映射 ②数据转换成字节流 ③网络传输

③   RPC概念模型

image.png

④   一次RPC的完整过程

image.png

⑤   RPC的好处

(1)       单一职责,有利于分工协作和运维开发

(2)       可扩展性强,资源使用率更优

(3)       故障隔离,服务的整体可靠性更高

image.png

⑥   RPC带来的问题

(1)       服务宕机,对方应该如何处理?

(2)       在调用过程中发生网络异常,如何保证消息的可达性?

(3)       请求量突增导致服务无法及时处理,有哪些应对措施?

上述问题的解决方法只有一个:由RPC框架来解决!!!

二、分层设计

实例(以Apache Thrift为例):

image.png

①   编解码层

(1)       生成代码

image.png

(2)       数据格式

1.       语言特定的格式:许多编程语言都内建了将内存对象编码为字节序列的支持,例如Java有java.io.Serializable

2.       文本格式:JSON、XML、CSV等文本格式,具有人类可读性

3.       具备跨语言和高性能等优点,常见有Thrift的BinaryProtocol、Protobuf等

(3)       二进制编码

image.png

(4)       选型

1.       兼容性:支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度

2.       通用性:支持跨平台、跨语言

3.       性能:从时间和空间两个维度来考虑,也就是编码后数据大小和编码耗费时长

②   协议层

(1)       概念

1.       特殊结束符:一个特殊字符作为每个协议单元结束的标示

2.       变长协议:以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度

image.png

(2)       协议构造

image.png

1.       LENGTH:数据包大小,不包含自身

2.       HEADER MAGIC:标识版本信息,协议解析时快速校验

3.       SEQUENCE NUMBER:表示数据包的seqID,可用于多路复用,单连接内递增

4.       HEADER SIZE:头部长度,从第14个字节开始计算一直到PAYLOAD前

5.       PROTOCOL ID:编解码方式,有Binary和Compact两种

6.       TRANSFORM ID:压缩方式,如zlib和snappy

7.       INFO ID:传递一些定制的meta信息

8.       PAYLOAD:消息体

(3)       协议解析

image.png

③   网络通信层

(1)       Sockets API

image.png

(2)       网络库

1.       提供易用API:①封装底层Socket API ②连接管理和事件分发

2.       功能:①协议支持(支持tcp、udp和uds等) ②优雅退出、异常处理等

3.       性能:①应用层buffer减少copy ②高性能定时器、对象池等