四、ReferenceBean<T>消费者端初始化过程
1、ReferenceConfig的init()
createProxy中也生成了registryUrl
invoker = refprotocol.refer(interfaceClass, urls.get(0));
同样这里会ProtocolListenerWrapper->ProtocolFilterWrapper->RegistryProtocol
2、RegistryProtocol的refer
先注册消费者信息/dubbo/interfaceName/customs/{customUrl}
然后订阅
RegistryDirectory<T> directory = new RegistryDirectory<T>(type, url);
registry.register
directory.subscribe
当服务提供端地址有变化时候,注册中心会通知订阅者,更新
RegistryDirectory的
public synchronized void notify(List<URL> urls)
->refreshInvoker->toInvokers
invoker = new InvokerDelegete<T>(protocol.refer(serviceType, url), url, providerUrl);
此时的url是从注册中心拿到的providerUrl,它的protocol为dubbo
所以会使用DubboProtocol的refer
3、DubboProtocol的refer,在这之前依然会有wrapper加上listener和filter
DubboProtocol
public <T> Invoker<T> refer(Class<T> serviceType, URL url) throws RpcException {
// create rpc invoker.
DubboInvoker<T> invoker = new DubboInvoker<T>(serviceType, url, getClients(url), invokers);
invokers.add(invoker);
return invoker;
}
其中getClients会启动客户端连接服务端,getClients还会根据配置是否使用共享连接,还是每个服务都有一个连接
4、getClients->initClient->Exchangers.connect->Transporters.connect->Client
最后就得到了NettyTransporter->NettyClient
NettyClient的doOpen()就是netty客户端连接服务端过程。
5、回到RegistryProtocol的doRefer
return cluster.join(directory);
这个cluster集群方式,可选:failover/failfast/failsafe/failback/forking
一般还会配置Mock
那么将会得到MockClusterInvoker->FailoverClusterInvoker->Directory
6、得到invoker后在ReferenceConfig的createProxy最后
// 创建服务代理,会对接口生成代理类,然后注册到spring容器中,使用时候获取到的就是代理类
return (T) proxyFactory.getProxy(invoker);