0%

【学习记录】—— RPC通信

在写代码时经常看到类似如下的函数调用

1
XXXXXRpc.XXXXXXXX({}, (res) => {XXXXXXXXX});

经学习后了解到这是向服务端发送请求的一类函数,所使用的是RPC通信的方式,起初我对此一无所知,在代码中多次调用该类函数向服务端发送请求,造成许多逻辑错误,后来在导师的讲解和自行学习下我逐渐对RPC有了一定的了解。

一、RPC的基本概念

1、全称 Remote Procedure Call(远程过程调用),是分布式系统常见的一种通信方法。
2、RPC通信是端到端的直接数据交互(客户端和服务端)
2、使得我们能够像调用本地服务一样调用远程服务,并且让调用者对网络通信这些细节透明,隐藏了远程调用网络通信底层的复杂性。

二、服务的调用方式

服务的调用方式有三种

  • 同步调用

    客户端发送请求后,同步等待服务端返回,容易导致服务端长时间无应答使得客户端线程挂死,一般需要设置线程等待时间

  • 异步服务调用

    异步服务调用有两种实现方式:一种是只通过Future来实现,还有一种是通过构造Listener对象并将其添加到Future中,用于服务端应答的异步回调。通过Future方式时,线程会阻塞在get结果的操作上;而使用Listener的方式是监听器异步的获取执行结果

  • 并行服务调用

    通过并行方式降低端到端的时延,如果依赖RPC接口返回值,并且连续调用的多个RPC之间没有依赖关系,可以采用并行化处理,可采用线程池实现

三、客户端和服务端相互通信的消息结构

客户端发出的请求消息:

  • 接口名称: 调用哪个接口 XXXRPC()
  • 方法名: 调用哪个方法
  • 参数类型
  • 参数值
  • requestID
  • …………

服务端的返回消息:

  • 返回值
  • 状态code
  • requestID
  • …………

四、RPC的通信流程

客户端首先发出请求,因为网络传输的数据为二进制,所以需要把请求的数据(包括参数、方法等)序列化,将消息发送给服务端后,服务端会接收并将其反序列化,根据客户端传过来的数据调用本地的服务,执行完毕后将得到的结果封装并进行序列化,发送给客户端,客户端接收到消息后将其反序列化获得需要的数据。

我的工作经常就是在客户端调用RPC发出一个请求,然后通过回调接收来自服务端的返回,一般会返回一个叫GCODE全局码的数据,根据返回的res参数进行判断接下来的操作(该请求成功与否,此时的玩家状态等),该请求一般和按钮功能绑定,通常在玩家点击某处后触发。