RPC

原理

rpc.png

如何设计RPC协议

  1. 协议长度
  2. 序列化方式
  3. 协议头:协议标示、消息ID、消息类型
  4. 协议扩展字段
  5. payload

为什么需要序列化

网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象。 对象是不能直接在网络中传输的,所以我们需要提前把它转成可传输的二进制,并且要求转换算法是可逆的,这个过程我们一般叫做“序列化”。 serializer.png

常见序列化方式

  1. 语言原生序列化
  2. JSON
  3. Protobuf
  4. Thrift

选择序列化方式时,需要考虑性能、时间开销、空间开销、通用性、兼容性和安全性

RPC 网络通信方式

  1. 阻塞IO
  2. IO多路复用(更适合高并发的场景,可以用较少的进程(线程)处理较多的socket的IO请求)
  3. 非阻塞IO
  4. 异步IO(高版本Linux才有)

零拷贝

所谓的零拷贝,就是取消用户空间与内核空间之间的数据拷贝操作,应用进程每一次的读写操作,都可以通过一种方式,让应用进程向用户空间写入或者读取数据,就如同直接向内核空间写入或者读取数据一样,再通过DMA将内核中的数据拷贝到网卡,或将网卡中的数据copy到内核。 零拷贝有两种解决方式,分别是 mmap+write 方式和 sendfile 方式,mmap+write方式的核心原理就是通过虚拟内存来解决的 zero_copy.png

如何设计RPC框架

  1. 服务发现
  2. 健康检查
  3. 路由策略
  4. 异常重试
  5. 优雅重启、关闭
  6. 熔断限流
  7. 业务分组
  8. 安全体系(鉴权)
  9. 链路追踪