七Dubbo各模块的层次核心接口及组件类--6Proxy--RPC模块

七Dubbo各模块的层次核心接口及组件类--6Proxy--RPC模块

7.6 Proxy(RPC模块)

服务代理层:实现服务接口的透明代理,生成服务的客户端stub和服务器端skeleton。

模块 Dubbo层 各层核心接口
Service ServiceBean ReferanceBean
dubbo-config Config ServiceConfig ReferanceConfig
dubbo-RPC Proxy ServiceProxy ProxyFactory
dubbo-registry Registry RegistryFactory Registry RegistryService
dubbo-cluster Cluster Cluster Directory Router LoadBalance
dubbo-monitor Monitor
dubbo-RPC Protocol Filter Invoke Prococol Exporter
dubbo-remoting Exchange Exchanger ExchangeChannel ExchangeClient ExchangeServer
Transport Transport Channel Client Server Codec
dubbo-common Serialize

服务代理层,使用动态代理的方式为接口创建代理类。Proxy层核心接口是ProxyFactory。

注意:

对于服务提供者,代理的对象是provider服务接口的实现类(provider的Wrapper.getWrapper获取代理对象,javassist技术构造字节码方式,包裹真正的实现类,实现代理);

对于服务消费者,代理的对象,是远程服务的invoker对象(invoker是带有nettyclient通信功能的invoker类,consumer的代理,包裹带有通信功能的invoker,实现代理)。

7.6.1 ServiceProxy

7.6.2 ProxyFactory

image-20220830135100551

ProxyFactory为dubbo的代理工厂类,用于生成一个接口的代理类。

getInvoker 针对server端,该方法负责创建provider(服务提供端)服务的Invoker;

getProxy 针对client端,创建接口的代理对象。

@SPI("javassist")
public interface ProxyFactory {

    /**
     * create proxy.
     *
     * @param invoker
     * @return proxy
     */
    @Adaptive({Constants.PROXY_KEY})
    <T> T getProxy(Invoker<T> invoker) throws RpcException;

    /**
     * create invoker.
     *
     * @param <T>
     * @param proxy
     * @param type
     * @param url
     * @return invoker
     */
    @Adaptive({Constants.PROXY_KEY})
    <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) throws RpcException;

}

Dubbo默认的ProxyFactory实现类为JavassistProxyFactory

public <T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) {
    // 为目标类创建 Wrapper
    final Wrapper wrapper = Wrapper.getWrapper(proxy.getClass().getName().indexOf(36) < 0 ? proxy.getClass() : type);
    // 创建匿名 Invoker 类对象,并实现 doInvoke 方法。
    return new AbstractProxyInvoker<T>(proxy, type, url) {
        @Override        protected Object doInvoke(T proxy, String methodName,
                                  Class<?>[] parameterTypes,
                                  Object[] arguments) throws Throwable {
            // 调用 Wrapper 的 invokeMethod 方法,invokeMethod 最终会调用目标方法
            return wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments);
        }
    };
}

JavassistProxyFactory创建了一个继承自AbstractProxyInvoker类的匿名对象,并覆写了抽象方法doInvoke。覆写后的doInvoke 逻辑比较简单,仅是将调用请求转发给了Wrapper类的invokeMethod 方法。以及生成 invokeMethod 方法代码和其他一些方法代码。代码生成完毕后,通过 Javassist 生成 Class 对象,最后再通过反射创建 Wrapper 实例。

(AbstractProxyInvoker为proxyFactory.getInvoker生成的被wrapper包装过的Invoker-------InvokerWrapper。)

posted @ 2023-03-13 14:56  LeasonXue  阅读(71)  评论(0编辑  收藏  举报