服務的暴露過程
服務器端 ( 服務提供者 ) 在框架啟動時 , 會初始化服務實例 , 通過 Proxy 組件調用具體協議 ( Protocol ),
把服務端要暴露的接口封裝成 Invoker ( 真實類型是AbstractProxylnvoker ) , 然后轉換成 Exporter, 這個時候框架會打開服務端口等並記錄服務實例
到內存中 , 最后通過 Registry 把服務元數據注冊到注冊中心 。 這就是服務端 ( 服務提供者 )整個接口暴露的過程 。
dubbo注冊中心
Dubbo 主要包含四種注冊中心的實現 , 分別是ZooKeeper,Redis,Simple,Multicast
工作流程
-
服務提供者啟動時,會向注冊中心寫入自己的元數據信息,同時會訂閱配置元數據信息 。
-
消費者啟動時,也會向注冊中心寫入自己的元數據信息,並訂閱服務提供者,路由和配置元數據信息
-
服務治理中心(dubbo-admin)啟動時,會同時訂閱所有消費者、服務提供者、路由和配置元數據信息
-
當有服務提供者離開或有新的服務提供者加入時,注冊中心服務提供者目錄會發生變化,變化信息會動態通知給消費者,服務治理中心
-
當消費方發起服務調用時,會異步將調用 、 統計信息等上報給監控中心
-
Dubbo 使用 ZooKeeper 作為注冊中心時,只會創建持久節點和臨時節點兩種,對創建的順序並沒有要求
-
目錄示例:
-
客戶端訂閱: 客戶端第一次連上注冊中心 , 訂閱時會獲取全量的數據 , 后續則通過監聽器事件進行更新
-
ZooKeeper的每個節點都有一個版本號,當某個節點的數據發生變化(即事務操作)時 ,
該節點對應的版本號就會發生變化,並觸發 watcher 事件,推送數據給訂閱方。版本號強調的
是變更次數,即使該節點的值沒有變化,只要有更新操作,依然會使版本號變化
dubbo擴展點加載機制
javaSPI
具體步驟:
1.定義一個接口和對應的方法
2.編寫接口的實現類
3.在META-INF/services/目錄下,創建一個以接口全路徑命名的文件
4.文件內容為具體實現類的全路徑名
5.在代碼中通過java.util.ServiceLoader來加載具體的實現類
Dubbo對java的spi機制進行了改進
在DubboSPI中,我們使用@Adaptive注解,可以動態地通過URL中的參數來確定要使用哪個具體的實現類
ExtensionLoader工作流程
這個類實現了配置的加載,擴展類緩存,自適應對象生成
ExtensionLoader的邏輯入口可以分為getExtension、getAdaptiveExtension、getActivateExtension 三個
分別是獲取普通擴展類、獲取自適應擴展類、獲取自動激活的擴展類