騰一部分筆記到csdn
1. 概述
-
啓動通信服務器,綁定服務端口,提供遠程調用。
-
向註冊中心註冊服務提供者,提供服務消費者從註冊中心發現服務。
2. 遠程暴露源碼分析
ServiceConfig.java
->doExportUrlsFor1Protocol()
//有registryURLs
是
->循環registryURLs
->URL monitorUrl = loadMonitor(registryURL);//添加監控
->Invoker<?> invoker= proxyFactory.getInvoker(ref, (Class) interfaceClass, registryURL.addParameterAndEncoded(Constants.EXPORT_KEY, url.toFullString()));//創建Invoker,本地暴露有介紹
->DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this); //封裝一下
->Exporter<?> exporter= protocol.export(wrapperInvoker); //暴露服務
Protocol$Adpative.java
-> extension = ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class).getExtension("registry"); //獲取到的是註冊中心協議
-> extension.export(arg0)
-> ProtocolFilterWrapper.export // 和本地暴露一樣,這裏不細講
-> ProtocolListenerWrapper.export// 和本地暴露一樣,這裏不細講
RegistryProtocol.java
-> export()
-> final ExporterChangeableWrapper<T> exporter = doLocalExport(originInvoker); // 啓動本地通訊服務
-> ExporterChangeableWrapper<T> exporter = (ExporterChangeableWrapper<T>) bounds.get(key); //查看是否已經向註冊中心註冊
-> exporter等於null就創建,exporter = new ExporterChangeableWrapper<T>((Exporter<T>) protocol.export(invokerDelegete),originInvoker);
-> Protocol$Adpative.export()
-> extension = ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class).getExtension("dubbo");
-> extension.export(arg0)
-> ProtocolFilterWrapper.export // 和本地暴露一樣,這裏不細講
-> ProtocolListenerWrapper.export// 和本地暴露一樣,這裏不細講
1.netty服務暴露的開始-------
DubboProtocol.java
-> export()
-> DubboExporter<T> exporter = new DubboExporter<T>(invoker, key, exporterMap); //創建dubbo的Exporter
-> exporterMap.put(key, exporter); // key等於${group}/${interface}:${version}:${port}
-> openServer(url); // 啓動服務
-> createServer(url) //創建Service
-> server = Exchangers.bind(url, requestHandler);//exchaanger是一個信息交換層,注意這裏面的requestHandler,就是處理網絡請求的,是DubboProtocol實現。通過服務key到protocol的expoerts裏面找expoert,裏面有invoker
2.信息交換層exchanger開始 -> ExtensionLoader.getExtensionLoader(Exchanger.class).getExtension("header")
HeaderExchanger.java
-> bind()
-> return new HeaderExchangeServer(Transporters.bind(url, new DecodeHandler(new HeaderExchangeHandler(handler))));
3.網絡傳輸層 transporter--------->Transporters.bind()
-> ExtensionLoader.getExtensionLoader(Transporter.class).getAdaptiveExtension()
Transporter$Adpative.java
-> extension = ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.remoting.Transporter.class).getExtension("netty");
-> extension.bind(arg0, arg1)
NettyTransporter.java
-> bind()
-> new NettyServer(url, listener) //下面都是對應構造方法
AbstractPeer //this.url = url; this.handler = handler;
AbstractEndpoint//codec timeout=1000 connectTimeout=3000
AbstractServer //bindAddress accepts=0 idleTimeout=600000
4.打開斷開,暴露netty服務-------------> doOpen()
-> 設置NioServerSocketChannelFactory boss worker的線程池 線程個數爲3
-> 設置編解碼 hander
-> bootstrap.bind(getBindAddress())
-> this.server=NettyServer
-> heartbeat=60000
-> heartbeatTimeout=180000
-> startHeatbeatTimer()//這是一個心跳定時器,採用了線程池,如果斷開就心跳重連。
-> URL registryUrl = getRegistryUrl(originInvoker); //獲取註冊中心URL
-> final Registry registry = getRegistry(originInvoker); // 獲取註冊中心對象
-> final URL registedProviderUrl = getRegistedProviderUrl(originInvoker); //獲取服務提供者URL
-> register(registryUrl, registedProviderUrl); // 向註冊中心註冊
-> final URL overrideSubscribeUrl = getSubscribedOverrideUrl(registedProviderUrl); //創建監聽配置規則URL
-> final OverrideListener overrideSubscribeListener = newOverrideListener(overrideSubscribeUrl, originInvoker); //創建監聽器
-> registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener); //註冊監聽器
<-------—> returnnew DestroyableExporter<T>(exporter, originInvoker, overrideSubscribeUrl, registedProviderUrl); //返回一個Exporter
->exporters.add(exporter); //添加到exporters
否
// 暴露服務但不向註冊中心暴露
->Invoker<?> invoker= proxyFactory.getInvoker(ref, (Class) interfaceClass, url);
->DelegateProviderMetaDataInvoker wrapperInvoker = new DelegateProviderMetaDataInvoker(invoker, this);
->Exporter<?> exporter= protocol.export(wrapperInvoker);
->exporters.add(exporter);
|
RegistryProtocol#export(...) {
// 1. 啓動本地服務器
DubboProtocol#export(...);
// 2. 向註冊中心註冊。
}
|
-
-
-
Protocol$Adaptive => ProtocolFilterWrapper => ProtocolListenerWrapper => RegistryProtocol
-
=>
-
Protocol$Adaptive => ProtocolFilterWrapper => ProtocolListenerWrapper => DubboProtocol
-
由於ProtocolFilterWrapper、ProtocolListenerWrapper均有判斷如果是RegistryProtocol就不處理
-
-
該過程是我們在 3* - API 配置(二)之服務提供者的那張圖的反向流程,即紅線部分 :