Dubbo-服務發布-本地暴露/遠程暴露


  Dubbo服務端啟動步驟:

    1.Export dubbo service 暴露本地服務

 main  INFO config.AbstractConfig:  [DUBBO] Export dubbo service com.alibaba.dubbo.demo.DemoService to local registry, dubbo version: , current host: 192.168.10.1

 

    2.Register dubbo service 暴露遠程服務

 main  INFO config.AbstractConfig:  [DUBBO] Export dubbo service com.alibaba.dubbo.demo.DemoService to url dubbo://192.168.10.1:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&bean.name=com.alibaba.dubbo.demo.DemoService&bind.ip=192.168.10.1&bind.port=20880&dubbo=2.0.2&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=52884&qos.port=22222&side=provider&timestamp=1588143599790, dubbo version: , current host: 192.168.10.1

 main  INFO config.AbstractConfig:  [DUBBO] Register dubbo service com.alibaba.dubbo.demo.DemoService url dubbo://192.168.10.1:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&bean.name=com.alibaba.dubbo.demo.DemoService&bind.ip=192.168.10.1&bind.port=20880&dubbo=2.0.2&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=52884&qos.port=22222&side=provider&timestamp=1588143599790 to registry registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.2&pid=52884&qos.port=22222&registry=zookeeper&timestamp=1588143599751, dubbo version: , current host: 192.168.10.1

    3.Start NettyServer 啟動netty

 main  INFO transport.AbstractServer:  [DUBBO] Start NettyServer bind /0.0.0.0:20880, export /192.168.10.1:20880, dubbo version: , current host: 192.168.10.1

    4.zookeeper.ClientCnxn:opening socket  打開鏈接zk

 main-SendThread(127.0.0.1:2181)  INFO zookeeper.ClientCnxn: Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)

    5.ZookeeperRegistry:到zk注冊

 main INFO zookeeper.ZookeeperRegistry: [DUBBO] Register: dubbo://192.168.10.1:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&bean.name=com.alibaba.dubbo.demo.DemoService&dubbo=2.0.2&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=52884&side=provider&timestamp=1588143599790, dubbo version: , current host: 192.168.10.1
 main-SendThread(127.0.0.1:2181) INFO zookeeper.ClientCnxn: Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x171ab21a20e0020, negotiated timeout = 40000

    6.Subscribe   監聽zk

 main  INFO zookeeper.ZookeeperRegistry:  [DUBBO] Subscribe: provider://192.168.10.1:20880/com.alibaba.dubbo.demo.DemoService?anyhost=true&application=demo-provider&bean.name=com.alibaba.dubbo.demo.DemoService&category=configurators&check=false&dubbo=2.0.2&generic=false&interface=com.alibaba.dubbo.demo.DemoService&methods=sayHello&pid=52884&side=provider&timestamp=1588143599790, dubbo version: , current host: 192.168.10.1

 

 

源碼分析:

 

 

 

 

 

   找對對應的ServiceBean類,發現實現了ApplicationListener接口實現了onApplicationEvent方法,調用了export()方法

 

 

 調用繼承類ServiceConfig方法export()

 

 暴露服務

 

   暴露本地服務:只暴露在同一個JVM里面,不用通過zk來進行遠程通信。例如:同一個服務,自己調用用自己接口,就沒必要進行網路ip鏈接通訊

  暴露遠程服務:指暴露給遠程客戶端的ip和端口號,通過網絡實通信

 

 

ServiceBean.onApplicationEvent

  -->export()

    -->ServiceConfig.export()

      -->doExport()

        -->doExportUrls()  //<dubbo:protocol name="dubbo" port="20880" id="dubbo" />

          -->loadRegistries(ture)  // 從dubbo配置文件組裝registry的url信息   registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=demo-provider&dubbo=2.0.2&pid=55548&qos.port=22222&registry=zookeeper&timestamp=1588146544281

          -->doExportUrlsFor1Protocol //暴露服務

            -->exportLocal(url)//暴露本地服務

              -->proxyFactory.getInvoker(ref, (Class) interfaceClass, local));

                -->JavassitPorxyFactory.getInvoker

                  -->Wrapper.getWrapper

                    -->makeWrapper  

                  -->return new AbstractProxyInvoker

              -->protocol.export(

                  -->Protocol$Adaptive.export

                    -->ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class).getExtension("injvm")

                    -->extension.export(arg0)

                      -->ProtocolFilterWrapper.export

                        -->buildInvokerChain //創建8個filter

                        -->ProtocolListenerWrapper.export 

                        -->return new InjvmExporter<T>(invoker, invoker.getUrl().getServiceKey(), exporterMap);

 

                      -->目的:exporterMap.put(key, this)// key=com.alibaba.dubbo.dome.DemoService.this=InjvmExproter

 

1.proxyFactory:就是為了獲取一個接口的代理類,例如獲取一個遠程接口的代理

  getInvoker:針對server端,將服務對象,例如DemoServiceImpl包裝成一個Invoker對象

  getProxy:針對client端,創建接口的的代理對象。例如DemoService的接口

2.Wrapper:類似springde BeanWrapper,包裝了一個接口或者一個類,可以通過wrapper對實例對象進行賦值、取值以及指定方法調用

3.Invoker:它是一個可執行的對象,能夠根據方法的名稱、參數得到相應的執行結果

    Result invoke(Invocation invocation)   
    Invocation包含了需要執行的方法和參數等信息,有兩個實現類RpcInvocation和MockInvocation
三種類型的Invoker
  1.本地執行類的Invoker
  2.遠程調用類的Invoker
  3.多個遠程通信執行類的Invoker聚合成集群版的Invoker

--

 

--

 

 

 

 

 

 

 

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM