dubbo源码解析(一)
大家好,我是烤鴨:
? ? ?今天和大家分享dubbo的源碼解析。
1.SPI
http://dubbo.apache.org/zh-cn/docs/source_code_guide/dubbo-spi.html
介紹:
SPI 全稱為 Service Provider Interface,是一種服務發現機制。
SPI 的本質是將接口實現類的全限定名配置在文件中,并由服務加載器讀取配置文件,加載實現類。這樣可以在運行時,動態為接口替換實現類。
Dubbo重寫了Java原生的SPI。Dubbo SPI 是通過鍵值對的方式進行配置,按需加載指定的實現類。
源碼:
com.alibaba.dubbo.common.extension.ExtensionLoader?
getExtension:
獲取拓展類對象。
createExtension:
1. 通過 getExtensionClasses 獲取所有的拓展類
2. 通過反射創建拓展對象
3. 向拓展對象中注入依賴 (injectExtension)
4. 將拓展對象包裹在相應的 Wrapper 對象中
將產生的wrapper對象放到 objectFactory 。
objectFactory 變量的類型為 AdaptiveExtensionFactory,AdaptiveExtensionFactory 內部維護了一個 ExtensionFactory 列表,用于存儲其他類型的 ExtensionFactory。Dubbo 目前提供了兩種 ExtensionFactory,分別是 SpiExtensionFactory 和 SpringExtensionFactory。前者用于創建自適應的拓展,后者是用于從 Spring 的 IOC 容器中獲取所需的拓展。?
Dubbo IOC 目前僅支持 setter 方式注入。
2.動態加載
http://dubbo.apache.org/zh-cn/docs/source_code_guide/adaptive-extension.html
介紹:
拓展方法被調用時,根據運行時參數進行加載。 Dubbo 會為拓展接口生成具有代理功能的代碼。然后通過 javassist 或 jdk 編譯這段代碼,得到 Class 類。最后再通過反射創建代理類,整個過程比較復雜。
源碼:
@Adaptive?
當 Adaptive 注解在類上時,Dubbo 不會為該類生成代理類。注解在方法(接口方法)上時,Dubbo 則會為該方法生成代理邏輯。
com.alibaba.dubbo.common.extension.ExtensionLoader?
getAdaptiveExtension:
創建自適應拓展。
createAdaptiveExtension:
1. 調用 getAdaptiveExtensionClass 方法獲取自適應拓展 Class 對象
2. 通過反射進行實例化
3. 調用 injectExtension 方法向拓展實例中注入依賴
getAdaptiveExtensionClass:
1. 調用 getExtensionClasses 獲取所有的拓展類
2. 檢查緩存,若緩存不為空,則返回緩存
3. 若緩存為空,則調用 createAdaptiveExtensionClass 創建自適應拓展類動態生成代碼(類):
代碼生成的順序與 Java 文件內容順序一致,首先會生成 package 語句,然后生成 import 語句,緊接著生成類名等代碼。
動態生成代碼(方法):
Dubbo 不會為沒有標注 Adaptive 注解的方法生成代理邏輯,對于該種類型的方法,僅會生成一句拋出異常的代碼。
?獲取 URL 數據:
?要為 Protocol 接口的 refer 和 export 方法生成代理邏輯。
?通過遍歷 refer 的參數列表即可獲取 URL 數據,export 參數列表中沒有 URL 參數,因此需要從 Invoker 參數中獲取 URL 數據。獲取方式是調用 Invoker 中可返回 URL 的 getter 方法,如果 Invoker 中無相關 getter 方法,此時則會拋出異常。
?生成后如下:
獲取 Adaptive 注解值:
Adaptive 注解值 value 類型為 String[],可填寫多個值,默認情況下為空數組。若 value 為非空數組,直接獲取數組內容即可。若 value 為空數組,則需進行額外處理。比如 LoadBalance 經過處理后,得到 load.balance。
檢測 Invocation 參數:
檢測方法列表中是否存在 Invocation 類型的參數,若存在,則為其生成判空代碼和其他一些代碼。
生成拓展名獲取邏輯:
本段邏輯用于根據 SPI 和 Adaptive 注解值生成“獲取拓展名邏輯”,同時生成邏輯也受 Invocation 類型參數影響,綜合因素導致本段邏輯相對復雜。本段邏輯可以會生成但不限于下面的代碼:
生成拓展加載與目標方法調用邏輯:
本段代碼邏輯用于根據拓展名加載拓展實例,并調用拓展實例的目標方法。
以 Protocol 接口舉例說明,上面代碼生成的內容如下:
生成完整的方法:
以 Protocol 的 refer 方法為例,上面代碼生成的內容如下:
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的dubbo源码解析(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android develop 国际化
- 下一篇: 大一c语言期末考试编程题