微服务之RPC框架

109 阅读2分钟

完整的 RPC 请求流程

RPC 在 server 端定义 pb(Protobuf) 文件,由编译工具生成 stub 桩文件,相当于链接静态库的方法实现了函数映射。

image.png client 进行调用时,通过 Protobuf 的序列化协议进行encoding,根据 RPC 协议约定数据头、元数据、消息体等,保证有 ID 能使请求和返回结构做到一一映射。然后基于成熟的网络库进行 TCP/UDP 传输。

面试题:

  • 函数映射:静态代理,生成 stub 文件
    • 对比建立 HTTP 请求连接,RPC 在编写代码时降低了复杂度
    • stub 文件让远程调用看起来是本地调用
  • 序列化:为了生成二进制数据
    • HTTP/1 直接发送 JSON 明文
    • gRPC 以 protobuf 作为序列化协议
  • 网络传输
    • 自定义 RPC 协议实现通信
    • 使用成熟的网络库,实现多路复用、可靠传输

RPC 与 HTTP 有哪些区别

  • HTTP 是应用层协议

  • RPC 是远程过程调用,是调用方式

  • 所谓的 RPC 协议,实际上是基于 TCP、UDP、甚至HTTP2改造后的自定义协议

编(解)码层

网络传输前,需要将结构体转换为二进制(序列化) 通信协议:基于 TCP,会有消息头和消息体,区别在于消息头

HTTP/1.1

  • 序列化协议:JSON
    • 额外空间开销大,没有类型,开发时通过反射统一解决
  • 通信协议
    • 灵活,可以自定义很多字段
    • 缺点是包含很多为了适应浏览器的冗余字段,内部服务用不到

RPC

  • 序列化协议:以gRPC为代表的 Protobuf,其他也类似
    • 序列化后体积比 JSON 小,传输效率高
    • 序列化、反序列化速度快,开发时不需要通过反射,性能消耗低
    • IDL 描述语义比较清晰
  • 通信协议
    • 可定制化,自定义必要字段即可
    • 可摒弃很多 HTTP Header 中的字段