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

131 阅读5分钟

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

1.RPC的基本概念

在详细介绍RPC框架之前,我们有必要对RPC的基本概念作简单的了解

1.1 本地函数调用

在本地调用函数时,以下方代码为例,一般只需要进行以下步骤即可:

1.将a和 b的值压栈

2.通过函数指针找到calculate 函数,进入函数取出栈中的值2和3,将其赋予x和y

3.计算x*y,并将结果存在z

4.将z的值压栈,然后从calculate返回5.从栈中取出z返回值,并赋值给result

func main(){
    var a=1
    var b=2
    result:=calculate(a,b)
    fmt.println(result)
    return
}

func calculate(a int,b int) int {
    z:=a*b
    return z
}

1.2 远程函数调用(RPC - Remote Produce Call)

RPC远程调用,如其名字所言,通过网路连接,调用远程主机上的函数来为本机服务,如下图所示

image.png

1.3 RPC的概念模型

1984年,Nelson首次在论文《Implement RPC - Remote Produce Call》中提出了RPC的概念,如下图所示

image.png

1.4 一次RPC的过程

在一次RPC过程中,一般需要以下几个功能

  • IDL 接口定义语言:一种中立的方式来描述接口,使得在不同平台上的不同语言可以互相通信

  • 代码生成工具:可以将IDL转化为本平台上语言对应的库函数

  • 编解码:将具体信息通过编码转化为体积较小、方便传输的,以及从获得的信息流中解码获取信息

  • 通信协议:在网络通信过程中,自然需要协议来规范双方的交互

  • 网络传输:既然是远程调用,自然需要网络支持,通常是TCP/UDP

图解如下:

image.png

1.5 RPC的好处

相对于传统的本地调用,RPC的以下优势:

1.单一职责,有利于分工协作和运维开发

2.可扩展性强,资源使用率更优

3.故障隔离,服务的整体可靠性更高

1.6 RPC会带来的问题

当然,RPC在也有其应用上带来的问题

1.服务宕机,对方应该如何处理?

2.在调用过程中发生网络异常,如何保证消息的可达性?

3.请求量突增导致服务无法及时处理,有哪些应对措施?

为了解决这些问题,我们引入了RPC框架(后文会展示)。

2.分层设计

在具体实现RPC框架之前,我们要对其结构进行设计,而这些设计都是基于第一章中的概念

2.1 分层设计,以Apache Thrift为例

分层具有解耦,各层独立,便于分别解决等优点,因此我们对RPC框架作以下层次区分

image.png

2.2 编解码层

2.2.1 编解码层-所属位置

在上图中,一下部分被视为解编码层

image.png

2.2.2 编解码层-生成代码

从第一章我们知道,RPC框架需要一种代码生成工具,来让能够让各平台语言读懂的IDL转化为具体的代码。

image.png

2.2.3 编解码层-编码格式

在生成代码时,需要选择合适的编码格式,使得其满足特定要求,常见格式如下:

image.png

2.2.4 编解码层-对编码格式的要求

我们可以从以下指标衡量是不是一种我们需要的编码格式

  • 兼容性 支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度
  • 通用性 支持跨平台、跨语言
  • 性能 从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长

2.3 协议层

2.3.1 协议层-概念

一般有以下的方式来设计协议:

  • 特殊结束符 :一个特殊字符作为每个协议单元结束的标示

image.png

  • 变长协议 :以定长加不定长的部分组成,其中定长的部分需要描述不定长的内容长度

image.png

2.3.2 协议层-协议的构造

协议的具体设计我们可以类比http,tcp协议来进行学习。

image.png

2.3.3 协议层-协议的读取

在收到协议后,先读取协议中的MagicNumber获取协议的类型,得知协议具体的构成,再读取PayloadCodec获取协议的编码方式,进而读取payload内容

image.png

2.4网络通信层

2.4.1 网络通信层-传输方式

网络通信层一般使用TCP/UDP对数据进行传输,而我们可以使用Socket API进行TCP/UDP报文的发送

image.png

2.4.2 网络通信层-网络库

由于直接使用Socket API较为不便,于是引进了网络库来进行优化

image.png

3.PRC框架的关键指标

对于RPC框架,我们应该对其功能作出要求

  • 稳定性
  • 易用性
  • 拓展性
  • 观察性
  • 高性能

3.1 稳定性

3.1.1 稳定性-保障策略

image.png

3.1.2 稳定性-请求成功率

可以通过负载均衡,重试的方式来保证请求的成功率

image.png

3.1.3 稳定性-长尾请求

对相应时常较长的请求不等回复直接重发

image.png

3.1.4 稳定性-注册中间件

通过注册中间件,实现方便的功能挂载

image.png

3.1.5 易用性

  • 开箱即用
  • 有完整的操作文档

3.1.6 拓展性

对框架各部件,可以实现稳定的功能拓展,而不影响原功能

3.1.7 观测性

框架提供内置的如log,Metric,Tracing功能,对外提供易于观察性能指标的接口

3.1.8 高性能

一个优秀的框架当然要有良好的性能,不同场景下的问题可以分别解决。

image.png

4.总结

本文旨在描述RPC框架的思想,因此不对具体的框架进行阐述。

由先前的叙述,我们可以了解到一种当代框架的产生流程:在新的环境背景下,有了新的实现思想=》对思想进行理论归纳,作出系列标准=》对框架的实现功能进行细分,以完成各项性能指标=》具体实现框架

RPC便是在如今硬件性能强大,网络发达,服务器功能要求繁多的情况下应运而生的,虽然各家产品各有不同, 但本质大都不脱离上方的思想,可以根据此进行学习。