深入浅出RPC框架 | 青训营

54 阅读2分钟

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

1. 基本概念

1.1、本地函数调用

image-20230217193130114

  1. 将a和b 的值压栈
  2. 通过函数指针找到calculate函数,进入函数取出栈中的值2和3,将其赋予×和y
  3. 计算x*y,并将结果存在z
  4. 将z的值压栈,然后从calculate返回
  5. 从栈中取出z返回值,并赋值给result

1.2、远程函数调用(RPC - Remote Procedure Calls)

image-20230217193246140

RPC需要解决的问题

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

1.3、RPC概念模型

image-20230217193339360

1.4、一次RPC的完整过程

IDL (Interface description language)文件

  • IDL通过—种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信

生成代码

  • 涌过编译器工具把IDL文件转换成语言对应的静态库

编解码

  • 从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化

通信协议

  • 规范了数据在网络中的传输内容和格式。除必须的请求/响应数据外,通常还会包含额外的元数据

网络传输

  • 通常基于成熟的网络库走TCP/UDP传输

image-20230217193513267

1.5、RPC的好处

  1. 单一职责,有利于分工协作和运维开发
  2. 可扩展性强,资源使用率更优
  3. 故障隔离,服务的整体可靠性更高

image-20230217193548789

1.6、RPC带来的问题

  1. 服务宕机,对方应该如何处理?
  2. 在调用过程中发生网络异常,如何保证消息的可达性?
  3. 请求量突增导致服务无法及时处理,有哪些应对措施?

2. 分层设计

分层设计-以Apache Thrift为例

image-20230217193719513

2.1、编解码层

image-20230217193853977

生成代码

image-20230217193925491

数据格式

二进制编码

image-20230217194002746

选型

image-20230217194015451

2.2、协议层

image-20230217194114652

概念

image-20230217194804859

协议构造

image-20230217194819495

协议解析

image-20230217194832153

2.3、网络通信层

image-20230217194646001

Sockets API

image-20230217194657052

网络库

image-20230217194707748

3. 关键指标

3.1、稳定性

保障策略

image-20230217194534538

请求成功率

image-20230217194540741

长尾请求

image-20230217194547895

注册中间件

image-20230217194555083

3.2、易用性

image-20230217194220912

3.3、扩展性

image-20230217194228431

3.4、观测性

image-20230217194237022

3.5、高性能

image-20230217194244735

4. 企业实践

4.1、整体架构

image-20230217194335585

4.2、自研网络库

image-20230217194506584

image-20230217194512178

4.3、扩展性设计

image-20230217194347006

4.4、性能优化

image-20230217194415055

image-20230217194421006

4.5、合并部署

image-20230217194434244

image-20230217194449770