青训营go语言之RPC| 豆包MarsCode AI 刷题

79 阅读5分钟

RPC在大众的定义上称为:远程过程调用,下面举个栗子给大家分析。

如:从订单服务中获取用户的信息

在单体服务下(new UserService).GetUser(uid)我们可以这样的方式调用获取,但是当服务拆分开后代码也拆分为两份,这个时候就无法如单体服务那样new的方式调度,需通过rpc进行调度。

image.png
在每个微服务中会开启一个rpc服务供其他服务访问,请求方这时会创建一个rpc的客户端,然后通过这个客户端向目标服务发送rpc请求,服务端收到请求后,根据请求信息就可以调用GetUser(uid)返回结果。

image.png
再来理解rpc的定义【远程调度过程】,

  • 这里的远程就是指因为系统根据服务拆分了,原本的调度过程是通过new的方式,现在要改为从当前服务器去另一台服务器中调度。
  • 那调度过程又是指什么呢?指的是rpc_client请求rpc_server的过程,而此处的过程在细节上是调度的传输协议、连接方式、序列化及数据格式等。

即该定义【RPC:远程调度过程】,就是对在微服务中服务与服务之间相互调度的方式过程的统称。

2. RPC的通信过程

了解到RPC的定义后那RPC又是如何通信的呢:我们通过如下几个问题来理解。

问题1:我们应该如何找到目标服务

通过ip和port既可以确定目标服务器和程序。

问题2:请求的目标是什么?

根据上面的例子是调用的userServer中的GetUser方法,及以用户服务中的业务方法作为目标。

问题3:调度传输的数据结构如何设计?

针对该问题可能存在的几个情况

  1. 首先需要固定一个特定格式作为rpc_client与rpc_server的通信格式标准
  2. 请求的目标服务可能存在多个方法,因此我们在请求的时候需要告服务,我们要请求的方法
  3. 请求的目标服务还需要考虑传递参数
  4. 再细节点可能因网络关系会存在消息接收延迟,可能同时接收了多个消息,因此还需考虑消息的区分问题。

因此可以约定如下格式

type Request struct {
	Method string      `json:"method"` 
	Params interface{} `json:"params"`
	Id     string      `json:"id"`
}

type Response struct {
	Id     string      `json:"id"`
	Result interface{} `json:"result"`
	Error  error       `json:"error"`
}

问题4:数据用传输协议?

rpc的通信中传输协议可以用json/xml/binary等

问题5:rpc服务客户端基于什么网络协议实现?

rpc并没有固定采用特定的网络协议来实现,在目前业界中以tcp与http2协议为主实现,也可以通过http甚至是udp也是可以的。

最后我们来看看RPC的通信过程示意图:

image.png
在示意图中

  1. 客户端与服务端之间会先约定统一的编码/数据格式,一般都是以服务端定义为主。
  2. 客户端在本地代码中发起调度
  3. client stub(客户端存根):实际就是对rpc请求的封装包代码,主要事情是将接收到的调度请求,进行组装为对应的数据结构/编码/并将消息通过网络发送给目标服务器
  4. server stub(服务端存根):实际就是对rpc请求的封装包代码,主要是将接收到的消息按照定义好的编码拆包,获取请求方法与参数,并根据方法名和参数进行本地调用。
  5. 服务端处理完请求,将结果通过server stub处理返回给调用的客户端。
  6. 调用的客户端中基于client stub获取到请求后解析,最终得到本次rpc调用的结果

3. 通信协议的选择

为什么RPC会大都以tcp协议为主实现呢?而不是采用http。

RPC通信采用TCP为主而不是HTTP的原因有以下几点:

  1. 效率:TCP是一种面向连接的可靠传输协议,相对于HTTP来说,TCP协议的通信效率更高。TCP在传输数据时,采用了流式传输的方式,可以保证数据的完整性和可靠性,适合于需要高效传输大量数据的场景。
  2. 传输量:RPC通常用于传输大量的数据,而HTTP协议对于传输大量数据的支持相对较弱。HTTP协议在传输数据时,会对数据进行分块传输,增加了数据的传输量和传输时间。
  3. 灵活性:RPC通信可以使用多种通信协议,包括TCP、UDP等,而HTTP协议只能使用TCP作为传输协议。RPC可以根据具体的需求选择合适的通信协议,提供更灵活的通信方式。
  4. 安全性:TCP协议支持加密和身份验证等安全机制,可以提供更高的安全性。对于需要保护数据安全的场景,RPC通信采用TCP协议可以更好地满足安全需求。

尽管HTTP协议也可以用于RPC通信,但相对于TCP来说,它的通信效率和传输量较低,不适合于需要高效传输大量数据的场景。因此,RPC通信更倾向于采用TCP作为主要的传输协议。

4. 总结

本节中主要分析RPC的定义远程调度过程,以及RPC的具体通信过程。需注意的是RPC的网络实现方式不是固定于某一种可以基于http、tcp、http2,只是目前业界中以tcp居多。