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×tamp=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×tamp=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®istry=zookeeper×tamp=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×tamp=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×tamp=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®istry=zookeeper×tamp=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
--
--