# 《RPC手撸专栏》第16章:服务消费者回调方法的实现

作者:冰河
星球: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框架的服务消费者支持以同步、异步和单向调用的方式与服务提供者进行数据交互。具体的实现方式如下:

(1)同步调用:外部服务调用服务消费者向服务提供者发送数据的方法后,需要同步等待服务消费者返回的结果数据。

(2)异步调用:外部服务调用服务消费者向服务提供者发送数据的方法后,不需要同步等待服务消费者返回的结果数据,只需要从RpcContext上下文中获取到RPCFuture对象,调用RPCFuture对象的get()方法获取数据即可。

(3)单向调用:外部服务调用服务消费者向服务提供者发送数据的方法后,不必关心返回的结果数据。

除了这三种调用方式外,我们想想如何实现服务消费者的回调方法?

# 二、目标

撸起袖子加油干,服务消费者就是要支持回调方法!

说的直白点回调方法就是调用方向被调用方发起请求,或者调用方调用被调用方的方法时,传入一个回调接口,当被调用方执行完业务逻辑后,会触发回调接口中方法的执行。

还是有点绕,这么说吧,比如服务A中的方法a调用服务B中的方法b,服务B中的方法b需要传入一个回调接口作为参数,在服务A的方法a中会创建回调接口的实例对象作为参数,传递给服务B中的方法b,服务B中方法b在执行完业务逻辑后,会调用回调接口的方法。此时,就会触发服务A的方法a中的回调接口实例对象实现的方法逻辑。

那RPC框架为何要实现回调方法呢?大家可以试想一个场景,在某些场景下,当服务消费者接收到服务提供者响应的结果数据后,需要立刻主动触发外部服务的某些方法,此时,就需要回调方法的支持。在外部服务中,调用服务消费者向服务提供者发送数据的方法后,不必关心服务消费者返回的结果数据,只需要处理好回调方法即可,服务消费者会通过回调方法将返回的结果数据传递给外部服务。

本章的目标就是实现服务消费者的回调方法。

# 三、设计

如果是让你设计服务消费者端的回调方法,你会怎么设计呢?

服务消费者支持回调方法的设计如图16-1所示。

图16-1 服务消费者支持回调方法的设计

可以看到,服务消费者支持回调方法的流程如下所示。

(1)服务消费者传递必要的参数,向服务提供者发起RPC请求。

(2)服务消费者不会等待服务提供者返回结果数据,会立刻返回。

(3)服务提供者接收到服务消费者发送过来的数据,执行业务逻辑。

(4)服务提供者执行完业务逻辑后,会向服务消费者响应结果数据。

(5)服务消费者端RPC模块接收到服务提供者返回的结果数据后,会主动触发回调方法,将结果数据传递给外部服务。

看起来设计还是挺简单的,接下来,就是一起实现它了!

# 四、实现

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

# 1.工程结构

  • bhrpc-annotation:实现bhrpc框架的核心注解工程。

  • bhrpc-codec:实现bhrpc框架的自定义编解码功能。

  • bhrpc-common:实现bhrpc框架的通用工具类,包含服务提供者注解与服务消费者注解的扫描器。

  • bhrpc-constants:存放实现bhrpc框架通用的常量类。

  • bhrpc-consumer:服务消费者父工程

    • bhrpc-consumer-common:服务消费者通用工程
  • bhrpc-protocol:实现bhrpc框架的自定义网络传输协议的工程。

  • bhrpc-provider:服务提供者父工程。

    • bhrpc-provider-common:服务提供者通用工程。
    • bhrpc-provider-native:以纯Java方式启动bhrpc框架的工程。
  • bhrpc-serialization:实现bhrpc框架序列化与反序列化功能的父工程。

    • bhrpc-serialization-api:实现bhrpc框架序列化与反序列化功能的通用接口工程。
    • bhrpc-serialization-jdk:以JDK的方式实现序列化与反序列化功能。
  • bhrpc-test:测试bhrpc框架的父工程。

    • bhrpc-test-api:测试的通用Servcie接口工程
    • bhrpc-test-provider:测试服务提供者的工程。
    • bhrpc-test-consumer:测试服务消费者的工程
      • bhrpc-test-consumer-codec:测试服务消费者基于自定义网络协议与编解码与服务提供者进行数据交互
      • bhrpc-test-consumer-handler:测试屏蔽服务消费者基于Netty与服务提供者建立连接的细节后,与服务提供者进行数据通信
    • bhrpc-test-scanner:测试扫描器的工程。

工程源码: 关注冰 冰河技术 微信公众号,回复 bhrpc, 获取代码链接地址。

# 2.核心类实现关系

服务消费者实现回调的实现类关系如图16-2所示。

图16-2 消费者实现回调的核心类关系

# 查看完整文章

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