23 | 如何在没有接口的情况下进行RPC调用?

我们什么情况下需要在没有接口时进行RPC调用?
列举2个典型场景:

  1. 我们搭建一个测试平台,允许各个业务方在测试凭条上通过输入接口、分组名、方法名以及参数值,在线测试自己发布的RPC服务。
  2. 我们要搭建一个轻量级的服务网关,可以让各个业务方用HTTP的方式,通过服务网关调用其他服务。

所谓RPC调用,本质上就是调用端向服务端发送一条请求消息,服务端接收并处理,之后向调用端发送一条响应消息,调用端处理完响应消息后,一次RPC调用就完成了。

如果调用端可以将服务端需要知道的消息,例如接口名、业务分组名、方法名以及参数信息封装成请求消息发送给服务器,服务端就能够解析并处理这条请求信息,这样问题就解决了。

我们可以使用泛化接口的方式,来让RPC框架通过动态代理的方式,在没有接口的情况下,进行RPC调用,也称为泛化调用。

24 | 如何在线上环境里兼容多种RPC协议?

不同的RPC框架随着互联网技术的发展而慢慢涌现,这些框架会在不同时期被引入到不同的项目中去解决应用之间的通信问题,这样就导致了我们在线上的环境中会存在各种各样的RPC框架。

我们可以尝试通过自下而上的滚动升级方式,最终让所有的应用都切换到统一的RPC框架上,这种方法有2个局限:

  1. 这要求我们能够清楚的梳理出各个应用之间的调用关系,只有这样,我们才能按部就班地把所有应用都升级到新的RPC框架上。
  2. 这要求应用之间的关系不能存在互相调用的情况,最好是应用之间的调用关系就像一棵树,有一定的层次关系。但实际上,应用之间的调用关系往往会变成一张网。

这里的关键在于,我们要让新的RPC能同时支持多种RPC调用,当一个调用方切换到新的RPC之后,调用方和服务提供方之间就可以用新的协议完成调用,当调用方用老的RPC进行调用时,调用方和服务提供方之间就继续沿用老的协议完成调用。

RPC协议的作用是用来分割二进制数据流,不同的协议约定的数据包格式是不一样的,而且每种协议开头都有一个协议编码, 一般叫做magic number。

当RPC收到数据包之后,我们可以先解析出magic number,之后就可以找到对应协议的数据格式,然后使用相应的数据格式去解析收到的二进制数据包。

协议解析过程就是把一连串的二进制数据变成一个RPC内部对象,我们可以把和协议相关的对象转换成一个和协议无关的对象。

当完成真正的方法调用以后,RPC返回的也是一个和协议无关的通用对象,当我们向调用方回写数据时,我们还需要把通用对象转换成和协议相关的对象。