这是我参与「第五届青训营 」伴学笔记创作活动的第13天
RPC简介
本地函数调用:
1.将a和b的值压栈
2.通过函数指针找到calculate函数,进入函数
取出栈中的值2和3,将其赋予X和y
3.计算×*y,并将结果存在Z
4.将z的值压栈,然后从calculate返回
5.从栈中取出z返回值,并赋值给result
func main{
var a =2
var b =3
result :calculate(a,b)
fmt.Println(result)
return
}
func calculate(x,y int){
2=x*y
return z
}
远程函数调用
RPC需要解决的问题
1.函数映射
2.数据转换成字节流
3.网络传输
一次rpc的完整过程
lDL(Interface description language)文件:
IDL 通过一种中立的方式来描述接口,使得在不同平台上运行
的对象和用不同语言缩写的程序可以相互通信
生成代码:
通过编译器工具把IDL文件转换成语言对应的静态库
编解码:
从内存中表示到字节序列的转换称为编码。反之为解钢。也常
叫做序列化和反序列化
通信协议:
规范了数据在网络中的传输内容和格式。除必须的请求/响应数
据外,通常还会包含额外的元数据
网络传输:
通常基于成热的网路库走TCP/UDP传输
rpc的好处
1.单一职责,有利于分工协作和运维开发
2.可扩展性强,资源使用率更优
3.故障隔离,服务的整体可靠性更高
rpc带来的问题
1.服务宕机,对方应该如何处理?
2.在调用过程中发生网络异常,如何保证消息的可达性?
3.请求量突增导致服务无法及时处理,有哪些应对措施?
小结
1,本地函数调用和RP℃调用的区别:函数映射、数据转成字节流、网络传输
2.RPC的概念模型:User、User-Stub、RPC-Runtime、Server-Stub、Server
3.一次PRC的完整过程,并讲解了RPC的基本概念定义
4.RPC带来好处的同时也带来了不少新的问题,将由RPC框架来解决
分层设计
编解码层-数据格式
语言特定的格式:
许多编程语言都内建了将内存对象编码为字节序列的支持,例如Java有java.io.Serializable
文本格式:
JSON、ML、CSV等文本格式,具有人类可读性
二进制编码:
具备跨语言和高性能等优点,常见有Thrift的BinaryProtocol,,Protobuf等
编解码层-选型
兼容性:
支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度
通用性:
支持跨平台、跨语言
性能:
从空间和时间两个维度来考虑地就是馆码后数据大小和编码耗费时长
协议层-协议构造
LENGTH: 数据包大小,不包含自身
HEADER MAGIC: 标识版本信息,协议解析时候快速校验
SEQUENCE NUMBER: 表示数据包的SegD,可用于多路复用,单连接内递增
HEADER SIZE: 头部长度,从第14个字节开始计算一直到PAYLOAD前
PROTOCOL ID: 编解码方式,有Binary和Compact两种
TRANSFORM ID: 压缩方式,如zib和snappy
NFO ID: 传递一些定制的meta信息
PAYLOAD: 消息体
小结
1.RPC框架主要核心有三层:编解码层、协议层和网络通信层
2.二进制编解码的实现原理和选型要点
3.协议的一般构造,以及框架协议解析的基本流程
4.网络库的基本架构,以及选型时要考察的核心指标