深入浅出谈RPC框架 | 青训营笔记

86 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记。

这节课是青训营框架系列课程的开篇之作,老师为我们讲解了RPC框架的基本概念,以及RPC框架的一个分层设计,关键指标和企业实践部分。听完老师的课程受益匪浅。

基本概念

本地函数调用

老师从本地函数的调用例子开始讲解RPC的基本概念,对于本地函数的调用,我们是在熟悉不过了。

image.png

远程函数调用(RPC)

  • 举了一个例子

在网上商城购物的时候,此时需要支付100元,这个支付的过程会调用远程的支付服务,这就是远程调用的一个比较典型的例子。

RPC需要解决的问题是什么?

  1. 函数的映射

  2. 数据需要转化为字节流

  3. 网络的传输

一次RPC的完整过程

  • IDL文件(接口描述语言) 一次远程调用,需要调用方和被调用方保证接口相同,需要使用同一种语言进行通信。

  • 生成代码 通过编译器,将IDL文件生成指定语言的静态库

-编解码 从内存中表示到字节序列的转换称为编码,反之为解码,也就是常听到的序列化和反序列化

-通信协议 就是规范数据在网络中传输的内容和格式,除了必要的请求和响应数据外还有一些包含的额外的元数据

-网络传输 通过成熟的网络库进行传输

image.png

RPC的好处

1.单一职责,有利于分工运维开发

2.可扩展性强,资源利用率高

3.故障隔离,服务整体可靠性高

分层设计

编解码层

数据格式

  • 语言特定的格式 如:Java.io.Serializable

  • 文本格式 如:Json,Xml等具备可读性的格式

  • 二进制编码 具备跨语言和高性能的特点,常见的有Thrift的Protobuf等

TLV编码

T为tag,即是标签,可以理解为标签

L为Length,即是长度

V为Value,Value也可以是TLV结构

一个例子

image.png

协议层

概念

  • 特殊结束符

表示消息结束,比如/r/n

  • 变长协议

定长的部分去表示不定长的部分

协议构造

image.png

  • Length:数据包的大小,不包含自身

  • Header magic:表示版本信息,协议解析是快速校验

  • Sequence number:表示数据包的ID,适用于多路复用,多路复用,同一个连接内有多个请求流在走

协议解析

  1. 先读取magicnumber得到协议版本信息,即可知道是什么协议版本

  2. 再读取编解码的方式,将传来的信息进行解码得到需要的PayLoad

网络通信层

Socket API

通过Socket进行网络通信

关键指标

稳定性

  • 熔断:保护调用方,防止被调用的服务出现问题从而影响整个链路

  • 限流:保护被调用方,防止大流量把服务压垮

  • 超时控制:避免资源浪费在不可用的节点上

  • 负载均衡: 均衡的调用相应的服务,防止某个服务的请求过大导致服务崩溃

  • 重试:增加请求成功率

框架怎么使用上述的策略:

  • 注册中间件

image.png

易用性

  • 开箱即用

合理的默认选项配置和丰富的文档

-周边工具

生成代码工具和脚手架工具

扩展性

image.png

观测性

  • Log,Metrix,Tracing

  • 内置观测服务

高性能

  • 目标:高吞吐,低延迟(实际更重要些)

  • 手段:连接池,多路复用,高性能编解码协议,高性能网络库

上面就是这节课的主要理论知识,老师为我们深入浅出的介绍了RPC框架的结构和一些性能指标,受益匪浅。