Dubbo源码Debug-服务发现解析

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&timestamp=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()
        
        
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值