涉猎RPC框架|青训营

88 阅读3分钟

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软件)

超时控制:某些服务出现问题时避免在这上面浪费时间(超时重传)

易用性:开箱即用,合理的默认参数选项,丰富的文档

周边工具:生成代码工具,脚手架工具

拓展性:
支持多协议,也支持灵活的自定义协议拓展

观测性:

用日志,进程追踪等等(之前的课有讲)

高性能:

在单机多服务端,多机多单服务端,多机多服务端环境下采用对应手段来保证一个高性能的服务