这是我参与「第五届青训营」伴学笔记创作活动的第6天
前言
一个好的框架能够发挥语言的优势,带给用户更好的使用体验。青训营快要结束了,来补上笔记,顺带复习一下RPC框架。
1️⃣RPC的引入以及基本概念
1.本地函数的调用
以一个简单返回a*b的函数举例:
1.将a,b进行压栈(参数返回值较少情况下会直接存放在寄存器)
2.指针找到a,b位置,赋予到x,y中
3.计算x*y,结果存在z
4.将z压栈,从calculate返回(参数返回值较少,直接做inline操作)
5.从栈中取出z返回值,并赋值给result
2️.远程函数调用
以常用的网购为例:
首先是手机发送支付操作,服务器响应后返回余额减的操作,手机接受相应操作才会扣除钱款
RPC解决的问题:
1.函数映射
2.数据转换成字节流
3.网络传输
1.4 一次完成RPC的过程
IDL文件
通过一种中立的方式描述接口,使文件在不同平台上运行的对象和用不同语言编写的程序可以互相通信
代码以及传输
生成代码:通过特定的编译工具把IDL文件转为对应的静态库
编译码: 从内存中表示到字节序列的转换称为编码码,反之为解码,通常也叫序列化和反序列化
传输:通过成熟的网络库 TCP/IP传输
1.5 RPC的好处
1.单一职责,有利于分工协作和运维开发
2.可扩展性强,资源利用率更优
3.故障隔离,服务的整体可靠性更高
1.6 RPC带来的问题
1.服务宕机,对方应该如何处理?
2.在调用过程中发生网络异常,如何保证消息的合法性?
3.请求量突增导致服务无法及时处理,有哪些应对措施?
2️⃣RPC框架的分层设计
RPC框架共有三层,分别是编解码层、协议层、网络通信层,关系如下:
编解码层
数据格式
🔸语言特定的格式 :书写简单但是只能在特定语言中使用,如java.io.Serializable
🔸文本格式: JSON、XML、CSV等文本格式,可读性很好🔸
二进制编码
🔸具有 跨语言和高性能等优点,常见有Thrift的BinaryProtocol,Protobuf等
TLV 编码:
🔸Tag:标签,一个类型
🔸Length:长度
🔸Value:值 也可以是个TLV结构
选型
🔸兼容性:支持自动添加新的字段,而不影响老的服务,这将提高系统的灵活度
🔸通用性:支持跨平台,跨语言
🔸性能 :从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长
协议层
协议是双方确定的交流语义。
特殊结束符: 对于一个协议单元必须要全部读入才能进行处理, 除此之外必须要防止用户传输的数据不能同结束符相同,否则就会出现紊乱。
变长协议: 一般都是自定义协议,有header和payload组成,会以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度,使用比较广泛
网络通信层
🔸提供易用的API 封装底层Soceket API 、连接管理和事件分发
🔸功能:
协议支持: TCP, UDP和UDS等
优雅输出、异常处理等
🔸性能
应用层buffer减少copy