深入理解Apache Dubbo與實戰-第5章《Dubbo啓停原理解析》總結

1、配置解析

  • 基於XML配置原理解析:主要解析邏輯入口是在DubboNamespaceHandler類中完成的,其主要把不同的標籤關聯到解析實現類中;
  • 基於註解配置原理解析:註解處理邏輯主要包含3部分內容,第一部分是如果用戶使用了配置文件,則框架按需生成對應Bean,第二部分是要將所有使用Dubbo的註解@Service的Class提升爲Bean,第三部分要爲使用@Reference註解的字段或方法注入代理對象。

@Service服務註解掃描和註冊:

1)Dubbo框架首先會提取用戶配置的掃描包名稱;

2)開始真正的註解掃描;

3)配置掃描@Service註解作爲過濾條件;

4)將@Service標註的服務提升爲不同的bean;

5)根據註冊的普通的Bean生成ServiceBean的佔位符,用於Spring啓動後的服務暴露。

@Refrence消費註解注入:

1)查找Bean所有標註了@Reference的字段和方法;

2)對字段、方法進行反射綁定;

3)遍歷服務類所有的字段,查找Reference註解標註。

2、服務暴露的實現原理

  • 配置承載初始化:

1)-D傳遞給JVM參數優先級最高;

2)代碼或XML配置優先級次高;

3)配置文件優先級最低。

  • 遠程服務的暴露機制:

Dubbo框架做服務暴露分爲兩大部分:第一步將持有的服務實例通過代理轉換成Invoker,第二步會把Invoker通過具體的協議(比如Dubbo)轉換成Exporter。這裏的Invoker可以簡單理解成一個真實的服務對象實例。

1)主要通過反射獲取配置對象並放到map中用於後續構造URL參數;

2)主要區分全局配置;

3)主要處理本地內存JVM協議暴露;

4)主要追加監控上報地址,框架會在攔截器中執行數據上報,這部分是可選的;

5)通過動態代理的方式創建Invoker對象,在服務端生成的是AbstractProxyInvoker實例,所有真實的方法調用都會委託給代理,然後代理轉發給服務ref調用;

6)主要先觸發服務暴露,然後進行服務元數據註冊;

7)主要處理沒有使用註冊中心的場景,直接進行服務暴露,不需要元數據註冊。

  • 註冊中心控制服務暴露:

1)打開端口,把服務實例存儲到map;

2)創建註冊中心實例;

3)服務暴露之後,註冊服務元數據;

4)監聽服務接口下configurators節點,用於處理動態配置;

5)Invoker銷燬時註銷端口和map中服務實例等資源;

6)移除已註冊的元數據;

7)去掉訂閱配置監聽器。

3、服務消費的實現原理

在整體上看,Dubbo框架做服務消費也分爲兩大部分,第一步通過持有遠程服務實例生成Invoker,這個Invoker在客戶端是核心的遠程代理對象。第二步會把Invoker通過動態代理轉換成實現用戶接口的動態代理引用。

1)默認檢查是否適同一個JVM內部調用;

2)直接使用injvm協議從內存中獲取實例;

3)註冊中心地址後天添加refer存儲服務消費元數據信息;

4)單註冊中心消費;

5)逐個獲取註冊中心的服務,並添加到invokers列表;

6)通過Cluster將多個Invoker轉換成一個Invoker;

7)把Invoker轉換成接口代理。

  • 通過註冊中心消費

1)設置具體註冊中心協議,比如ZooKeeper;

2)創建具體註冊中心實例;

3)根據配置處理多分組結果聚合;

4)處理訂閱數據並通過Cluster合併多個Invoker;

5)消費核心關鍵,持有實際Invoker和接收訂閱通知;

6)註冊消費信息到註冊中心;

7)訂閱服務提供者、路由和動態配置;

8)通過Cluster合併Invokers。

4、優雅停機原理解析

1)收到kill9進程推出信號,Spring容器會觸發容器銷燬事件;

2)provider端會取消註冊服務元數據信息;

3)consumer端會收到最新地址列表(不包含準備停機的地址);

4)Dubbo協議會發送readonly事件報文通知consumer服務不可用;

5)服務端等待已經執行的任務結束並拒絕新任務執行。

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