RPC概念模型
文字叙述就是用户层将要发的数据和请求打包,向服务器发送,随后服务器在服务端处理请求然后返回数据包
一次rpc的完整过程
通过编译器工具将IDL文件转换成语言对应的静态库
然后在发送请求时进行序列化,就是将数据封装成数据包,也叫编码(就是将数据从一种形式转变为另一种形式.jpg转成.png)
之后服务器收到数据包后再进行解包,这是从内存中的数据表示像字节序列的转换,也叫反序列化
通信协议
规范了数据包的格式和内容,处必须的请求响应数据外还有额外的元数据,比如包头包尾方法之类
网络传输
基于成熟的网络走TCP/UDP传输
RPC框架的分层
编解码层:将IDL文件转换为不同编程语言对应的代码,这一层封装了编解码逻辑
Interface definition file 是一个接口文件,它应该由用户利用IDL(interface definition language)语言编辑uuidgen产生的IDL原型文件而成。
这种文件是用来说明函数操作流程的文件
数据格式:TLV编码(tag标签,length长度value值(数据序号,标识符)(数据类型已经他的长度)(数据的值))
选型(类型的选择):兼容性:支持新字段的同时不影响老服务
通用性:支持跨平台,跨语言使用
性能:从空间和时间角度考虑,既要尽量节省空间大小(包尽量简短),也要尽量快的读取,编码,解码
语言特定格式
文本格式
二进制编码
TLV编码
Varint编码
选项
兼容性
通用型
性能
传输协议层
消息切分
特殊结束符:有一个统一的结束符来表示每个单元的结束(类似语言中的句号)
变长协议:length+body(定长+不定长),定长表示不定长部分的长度或者总长度,可以用int类型?
协议构造
整个数据包的构造
Length:数据包的大小(不包括这层单元的大小)
Header magic:版本信息,协议解析时快速校验
Sequence number:表示数据包的seqID,可用于多路复用,单连接内递增
Header size:头部长度,从第14个字节开始一直到PAYLOAD前
Protacol ID:编解码方式,有BINARY和COMPACT两种
Transform id:压缩方式
Info id:传递定制的元信息
Payload:数据
网络通信层:
要满足三个条件:
提供易用API
封装底层SOCKET API
连接管理和事件分发
功能:支持tcp,udp,uds等协议
异常处理等。。
性能
减少应用层数据的多次引用
高性能代码
进阶指标(关系到用户能不能稳定,方便的使用,后续的服务能不能简单的维护,监控异常以及代码是否能高效率运行)
稳定性:
应用层采用熔断策略,当客户端出现问题时,避免其影响到服务端的运行(异常处理)
限流:服务端可以应对巨大流量的冲击(天猫双11狂欢节服务器,春运12306软件)
超时控制:某些服务出现问题时避免在这上面浪费时间(超时重传)
易用性:开箱即用,合理的默认参数选项,丰富的文档
周边工具:生成代码工具,脚手架工具
拓展性:
支持多协议,也支持灵活的自定义协议拓展
观测性:
用日志,进程追踪等等(之前的课有讲)
高性能:
在单机多服务端,多机多单服务端,多机多服务端环境下采用对应手段来保证一个高性能的服务