# 《RPC手撸专栏》第20章:服务消费者动态代理扩展优化

作者:冰河
星球: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框架层面屏蔽了创建请求协议对象的信息,这次,我想对动态代理进行扩展优化。

# 一、前言

写完就算完事儿了吗?不,你还要进行扩展优化!

在前面的章节中,我们不仅实现了服务消费者与服务提供者之间进行同步、异步、单向和回调调用,并且在外部服务调用服务消费者时,服务消费者也屏蔽了底层Netty通信的细节信息。实现了在服务消费者端基于动态代理的功能屏蔽了构建请求协议对象的细节。我们也将动态代理整合进了服务消费者,实现了直接调用接口返回结果数据。更进一步的,将服务消费者增加动态代理后的调用方式扩展为同步方式和异步方式两种方式。

但是,在RPC客户端RpcClient类中,基于接口的Class对象创建动态代理的方法扩展性不高,这里,我们需要进行优化。

说干就干,我们一起开始吧。

# 二、目标

目标很明确:对消费者端封装RPC远程通信的动态代理进行扩展优化!

目前,我们一起手写的RPC框架,在服务提供者端实现了不依赖任何第三方框架的包扫描功能,能够将标注有@RpcService的注解注册到本地Map中。在服务消费者端能够实现通过直接调用接口的方法来实现远程方法调用,服务消费者整合动态代理后支持同步调用和异步调用两种方式。

开发到这种程度,我相信比一般的RPC Demo程序更加强大。但是,出于对技术的执着追求,我们不能止步于此,在正式进入注册中心部分的开发外,还需要完成一些扩展和优化的事项,就比如这次需要对消费者端封装RPC远程通信的动态代理进行扩展优化。

那怎么办呢?还能怎么办呢?撸起袖子加油干吧!

# 三、设计

如果让你设计扩展优化消费者端封装RPC远程通信的动态代理,你会怎么设计呢?

对消费者端封装RPC远程通信的动态代理进行扩展优化后的整体流程如图20-1所示。

图20-1

由图20-1可以看出,消费者整合动态代理实现直接调用接口返回结果数据的大致流程如下所示:

(1)外部服务通过服务消费者RPC客户端构建接口代理对象。

(2)服务消费者RPC客户端会根据动态代理工厂接口,动态创建JDK动态代理对象或者其他扩展的动态代理对象。

(3)外部服务调用接口方法,实际上是调用的接口动态代理对象里的方法来调用远程方法。

(4)服务消费者端的动态代理模块,会根据外部服务传递过来的参数构建请求协议对象,这样就在RPC框架层面对外屏蔽了构建请求协议对象的细节。

(5)服务消费端代理模块构建完请求协议对象后,会通过自定义网络传输协议和数据编解码对数据编码成二进制字节流,传输到服务提供者。

(6)服务提供者接收到二进制数据流后,通过自定义网络传输协议和数据编解码对数据进行解码,将解码出的数据作为参数调用真实方法。

(7)真实方法经过业务逻辑处理后,会将结果数据返回给服务提供者。

(8)服务提供者接收到真实方法返回的结果数据后,会通过自定义网络传输协议和数据编解码对数据进行编码,将数据编码成二进制字节流后传输给服务消费者。

(9)服务消费者接收到服务提供者响应的二进制流数据后,通过自定义网络传输协议和数据编解码对数据进行解码,将数据解码成明文数据,再通过接口的动态代理对象将最终的结果返回给外部服务。

# 四、实现

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

# 核心类实现关系

对消费者端封装RPC远程通信的动态代理进行扩展优化后的核心类关系如图20-2所示。

图20-2

# 查看完整文章

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