RPC
2022-07-30 21:00:11 0 举报
AI智能生成
rpc框架设计
作者其他创作
大纲/内容
从设计者角度看RPC的细节
根本原因还是 数据在网络是2进制数据
协议
用来断句,给2进制数据断句
网络传输的数据都是2进制,设计好边界就可以知道数据完整性
如何设计一个通信协议
协议头
一个bit 偏移位
16个魔术位
协议长度
32位
头长度
预留扩展的头扩展的长度
消息ID
请求和响应的关联
24位
协议版本
8位
消息类型
序列化方式
多种序列化的方式
子主题
子主题
预留可以扩展的字段
协议体
payload
不用http的原因
相对私有的RPC协议,http 协议包太大,
协议无状态,请求和响应不能关联
每次请求都需要 重新建立连接
序列化和反序列化
将对象转化成2进制流叫序列化
原因
调用方入参和响应都是对象
将2进制转换成对象是反序列化
原因
提供方将返回的数据序列化成2进制流,调用反序列化获取结果
常见技术并理解优缺点
Java原生的序列化方式
不能跨语言,只支持java
序列化的内容大,网络传输的效率低
json
可读性好
序列化内容也是比较大
Hessian
动态类型、二进制、紧凑的,并且可跨语言移植的一种序列化框架
但 Hessian 本身也有问题,官方版本对 Java 里面一些常见对象的类型不支持,
Protobuf
需要写IDL
序列化后数据很小,性能好
序列化技术的权衡
安全
通用性
....
网络
TCP 协议
socket 编程
IO模型
阻塞IO
提升性能当时 request per thread
请求多了会创建大量线程打爆线程池
IO多路复用
多路
多个IO请求
复用
一个复用器
实现方式
轮训所有IO的请求,将满足的连接返回。
事件驱动方式
具体过程
注册事件
将符合条件的事件 通过回调通知调用者
IO优化
0拷贝
0拷贝主要是减少用户态到内核态数据的拷贝
实现方式
mmap + write
用mmap 函数 代替read 函数
read 函数
将数据从内核态拷贝到用户态
mmap() 系统调用函数会直接把内核缓冲区里的数据「映射」到用户空间
操作系统和应用程序能够共享此缓冲区,内核不需要从应用程序拷贝数据到socket 缓存区域
sendfile
在 Linux 内核版本 2.1 中,提供了一个专门发送文件的系统调用函数
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
它的前两个参数分别是目的端和源端的文件描述符,后面两个参数是源端的偏移量和复制数据的长度,返回值是实际复制数据的长度。
传统IO 读取数据,先从硬件使用DMA拷贝到内核态, 然后从内核态将数据拷贝到用户态
netty 模型
动态代理
用动态代理的执行底层调用rpc 的细节.用使用者就像调用本地方法一样
从使用者的角度来看RPC
提供方
反射调用接口
编码和解码
如何解析参数
如何将相应结果发送出去
网络
调用方
动态代理
封装网络调用细节
编码和解码
这个是如何发送参数
如何接受返回值
如何发送数据
http
hisson
....
网络
通信协议
协议字段
通信的消息Id
支持的序列化协议等
包体
通信
TCP
可靠协议
长连接
IO 模型
NIO 通信
netty通信
0 条评论
下一页
为你推荐
查看更多