RPC框架 | 青训营

55 阅读3分钟

RPC框架

本地函数调用 VS 远程函数调用(RPC - Remote Procedure Calls)

image-20230808225110891

一、基本概念

要解决的问题:

  1. 函数映射
  2. 数据转换为字节流
  3. 网络传输

1.2 概念模型

image-20230808225326150

五个模型:
  • User
  • User-Stub
  • RPC-Runtime
  • Server-Stub
  • Server

1.3 基本概念

image-20230808225542450

  • IDL
  • 生成代码:把IDL文件转换成不同语言的lib代码
  • 编码解码(序列化反序列化)
  • 通信协议:消息体以外的信息
  • 网络传输

1.4 好处

  1. 单一职责,利于分工协作,可以用不同代码进行开发
  2. 功能可扩展性强,资源使用率更优
  3. 故障隔离

1.5 RPC 带来的问题

  1. 服务宕机
  2. 网络异常
  3. 请求量剧增难以处理

二、分层设计

  • 编解码层
  • 协议层
  • 网络通信层

image-20230808230337664

2.1 编解码层(紫色+绿色)

2.1.1 生成代码

把IDL文件转换成不同语言的lib代码

image-20230808230520661

2.1.2 编码格式

  • 编程语言编码成字节序列的特定格式
  • JSON、XML、CSV等文本格式
  • 二进制编码

二进制编码实现方式之一:TLV编码

  • Tag(多余
  • Length(多余
  • Value

image-20230808231210945

2.1.3 选一种编码格式

考虑:

  • 兼容性:不同版本
  • 通用性:跨平台跨语言
  • 性能:空间时间开销

2.2 协议层

概念:

  1. 特殊结束符:标记每个协议单元结束
  2. 变长协议:定长+不定长,定长部分中描述不定长部分长度

协议构造

image-20230808231850164

2.3 网络通信层-Sockets API

应用层和传输层(TCP)之间image-20230808232325846

一般用封装好的网络库

要考察的核心指标:

  • 提供易用API

    • 封装底层Socket API
    • 连接管理和事件分发
  • 功能:

    • 协议支持(TCP、UDP、UDS等)
    • 优雅退出、异常处理等
  • 性能:

    • 应用层 buffer 减少 copy
    • 高性能定时器、对象池等

三、关键指标

  • 稳定性

    • 相关策略:降级:

      • 熔断:保护调用方
      • 限流:保护被调用方不被过大流量冲垮
      • 超时控制
    • 提高请求成功率相关方式:

      • 负载均衡
      • 重试
    • 长尾请求:比较小的请求(1%小),比如网络抖动等

      • 提高成功率方式:备份请求(Backup Request)image-20230808233908367
      • 如果正常时间 t3 内没收到回复再发一次备份请求,t4 就能收到
    • 具体实现:注册中间件(middleware、拦截器)

      • 创建时通过可选方式带上这些策略
  • 易用性

    • 合理的默认参数选项、丰富的工作文档
    • 周边工具:智能代码生成工具、脚手架工具,减少重复性工作
  • 扩展性

  • 观测性

    • 传统三件套

      • log日志
      • Metric
      • Tracing
    • 内置状态暴露服务(往往是一个简单的HTTP服务)

      • 观测平台
      • 中间件使用
      • 用户配置
      • 等等
  • 高性能

    image-20230808234950910

四、企业实践

github.com/cloudwego

4.1 整体架构

image-20230808235243930

4.2 自研网络库 - Netpoll

4.3 扩展性设计

image-20230808235444473

4.4 性能优化

  • 网络库优化:

    image-20230808235627840

  • 编解码优化:

image-20230808235705141

4.5 微服务合并部署

亲和性强的服务实例尽可能调度到同一个物理机,远程RPC转为本地IPC调用

中心化定制化