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)服務端等待已經執行的任務結束並拒絕新任務執行。