dubbo_refer.md
//服务发现
ReferenceConfig.init()
-->Protocol$Adaptive.refer(Class claz, URL url)
-->RegistryProtocol.refer() 返回invoker
-->RegistryFactory$Adaptive.getRegistry(URL url)
-->ZookeeperRegistryFactory
-->AbstractRegistryFactory.getRegistry(Url url)
-->ZookeeperRegistryFactory.createRegistry(URL url)
-->new ZookeeperRegistry(URL url, ZookeeperTransporter zookeeperTransporter)
-->ZookeeperTransporter$Adaptive.connect();
-->CuratorZookeeperTransporter
-->AbstractZookeeperTransporter.connect(Url url)
-->new CuratorZookeeperClient(url)
-->CuratorFramework.build()
-->CuratorFramework.getConnectionStateListenable().addListener(){...}
-->CuratorFramework.start()
-->AbstractRegistryFactory Map<String, Registry> map;
registry=zookeeper://127.0.0.1:2181/org.apache.dubbo.registry.RegistryService?application=dubbo-demo-api-
consumer&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&pid=6888×tamp=1556612535976
-->doRefer(Cluster cluster, Registry registry, Class<T> type, URL url)
//向注册中心注册服务(写入节点)
-->ZookeeperRegistry.register(URL url)
-->FailbackRegistry.register(Url url)
-->doRegister(URL url)
-->zkClient.create(String path, boolean ephemeral)
//3 订阅providers、configurators、routers
-->RegistryDirectory.subscribe(URL url)
-->ConsumerConfigurationListener.addNotifyListener(this)
-->ZookeeperRegistry.doSubscribe(final URL url, final NotifyListener listener)
//3.1 会获取当前节点下已经存在的字节点(第一次服务发现发生在这里),添加子节点变化监听器
-->List<String> children = zkClient.addChildListener(path, zkListener)
-->FailBackRegistry.notify(URL url, NotifyListener listener, List<URL> urls)
-->AbstractRegistry.notify(URL url, NotifyListener listener, List<URL> urls)
-->saveProperties(url)
-->notify(URL url, NotifyListener listener, List<URL> urls)
-->AbstractRegistry.notify(URL url, NotifyListener listener, List<URL> urls)
-->notify(List<URL> urls)(由这步添加监听ConsumerConfigurationListener.addNotifyListener(this))
-->refreshInvoker(List<URL> invokerUrls)
-->toInvokers(List<URL> urls)
-->ProtocolFilterWrapper.refer(Class<T> type, URL url)
-->DubboProtocol.refer(Class<T> serviceType, URL url)
-->getClients(URL url)
-->getSharedClient(URL url, int connectNum)
-->buildReferenceCountExchangeClient(URL url)
-->ExchangeClient exchangeClient = initClient(url)
-->Exchangers.connect(url, requestHandler)
-->HeaderExchanger.connect(URL url, ExchangeHandler handler)
-->new HeaderExchangeClient(Transporters.connect(url, new DecodeHandler(new HeaderExchangeHandler(handler))), true)
-->Transporters.connect(URL url, ChannelHandler... handlers)
-->NettyTransporter.connect(URL url, ChannelHandler listener)
->new NettyClient(url, listener)
-->wrapChannelHandler(url, handler)
-->ChannelHandlers.wrap(handler, url)
-->new MultiMessageHandler(new HeartbeatHandler(ExtensionLoader.getExtensionLoader(Dispatcher.class).getAdaptiveExtension().dispatch(handler, url)))
-->doOpen()//开启netty客户端
-->doConnect()//连接服务端,建立长连接
//启动重连任务
-->new HeaderExchangeClient()-->startReconnectTask(url);
//启动心跳任务
-->new HeaderExchangeClient()-->startHeartBeatTask(url)
-->new ReferenceCountExchangeClient(exchangeClient)
-->Map<String, List<ReferenceCountExchangeClient>> referenceClientMap
-->DubboInvoker<T> invoker = new DubboInvoker<T>(serviceType, url, getClients(url), invokers);
-->buildInvokerChain(final Invoker<T> invoker, String key, String group)
-->Map<url, Invoker> cache service url to invoker mapping
//将directory封装成一个ClusterInvoker(MockClusterInvoker)
//RegistryProtocol调用Cluster将多个服务提供者节点伪装成一个节点,并返回一个Invoker
-->Invoker invoker = cluster.join(directory)
-->Cluster$Adaptive.join(directory)
-->ExtensionLoader.getExtensionLoader(Cluster.class).getExtension("failover")//MockClusterWrapper包装FailoverCluster
-->MockClusterWrapper.join(Directory<T> directory)
-->FailoverCluster.join(Directory<T> directory)
-->new FailoverClusterInvoker<T>(directory)
-->MockClusterInvoker(Directory<T> directory, Invoker<T> invoker)//invoker:上边的FailoverClusterInvoker实例
//获取代理
-->proxyFactory.getProxy(invoker)
-->ProxyFactory$Adaptive
-->StubProxyFactoryWrapper
-->JavassistProxyFactory.getProxy(Invoker<T> invoker, Class<?>[] interfaces)//invoker:上边的MockClusterInvoker实例, interfaces:[interface com.alibaba.dubbo.demo.DemoService, interface com.alibaba.dubbo.rpc.service.EchoService]
-->Proxy.getProxy(interfaces).newInstance(new InvokerInvocationHandler(invoker))
-->InvokerInvocationHandler
-->invoker.invoke(createInvocation(method, args)).recreate()
Dubbo源码Debug-服务发现解析
于 2019-07-29 08:19:33 首次发布