從官網可以得到下面的架構圖,
角色說明 | |
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:
https://dubbo.gitbooks.io/dubbo-user-book/references/registry/zookeeper.html
http://doc.okbase.net/661116/archive/241946.html
https://www.cnblogs.com/linlinismine/p/7814521.html
http://blog.csdn.net/chao_19/article/details/51764150