[ RPC 框架原理与实现 | 青训营笔记 ]

92 阅读2分钟

[ RPC 框架原理与实现 | 青训营笔记 ]

这是我参与「第五届青训营」伴学笔记创作活动的第 12 天

零、前言:

记个笔记顺便(恰青豆还是有很多不完善也有可能对的地方还请大佬们指正

一、本堂课重点内容:

  • 基本概念
  • 分层设计
  • 关键指标
  • 企业实践

二、详细知识点介绍:

12.1 基本概念

RPC -- Remote Procedure Calls 远程调用函数

解决的问题:函数映射,数据转换成字节流,网络传输

流程:编写IDL -> 生成代码 -> 编解码 -> 通信协议 -> 网络传输

rpc 带来了很多好处也带来了很多问题

12.2 分层设计

  1. 编解码层

2023-02-10-14-34-42-image.png 数据格式大多采用二进制编码如:TLV

Tag:标签

Length:长度

Value:值

sturct Person{
   1: required string username
// 二进制为 0b(类型 string) 00 01(tag = 1) 00 00 00 06(长度) 4d 61 74 69 6e(值 MARTIN)
}

选型:考虑兼容性,通用性,性能

  1. 协议层

    2023-02-10-14-41-20-image.png

    使用特殊字符或边长协议等作为内容的起始标志,http协议就是以回车加换行作为序列结尾

    协议的结构:

    2023-02-10-14-42-39-image.png

    LENGTHL:数据包大小

    HEADER MAGIC :标识版本信息,解析时校验

    SEQUENCE NUMBER:表示数据包的sqlID,多路复用

    HEADER SIZE:头部长度,从第14个字节到PAYLOAD

    PROTOCOL ID:编解码方式 Binary 和 compact

    TRANSFORM ID:压缩方式,zilb 等

    INFO ID:传递一些定制的 meta

    PAYLOAD:消息体

    协议解析: --Peek--> MagicNumber --Peek--> PayloadCodec --Decode--> Payload

  2. 网络通信层

    2023-02-10-14-50-03-image.png

    封装底层 Sockets API

    连接管理的事件分发

12.3 关键指标

  1. 稳定性

    熔断:保护调用方,防止被调用的服务影响整个链路

    限流:保护被调用方,防止大流量把服务压垮

    超时控制:避免浪费资源在不可用节点上

  2. 稳定性

    负载均衡

    长尾请求:一般明显高于均值的那部分占比较小的请求,业内P99标准指顺序处于99%的值为P99,剩下的1%为长尾请求,设定比超时时间小的阈值,发起重试

    注册中间件

  3. 易用性

  4. 拓展性

  5. 高性能:高吞吐,低延时

12.4 企业实战

Kitex:

2023-02-10-15-05-29-image.png

tool:代码生成工具     byted:与内部基础设施集成    core:核心组件(注册,限流,负载均衡等)

自研网络库 Neptoll

引入 epoll 主动监听机制,感知连接

建立 goroutine 池 复用 goroutine

引入 Nocopy Buffer,向上层提供 NoCopy 的调用接口,编解码层面零拷贝

扩展性设计:

交互方式上面支持:ping-pong,streaming,oneway

编解码支持:thrift,protobuf

应用层支持:TTHeader,Http2,thrift

传输层支持:TCP

2023-02-10-15-12-43-image.png

合并部署

2023-02-10-15-15-22-image.png