91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Dubbo注冊中心是怎么設計的

發布時間:2021-12-15 14:59:40 來源:億速云 閱讀:175 作者:iii 欄目:大數據

本篇內容主要講解“Dubbo注冊中心是怎么設計的”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Dubbo注冊中心是怎么設計的”吧!

關于源碼和原理的分析,我們都需要找尋一個切入點,找到切入點的前提是你要知道注冊中心的功能是什么,注冊中心相信大家都不陌生,每一個通用的注冊中心都需要提供兩個基本的功能點:

  1. 服務提供者將自己暴露的服務向注冊中心注冊

  2. 服務消費者可以從注冊中心獲取自己所需要的服務

首先我們要確定Dubbo關于注冊中心的源碼包的位置:org.apache.dubbo.registry。下面我們看一下包的目錄結構圖:

Dubbo注冊中心是怎么設計的

上圖紅色框中的9個包對應Dubbo中9種注冊中心的實現,從包的名稱也可以看出具體的注冊中心實現的方式。其中Dubbo官網推薦的注冊中心方式的實現是基于ZooKeeper的注冊中心。那么下面我們就分析以ZooKeeper為基礎的注冊中心在Dubbo中是如何實現的。

Dubbo注冊中心設計

其實在我們在學習開源框架的過程中,除了學會他們的使用以外,還可以通過分析源碼學習這些開源框架的設計,每一個開源框架的實現基本都是易擴展的,這種易擴展的特性都得益于優秀的設計模式。下面我們就先看一下Dubbo在注冊中心實現上是怎樣設計來支持各種各樣的注冊中心的。

SPI

SPI(Service Provider Interface)是Java提供的一種服務發現的機制。SPI通俗一點講就是在運行期間使用一個具體的接口實現類來動態的替換接口。

Java中的具體實現很簡單,只需要你定義一個接口,然后采用具體的實現類實現這個接口,然后在META-INFO/services建立一個以接口的全量限定名稱命名的文件,該文件的內容是具體的接口實現類的全量限定名稱。

Java中有一個java.util.ServiceLoader可以查找服務的具體實現。

Dubbo SPI

Dubbo并沒有直接使用Java原生的SPI,而是重新實現了一套功能更強的SPI機制。Dubbo SPI的相關邏輯被封裝在ExtensionLoader類中,具體分析請見官網。這里只簡單講解一下擴展類動態替換的基本流程。

  1. 首先需要獲取ExtensionLoader實例(調用ExtensionLoader.getExtensionLoader(Class type)),這里的type為接口類

  2. 通過ExtensionLoader實例調用getExtension(String name)方法來獲取具體的實例(name是Dubbo中配置的擴展類的key值),該步驟首先從緩存中獲取具體的擴展類實例,如果獲取到則直接返回(此時說明擴展類實例曾經被加載過),如果沒有則需要進行創建(調用createExtension(String name)方法)并且將其存放在緩存中(這一步中采用雙重檢測+鎖的實現方式來避免并發問題,具體寫法請自己看源碼)

  3. 創建實例之前,我們首先要根據name找到對應的擴展類對應的具體實現類(getExtensionClasses().get(name)),要想找到具體的實現類,首先需要獲取到應用中所有的擴展類的具體實現類(getExtensionClasses())

  4. 在獲取之前,先查看type所代表的接口類上是否有@SPI注解,如果有則進行解析并且緩存默認的key(@SPI注解的value值),緊接著就是加載具體的擴展類的實現類,獲取具體擴展類的實現類也是基于緩存獲取的,如果發現能從緩存中獲取到一個實現類的集合就直接返回,否則就需要加載應用中的所有擴展類的具體實現類并將其存入緩存中,key為文件中=前的部分,value為=后面代表的具體的Class

  5. 第二步傳入的name值然后從Map中獲取Class,如果獲得的為空則拋出異常,否則就獲取成功

  6. 在獲取到具體的Class以后,首先驗證緩存中是否已經緩存過該Class的具體對象,如果沒有緩存則創建一個新的對象并進行緩存

  7. 在獲取到具體擴展實現類的對象以后,需要利用反射進行賦值(調用injectExtension方法)注入依賴,這部分功能就需要依賴Dubbo IOC功能

Dubbo IOC

Dubbo首先會通過反射獲取到所有的setter方法,然后通過ExtensionFactory獲取到依賴對象,最后通過反射調用將依賴設置到目標對象中。在ExtensionLoader使用的ExtensionFactory是AdaptiveExtensionFactory,AdaptiveExtensionFactory內部維護了一個ExtensionFactory列表,用于存儲其他類型的ExtensionFactory。Dubbo目前提供了兩種ExtensionFactory,分別是SpiExtensionFactory和SpringExtensionFactory。前者用于創建自適應的拓展,后者是用于從Spring的IOC容器中獲取所需的拓展。

到此,相信大家對“Dubbo注冊中心是怎么設計的”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

邢台市| 八宿县| 金昌市| 郎溪县| 霍城县| 文化| 海原县| 务川| 绥阳县| 鹿邑县| 高阳县| 礼泉县| 文成县| 姚安县| 新昌县| 韶山市| 赤水市| 手游| 怀来县| 临朐县| 赤峰市| 满洲里市| 方正县| 将乐县| 东阿县| 济宁市| 孙吴县| 周宁县| 柘荣县| 磴口县| 犍为县| 舟曲县| 芦山县| 射阳县| 朝阳区| 灵山县| 同江市| 绵阳市| 磐安县| 松潘县| 奇台县|