深入浅出 RPC 框架|青训营笔记

140 阅读2分钟

这是我参与「第三届青训营 - 后端场」笔记创作活动的的第 3 篇笔记。

之前用过一次RPC框架:Go Micro,太劝退了。这次学学新的框架:Kitex

一、基本概念

User->User Stub->RPC Runtime->Server stub -> Server 1、 编写IDL(Interface description language)

  • 生成代码:将IDL转换为语言对应的静态库。
  • 编解码:即序列化和反序列化,内存到字节序列称为编码,反之为解码。
  • 通信协议:规范了数据在网络中传输的内容和格式,除了请求/响应数据,还有其他的元数据(类似HTTP)。
  • 网络传输:TCP/UDP传输

优点:单一职责、可扩展性强、故障隔离

一些问题:

  • 服务宕机如何处理?
  • 消息可达性如何保证?
  • 服务阻塞如何处理?

二、分层设计

Thrift分层:

  • Code: 业务逻辑编码
  • Service Client:IDL封装转换的逻辑代码
  • read/Write
  • TProtocal: 编解码层
  • TTransport:协议层
  • ...
  • NetworkIO:网络通信层: Socket API

2.1 编解码层-数据格式

编码选型需要考虑兼容性、通用性与性能。

  • 语言特定的格式: Java的Java.io.Serializable
  • 文本格式:Json、XML、CSV
  • 二进制编码:Thrift的BinaryProtocol、Protobuf

TLV 编码:

  • tag:标签、类型,
  • length: 长度,
  • Value: 值,可以TLV, 例如: 1:required string UserName,

2.2协议层

特殊结束符: \r\n 变长协议:长度+不定长协议体

三、关键指标

  • 稳定性:
    • 保障策略:熔断、限流、超时控制
    • 请求成功率
      • 保障策略: 负载均衡、重试
    • 长尾请求: P999、P99、P95
      • 保障策略: Backup Reqest(请求备份)
    • 注册中间件(拦截器)
  • 易用性:开箱即用(合理的默认参数选项、丰富的文档)、周边工具(脚手架工具)
  • 扩展性:
    • Middleware
    • Option
    • 编解码层
    • 协议层
    • 网络传输层
    • 代码生成工具插件扩展
  • 观测性:
    • Log
    • Metric
    • Tracing
    • 内置观测性服务
  • 高性能:
    • 目标
      • 高吞吐
      • 低延时
    • 场景
      • 单/多机
      • 单/多连接
      • 单/多 Client/Server
      • 不同大小的请求包
      • 不同请求类型: pingpong、streaming
    • 手段
      • 连接池
      • 多路复用
      • 高性能编解码协议
      • 高性能网络库