# 《RPC手撸专栏》第32章:基于SPI扩展JDK动态代理机制

作者:冰河
星球: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)

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

大家好,我是冰河~~

在前面的章节中,我们实现了对标Dubbo的SPI基础功能,并基于SPI扩展了JDK、Json、Hessian2、FST、Kryo与Protostuff的序列化与反序列化方式,就序列化模块而言,整体具备了高度的可扩展性。今天,我们基于SPI扩展动态代理模块。

# 一、前言

动态代理要怎么扩展呢?

在RPC框架的服务消费者端,实现了动态代理的功能,在动态代理中会将传递的参数封装成请求协议对象,由服务消费者发送到服务提供者。在前面的文章中,我们在代码中写死了使用JDK的方式实现动态代理功能。例如,在bhrpc-consumer-native工程下的io.binghe.rpc.consumer.RpcClient类中的create()方法,就写死了使用JDK动态代理的功能,代码如下所示。

public <T> T create(Class<T> interfaceClass) {
    ProxyFactory proxyFactory = new JdkProxyFactory<T>();
    proxyFactory.init(new ProxyConfig(interfaceClass, serviceVersion, serviceGroup, serializationType, timeout, registryService, RpcConsumer.getInstance(), async, oneway));
    return proxyFactory.getProxy(interfaceClass);
}
1
2
3
4
5

尤其是下面这行代码,对于程序的扩展性是非常差的。

ProxyFactory proxyFactory = new JdkProxyFactory<T>();
1

接下来的几章,我们就要对动态代理下手了。

# 二、目标

目标很明确:基于SPI扩展JDK动态代理机制。

动态代理机制能够在原有方法的基础上增强很多功能,比如在执行方法的前后执行一些其他的逻辑。在不修改原有逻辑的情况下新增一些功能等等。

在前面的文章中,我们只是在服务消费者端实现了JDK动态代理功能,并且还是在代码中写死了创建JDK动态代理的对象。本章,我们就扩展服务消费者动态代理功能,基于SPI扩展JDK的动态代理机制。

# 三、设计

如果让你设计基于SPI扩展动态代理机制,你会怎么设计呢?

基于SPI扩展动态代理机制的流程如图32-1所示。

图32-1

由图32-1可以看出,使用SPI机制扩展动态代理的功能后,服务消费者RPC客户端会引用动态代理工厂接口,并基于SPI动态加载代理工厂接口的实现类。这种方式能够极大的增强动态代理功能的扩展性。

# 四、实现

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

# 核心类实现关系

基于SPI再次扩展JDK动态代理机制的核心类关系如图32-2所示。

图32-2

# 查看完整文章

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