這是Dubbo官網的服務提供者的時序圖
複製代碼
此文Dubbo的版本是2.7,1. Dubbo的經過@EnableDubbo來啓動Dubbo的初始化配置,主要配置掃描ServiceBean的路徑, 還有配置multipleConfig=true, 這個是支持多配置模式(例如: 支持多個註冊中性)
這裏經過@Import註解,引入DubboComponentScanRegistrar對象實現ServiceBean的BeanDefinition的Bean的註冊.
DubboComponentScanRegistrar實現ImportBeanDefinitionRegistrar的接口, 這裏實現註冊 ServiceAnnotationBeanPostProcessor這個BeanDefinition.
Dubbo中主要經過ServiceAnnotationBeanPostProcessor來實現ServiceBean的BeanDefinition的註冊.
這裏能夠看到ServiceAnnotationBeanPostProcessor實現了BeanDefinitionRegistryPostProcessor接口的方法,postProcessBeanDefinitionRegistry方法傳入BeanDefinitionRegistry實例,該方法是將ServiceBean的BeanDefinition註冊到BeanDefinitiond到BeanDefinitionRegistry實例中.
registerServiceBeans方法,首先是經過DubboClassPathBeanDefinitionScanner掃描包路徑的過濾全部含有@Servcie註解的Bean,而後注到BeanDefinitionRegistry實例總
registerServiceBean方法就是解析帶有@Service的Bean,並註冊到BeanDefinitionRegistry的實例中.
接下來就看下ServiceBean是怎麼服務Exportor的過程:
首先Service自身是實現ApplicationListener接口,監聽ContextRefreshedEvent事件,也是ApplicationContext啓動完成後,開始執行export.
複製代碼
這裏調用父類的export,併發布ServiceBeanExportedEvent事件.
父類中exprot方法中,判斷是否應該delay發佈, 若是沒有配置這個delay參數,則調用 doExport方法同步調用發佈邏輯.
doExport方法裏面checkAndUpdateSubConfigs主要是檢查和更新配置,而後設置export標誌爲TRUE, 若是Path參數爲空,則設置接口的名字.並調用doExportUrls方法,導出url.
經過loadRegistries獲取提供方的註冊的URL,主要是獲取註冊的URL,並構建providerModel, 並設置到ApplicationModel中. 而後執行doExportUrlsFor1Protocol主要是作協議層的導出
doExportUrlsFor1Protocol這個方法裏面主要經過ProxyFactory將提供服務包裝成Invoker對象,而且,並調用protocal的export導出服務.
因爲doExportUrlsFor1Protocol處理路基太長, 下面是該函數的代碼, 從這裏看到若是沒有 配置remote導出, 則會同時執行導出到本地(這個本地和遠程的之後會詳細介紹).
這個就是協議導出的核心處理邏輯,經過ProxyFactory將ref和interface和URL包裝成Invoker對象, 而後protocol對象(其中這裏真實對象是DubboProtocol,經過dubbo的SPI加載的)調用export,實現服務的導出.
DubboProtocol的export方法主要構造DubboExporter對象,緩存該對象, 並調用openServer開啓ExchageServer(與客戶端的交互的對象),
這裏的的key是服務端的IP加端口,默認端口20880, 若是沒有 ExchangeServer則建立ExchangeServer, 並緩存到serverMap
Exchangers調用bind綁定URL和requestHandler,requestHandler就是調用實際提供者對象,
getExchanger的ExchangeServer,並綁定requestHandler的
經過Dubbo的SPI機制實例化ExchangeServer, 實際實例對象是 HeaderExchanger
這裏能夠看到ExchangeServer同時綁定Transporter的實例對象,它的經過SPI動態加載的,默認是NettyTransporter, 使用Netty做爲 傳輸層.
這裏能夠看到默認是綁定的是NettyServer做爲服務端通訊的組件.
總結:今天完成了Dubbo基於註解驅動的服務導出過程,還有註冊這一塊沒沒有介紹,這個放在下一節中單獨介紹.緩存