深度剖析ApacheDubbo核心技术内幕
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.6 Dubbo使用JavaAssist减少反射调用开销

Dubbo会给每个服务提供者的实现类生产一个Wrapper类,这个Wrapper类里面最终调用服务提供者的接口实现类,Wrapper类的存在是为了减少反射的调用。当服务提供方收到消费方发来的请求后,需要根据消费者传递过来的方法名和参数反射调用服务提供者的实现类,而反射本身是有性能开销的,Dubbo把每个服务提供者的实现类通过JavaAssist包装为一个Wrapper类以减少反射调用开销。那么Wrapper类为何能减少反射调用呢?

假设我们的服务提供方实现类为GreetingServiceImpl,其代码如下:

那么其对应的Wrapper类的源码如下:

通过上面的代码可知,Wrapper1类的invokeMethod最终直接调用的是GreetingServiceImpl的具体方法,这就避免了反射开销,而Wrapper1类是在Dubbo服务启动时生成的,所以不会对运行时带来开销。

下面我们看看Dubbo是在哪里生成Wrapper类的。在Dubbo分层架构概述中,我们讲过Proxy层的SPI扩展接口为ProxyFactory,Dubbo提供的实现主要有JavassistProxyFactory(默认使用)和JdkProxyFactory,其实就是JavassistProxyFactory为每个服务提供者实现类生成了Wrapper类: