首先附上我畫的兩張圖
原理
總結:這篇文章,主要介紹的是dubbo服務的三個原理
a:解析服務:將配置好的文件(dubbo配置文件)解析成bean對象,依據(jù)bean對象生成URL
b:暴露服務:將解析出來的URL,根據(jù)協(xié)議頭,注冊到注冊中心并暴露服務
c:服務調用:根據(jù)url的協(xié)議頭,invoke實例,獲得服務
一解析服務:
1.讀取(如spring)配置文件,匹配名稱空間為dubbo 的配置,這些配置將會注入到相應的config里面
2.使用handler(DubboNameSpaceHandler)類,調用DubboBeanDefinitionParse
這個時候就開始配置config了,我們重點看上圖的ServiceBean
這個Bean是對ServiceConfig 的一個擴展,而ServiceConfig里面定義了接口類型,接口實現(xiàn)類引用,服務名稱,方法配置 ,方法集合等 服務相關的配置.
而他的父類,則定義了基礎配置
接著說上面提到的利用DubboBeanDefinitionParse解析配置,轉化為Bean對象
3. 將bean對象轉為為URL格式,bean對象的參數(shù)轉化為URL的參數(shù)
ReferenceConfig里面有一個創(chuàng)建proxy的方法
這個方法里面會將bean封裝成一個URL對象(如果有,則包含了用戶指定的注冊地址)
最后封裝到的是這個接口,使用了SPI
4.url會傳輸給Protocol,根據(jù)不同的協(xié)議頭來進行不同的暴露和引用
二 暴露服務
1.從ServiceConfig拿到了服務的實際類getInvoker方法,判斷暴露方式
2.如果本地暴露,協(xié)議頭為dubbo類型,適配到DubboProtocol的export()方法,暴露服務
3.如果是像注冊中心暴露服務,協(xié)議頭為register類型,適配到RegisterProtocol的export()方法,修改url后,調用DubboProtocol的export()方法,注冊到注冊中心,然后暴露服務
3.初始化結束
三 調用服務
1.直接引用的(協(xié)議頭dubbo,只暴露端口的),通過ReferenceConfig解析URL.通過適配器找到DubboProtocol的refer()方法,
2.從注冊中心發(fā)現(xiàn)引用服務(頭為register),通過ReferenceConfig解析URL,通過適配器找到RegistryProtocol的refer()方法,獲取refer的參數(shù),查詢提供者;這個時候協(xié)議頭會變成dubbo,重復第1步流程.如果有多個提供者,則為偽裝成一個服務.