七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
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。)