这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记。
这节课是青训营框架系列课程的开篇之作,老师为我们讲解了RPC框架的基本概念,以及RPC框架的一个分层设计,关键指标和企业实践部分。听完老师的课程受益匪浅。
基本概念
本地函数调用
老师从本地函数的调用例子开始讲解RPC的基本概念,对于本地函数的调用,我们是在熟悉不过了。
远程函数调用(RPC)
- 举了一个例子
在网上商城购物的时候,此时需要支付100元,这个支付的过程会调用远程的支付服务,这就是远程调用的一个比较典型的例子。
RPC需要解决的问题是什么?
-
函数的映射
-
数据需要转化为字节流
-
网络的传输
一次RPC的完整过程
-
IDL文件(接口描述语言) 一次远程调用,需要调用方和被调用方保证接口相同,需要使用同一种语言进行通信。
-
生成代码 通过编译器,将IDL文件生成指定语言的静态库
-编解码 从内存中表示到字节序列的转换称为编码,反之为解码,也就是常听到的序列化和反序列化
-通信协议 就是规范数据在网络中传输的内容和格式,除了必要的请求和响应数据外还有一些包含的额外的元数据
-网络传输 通过成熟的网络库进行传输
RPC的好处
1.单一职责,有利于分工和运维开发
2.可扩展性强,资源利用率高
3.故障隔离,服务整体可靠性高
分层设计
编解码层
数据格式
-
语言特定的格式 如:Java.io.Serializable
-
文本格式 如:Json,Xml等具备可读性的格式
-
二进制编码 具备跨语言和高性能的特点,常见的有Thrift的Protobuf等
TLV编码
T为tag,即是标签,可以理解为标签
L为Length,即是长度
V为Value,Value也可以是TLV结构
一个例子:
协议层
概念
- 特殊结束符
表示消息结束,比如/r/n
- 变长协议
定长的部分去表示不定长的部分
协议构造
-
Length:数据包的大小,不包含自身
-
Header magic:表示版本信息,协议解析是快速校验
-
Sequence number:表示数据包的ID,适用于多路复用,多路复用,同一个连接内有多个请求流在走
协议解析
-
先读取magicnumber得到协议版本信息,即可知道是什么协议版本
-
再读取编解码的方式,将传来的信息进行解码得到需要的PayLoad
网络通信层
Socket API
通过Socket进行网络通信
关键指标
稳定性
-
熔断:保护调用方,防止被调用的服务出现问题从而影响整个链路
-
限流:保护被调用方,防止大流量把服务压垮
-
超时控制:避免资源浪费在不可用的节点上
-
负载均衡: 均衡的调用相应的服务,防止某个服务的请求过大导致服务崩溃
-
重试:增加请求成功率
框架怎么使用上述的策略:
- 注册中间件
易用性
- 开箱即用
合理的默认选项配置和丰富的文档
-周边工具
生成代码工具和脚手架工具
扩展性
观测性
-
Log,Metrix,Tracing
-
内置观测服务
高性能
-
目标:高吞吐,低延迟(实际更重要些)
-
手段:连接池,多路复用,高性能编解码协议,高性能网络库
上面就是这节课的主要理论知识,老师为我们深入浅出的介绍了RPC框架的结构和一些性能指标,受益匪浅。