# 《RPC手撸专栏》第15章:服务消费者同步、异步、单向调用的实现

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~

很多好用的RPC框架都支持服务消费者以同步、异步和单向调用的方式与服务提供者进行交互,你开发的这个RPC框架也可以吗?

# 一、前言

我使用你开发的RPC框架时,想让服务消费者以同步、异步、单向调用的方式与服务提供者进行交互,可以实现吗?

在前面的章节中,实现了服务消费者屏蔽掉基于Netty连接服务提供者的实现细节的前提下,以异步转同步的方式调用服务提供者。在外部服务调用服务消费者向服务提供者发送数据的方法时,能够直接获取到服务提供者调用真实方法返回的结果数据。

那RPC框架只支持同步调用的话,在高并发环境下肯定会出现性能问题,我想让RPC框架支持同步、异步和单向调用,这也是很多优秀的RPC框架都支持的功能,这个有办法实现吗?

我:安排。。。

# 二、目标

服务消费者必须支持同步、异步和单向调用!

在服务提供者一端实现了按照自定义网络传输协议和数据编解码对接收到的数据进行解析,并且能够将解析到的数据作为参数调用真实方法,并接收真实方法返回的结果数据,通过自定义网络协议和数据编解码,将数据编码成二进制字节流,传输给服务消费者。

在服务消费者一端实现了按照自定义的网络传输协议和数据编解码,将数据编码成二进制字节流发送给服务提供者,能够接收到服务提供者响应回来的二进制字节流数据,并且能够根据自定义网络传输协议和数据编解码,将接收到的二进制字节流数据解码成对应的明文数据,接下来,进行进一步处理。

同时,服务消费者支持在屏蔽掉基于Netty连接服务提供者的实现细节的前提下,使得外部服务调用服务消费者向服务提供者发送数据的方法时,能够直接获取到服务提供者调用真实方法返回的结果数据。

做到这里,已经初步实现了RPC框架最基本的功能。这还远远不够,服务消费者除了能够以同步的方式调用服务提供者,也要支持异步调用和单向调用,看看人家Dubbo,做的是真特么牛逼。

好了,不羡慕人家,我们自己踏踏实实手撸吧,本章,我们就实现服务消费者以同步、异步、单向调用的方式与服务提供者进行交互。

# 三、设计

如果让你设计服务消费者基于同步、异步、单向调用的方式与服务提供者进行交互,你会怎么设计呢?

服务消费者与服务提供者之间基于同步、异步和单向调用的设计图分别如图15-1~15-3所示

  • 同步调用

图15-1 同步调用流程

  • 异步调用

图15-2 异步调用流程

  • 单向调用

图15-3 单向调用流程

通过图15-1~15-2可以看出:

(1)同步调用的方式,服务消费者发起数据请求后,会同步等待返回结果。

(2)异步调用的方式,服务消费者发起数据请求后,会立刻返回,后续会通过异步的方式获取数据。

(3)单向调用的方式,服务消费者发起数据请求后,会立刻返回,不必关注后续数据的处理结果。

可以看到,从设计上还是比较简单的,接下来,我们就一起实现它。

# 四、实现

说了这么多,具体要怎么实现呢?

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码