Dubbo之註冊與發現

從官網可以得到下面的架構圖,



 

 


角色說明

Provider

暴露服務的服務提供方

Consumer

調用遠程服務的服務消費方

Registry

服務註冊與發現的註冊中心

Monitor

統計服務的調用次調和調用時間的監控中心

Container

服務運行容器


調用關係說明

1.  服務容器負責啓動,加載,運行服務提供者。

2.  服務提供者在啓動時,向註冊中心註冊自己提供的服務。

3.  服務消費者在啓動時,向註冊中心訂閱自己所需的服務。

4.  註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。

5.  服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。

6.  服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。

      

上面都是一些從官網摘抄下來的一些簡介,更具體的信息可以去瀏覽官網。

下面主要分三部分:第一spring如何加載生成dubbo對象,第二dubbo服務如何註冊到註冊中心, 第三dubbo如何服務


1、spring如何加載生成dubbo對象

我們從dubbo提供的demo入手, 




這是官方提供的dome中provider的配置信息(對我這還不熟悉spring的來說一頭霧水)


在很多情況下,我們需要爲系統提供可配置化支持,簡單的做法可以直接基於Spring的標準Bean來配置,但配置較爲複雜或者需要更多豐富控制的時候,會顯得非常笨拙。一般的做法會用原生態的方式去解析定義好的xml文件,然後轉化爲配置對象,這種方式當然可以解決所有問題,但實現起來比較繁瑣,特別是是在配置非常複雜的時候,解析工作是一個不得不考慮的負擔。Spring提供了可擴展Schema的支持,這是一個不錯的折中方案,完成一個自定義配置一般需要以下步驟:

·        設計配置屬性和JavaBean

·        編寫XSD文件

·        編寫NamespaceHandler和BeanDefinitionParser完成解析工作

·        編寫spring.handlers和spring.schemas串聯起所有部件

·        在Bean文件中應用

 

同樣的dubbo爲了解決這個問題,起了一個叫dubbo-config-spring的模塊。這個模塊的下面的resources/META-INF文件下面有三個這樣的文件 dubbo.xsd、spring.handlers、spring.schemas  見下圖




Dubbo也是利用了Spring提供的可擴展Schema機制實現了dubbo的xml配置文件解析。


注:  由於 http://code.alibabatech.com/schema/dubbo 現在不能用了, 所以在https://github.com/alibaba/dubbo/tree/master/dubbo-config/dubbo-config-spring/src/main/resources/META-INF下通過




定義了xsd文件的地址, 這個配置在ide裏是可被檢測並加載到的, 如果打包後發現spring報class找不到, 記得查看是不是這兩個文件沒有加到資源中.


解決了spring解析dubbo配置xml的問題,下面就看spring怎麼生成dubbo對象的。 看一下解析xml的DubboNamespaceHandler類(\dubbo\dubbo-config\dubbo-config-spring\src\main\java\com\alibaba\dubbo\config\spring\schema\DubboNamespaceHandler.java)




從這裏知道所有的dubbo的標籤,都是統一由DubboBeanDefinitionParser來解析的,每一個標籤都會統一解析成對應的Bean對象。dubbo定義了以下配置類(見dubbo\dubbo-config\dubbo-config-api,準確說應該是Bean的父類), Bean(見dubbo\dubbo-config\dubbo-config-spring)






配置文件中的<dubbo:serviceinterface="com.alibaba.dubbo.demo.DemoService"ref="demoService"/>對應的Bean就是 ServiceBean,對應的配置類爲ServiceConfig




以上是ServiceBean裏面的一些屬性截圖.


第二部分:服務註冊

ServiceBean類的代碼就不再贅餘,直說方式了. 閱讀ServiceBean類的代碼在根據spring的生命週期,可以發現ServiceBean初始化完畢之後會調用一個afterPropertiesSet的方法, 這個方法實際調用了com.alibaba.dubbo.config.ServiceConfig#export 這個方法, 在這個方法中, 加載xml裏配置的interface,




之後做一些接口一致的校驗.

一層層查看,最終找到ServiceConfig的方法doExportUrlsFor1Protocol, 




關鍵部分



根據拼接好的註冊地址將拼接好的服務地址進行註冊. 實際註冊行爲發生在最後的export中. 詳細的函數調用可參見\dubbo\dubbo-registry\dubbo-registry-api\src\main\java\com\alibaba\dubbo\registry\integration\RegistryProtocol.java#export,這裏只貼圖一張,不再贅餘.關鍵部分是註冊地址和服務地址的拼接,之後調用工廠函數即可.




整體邏輯流程借用一張別人繪製的圖, 



第三部分:服務發現

服務如何發現的, 可以參閱consumer的代碼, 同樣的套路再來一次, 這裏不再贅餘.




<dubbo:reference id="demoService"check="false"interface="com.alibaba.dubbo.demo.DemoService"/> 對應Bean爲 ReferenceBean, 對應的配置類爲 ReferenceConfig, 



 

參考 reference:

  1. https://dubbo.gitbooks.io/dubbo-user-book/references/registry/zookeeper.html

  2. http://doc.okbase.net/661116/archive/241946.html

  3. https://www.cnblogs.com/linlinismine/p/7814521.html

  4. http://blog.csdn.net/chao_19/article/details/51764150

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章