四、Dubbo擴展點加載機制

四、Dubbo擴展點加載機制
4.1 加載機制概述

  • Dubbo良好的擴展性與框架中針對不同場景使用合適設計模式、加載機制密不可分

  • Dubbo幾乎所有功能組件都是基于擴展機制(SPI)實現的

  • Dubbo SPI 沒有直接使用 Java SPI,在它思想上進行改進,并兼容 Java SPI
    4.1.1 Java SPI

  • Java SPI(Service Provider Interface)使用了策略模式,一個接口多種實現,具體實現由程序之外的配置掌控。具體步驟:

    • 定義一個接口及對應的方法
    • 編寫該接口的一個實現類
    • 在 META-INF/services/目錄下,創建一個以接口全路徑命名的文件,如com.test.spi.PrintService
    • 文件內容為具體實現類的全路徑名,如果有多個,則用分行符分隔
    • 在代碼中通過java.util.ServiceLoader來加載具體的實現類
      4.1.2 擴展點加載機制的改進
  • Java SPI加載失敗,可能會因為各種原因導致異常信息被“吞掉”,導致開發人員問題追蹤比較困難。Dubbo SPI在擴展加載失敗的時候會先拋出真實異常并打印日志。擴展點在被動加載的時候,即使有部分擴展加載失敗也不會影響其他擴展點和整個框架的使用

  • Dubbo SPI自己實現了 IoC和AOP機制。一個擴展點可以通過setter方法直接注入其他擴展的方法

  • Dubbo 支持包裝擴展類,推薦把通用的抽象邏輯放到包裝類中,用于實現擴展點的AOP特性
    4.1.3 擴展點的配置規范

  • Dubbo SPI 配置規范

    • 在這里插入圖片描述
  • 4.1.4 擴展點的分類與緩存

  • Dubbo SPI 緩存

    • Class緩存:Dubbo SPI獲取擴展類時,會先從緩存中讀取。如果緩存中不存在,則加載配置文件,根據配置把Class緩存到內存中,并不會直接全部初始化
    • 實例緩存:基于性能考慮,Dubbo框架中不僅緩存Class,也會緩存Class實例化后的對象。每次獲取的時候,會先從緩存中讀取,如果緩存中讀不到,則重新加載并緩存起來。這也是為什么Dubbo SPI相對Java SPI性能上有優勢的原因,因為Dubbo SPI緩存的Class并不會全部實例化,而是按需實例化并緩存,因此性能更好。
      4.1.5 擴展點的特性
  • 擴展類特性:自動包裝、自動加載、自適應和自動激活

    • 自動包裝:ExtensionLoader在加載擴展時,如果發現這個擴展類包含其他擴展點作為構造函數的參數,則這個擴展類就會被認為是Wrapper類
    • 自動加載:如果某個擴展類是另外一個擴展點類的成員屬性,并且擁有setter方法,那么框架也會自動注入對應的擴展點實例
    • 自適應:使用@Adaptive注解,可以動態地通過URL中的參數來確定要使用哪個具體的實現類。從而解決自動加載中的實例注入問題
    • 自動激活:使用@Activate注解,可以標記對應的擴展點默認被激活啟用
      4.2 擴展點注解
      4.2.1 擴展點注解:@SPI
  • 標記這個接口是一個Dubbo SPI接口,即是一個擴展點,可以有多個不同的內置或用戶定義的實現

  • Dubbo中很多地方通過getExtension (Class type, String name)來獲取擴展點接口的具體實現,此時會對傳入的Class做校驗,判斷是否是接口,以及是否有@SPI注解,兩者缺一不可
    4.2.2 擴展點自適應注解:@Adaptive

  • 在整個Dubbo框架中,只有幾個地方使用在類級別上,如AdaptiveExtensionFactory和AdaptiveCompiler,其余都標注在方法上

  • 方法級別注解可以通過參數動態獲得實現類,在第一次getExtension時,會自動生成和編譯一個動態的Adaptive類,從而達到動態實現類的效果
    4.2.3 擴展點自動激活注解:@Activate

  • 有多個擴展點實現、需要根據不同條件被激活的場景中,如Filter需要多個同時激活,因為每個Filter實現的是不同的功能
    4.3 ExtensionLoader 的工作原理
    4.3.1 工作流程

  • ExtensionLoader 的邏輯入口可以分為 getExtension、getAdaptiveExtension、getActivateExtension三個,分別是獲取普通擴展類、獲取自適應擴展類、獲取自動激活的擴展類

  • 在這里插入圖片描述

  • 4.4 擴展點動態編譯的實現
    4.4.1 總體結構

  • Dubbo中有三種代碼編譯器,分別是JDK編譯器、Javassist編譯器和AdaptiveCompiler編譯器

  • 在這里插入圖片描述

    • Compiler接口上含有一個SPI注解,注解的默認值是@SPI(”javassist”),即Javassist編譯器將作為默認編譯器
  • AdaptiveCompiler上面@Adaptive注解,說明AdaptiveCompiler會固定為默認實現
    4.4.2 Javassist 動態代碼編譯

  • 初始化Javassist,設置默認參數,如設置當前的classpath

  • 通過正則匹配出所有import的包,并使用Javassist添加import

  • 通過正則匹配出所有extends的包,創建Class對象,并使用Javassist添加extends

  • 通過正則匹配出所有implements包,并使用Javassist添加implements

  • 通過正則匹配出類里面所有內容,即得到{}中的內容,再通過正則匹配出所有方法,并使用Javassist添加類方法

  • 生成Class對象
    4.4.3 JDK 動態代碼編譯

  • 初始化一個JavaFileObject對象,并把代碼字符串作為參數傳入構造方法

  • 調用JavaCompiler.CompilationTask方法編譯出具體的類

  • JavaFileManager負責管理類文件的輸入/輸出位置

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36700.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36700.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

競賽項目 深度學習的視頻多目標跟蹤實現

文章目錄 1 前言2 先上成果3 多目標跟蹤的兩種方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟蹤過程4.1 存在的問題4.2 基于軌跡預測的跟蹤方式 5 訓練代碼6 最后 1 前言 🔥 優質競賽項目系列,今天要分享的是 基于深度學習的視頻多目標跟蹤實現 …

全網最牛,Appium自動化測試框架-關鍵字驅動+數據驅動實戰(二)

目錄:導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結(尾部小驚喜) 前言 util 包 util 包…

數據可視化工具LightningChart .NET正式發布v10.5.1——擁有全新的3D新功能

LightningChart.NET完全由GPU加速,并且性能經過優化,可用于實時顯示海量數據-超過10億個數據點。 LightningChart包括廣泛的2D,高級3D,Polar,Smith,3D餅/甜甜圈,地理地圖和GIS圖表以及適用于科學…

網絡安全專業術語英文縮寫對照表

因在閱讀文獻過程中經常遇到各種專業縮寫,所以把各種縮寫總結了一下。 因能力有限,錯誤在所難免,歡迎進行糾錯與補充:https://github.com/piaolin/CSAbbr 滲透相關 縮寫全稱解釋備注XSSCross Site Script Attack跨站腳本攻擊為…

ResNet創新點總結

ResNet(Residual Networks)是深度學習中的一個重要架構,其創新點主要體現在解決了深層神經網絡訓練中的梯度消失和梯度爆炸問題,從而使得可以構建更深的神經網絡。以下是 ResNet 的創新點總結: ??1. 殘差連接&#x…

nlohmann json:通過items遍歷object/array

//官方的例子 #include <iostream> #include <nlohmann/json.hpp>using json = nlohmann::json;int main() {// create JSON valuesjson j_object = {{"one", 1}, {"two", 2}};json j_array = {1, 2, 4, 8, 16};// example for an objectfor (…

java畢業設計-智慧食堂管理系統-內容快覽

首頁 智慧食堂管理系統是一種可以提高食堂運營效率的管理系統。它將前端代碼使用Vue實現&#xff0c;后端使用Spring Boot實現。這個系統的目的是簡化食堂管理&#xff0c;提高食堂服務質量。在現代快節奏的生活中&#xff0c;人們對餐飲服務提出了更高的要求&#xff0c;食堂管…

Flink-間隔聯結

間隔聯結只支持事件時間間隔聯結如果遇到遲到數據&#xff0c;則會關聯不上&#xff0c;比如來了一個5秒的數據&#xff0c;它可以關聯前2秒的數據&#xff0c;后3秒的數據&#xff0c;就是可以關聯3秒到8秒的數據&#xff0c;然后又來了一個6秒的數據&#xff0c;可以關聯4秒到…

Docker安裝elasticsearch分布式搜索

文章目錄 ??安裝elasticsearch??1.部署單點es&#x1f338;1.1.創建網絡&#x1f338;1.2.下載鏡像&#x1f338;1.3.運行 ??2.部署kibana&#x1f338;2.1.部署&#x1f338;2.2.DevTools ??3.安裝IK分詞器&#x1f338;3.1.在線安裝ik插件&#xff08;較慢&#xff0…

Rx.NET in Action 中文介紹 前言及序言

Rx 處理器目錄 (Catalog of Rx operators) 目標可選方式Rx 處理器(Operator)創建 Observable Creating Observables直接創建 By explicit logicCreate Defer根據范圍創建 By specificationRangeRepeatGenerateTimerInterval Return使用預設 Predefined primitivesThrow …

答疑:Arduino IDE配置其他開發板下載速度慢

基于案例&#xff1a;Linux環境Arduino IDE中配置ATOM S3 通常&#xff0c;網絡問題較多&#xff0c;可以使用一些技巧。 https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json 沒有配置&#xff0c;不支持M5Stack&#xff08;ESP32&…

HCIA靜態路由與動態路由

目錄 一、靜態路由 定義&#xff1a; 適用環境 二、動態路由 定義&#xff1a; 特點&#xff1a; 動態路由協議: 三、缺點&#xff1a; 1&#xff09;靜態路由缺點: 2&#xff09;動態路由的缺點: 四、靜態路由與動態路由的區別 靜態路由: 動態路由: 一、靜態路…

字節原來這么容易進,是面試官放水,還是公司實在是太缺人?

本人211非科班&#xff0c;之前在字節和騰訊實習過&#xff0c;這次其實沒抱著什么特別大的希望投遞&#xff0c;沒想到字節可以再給我一次機會&#xff0c;還是挺開心的。 本來以為有個機會就不錯啦&#xff01;沒想到能成功上岸&#xff0c;在這里要特別感謝幫我內推的同學&…

【Python】進階之 MySQL入門教程

文章目錄 數據庫概述Mysql概述Mysql安裝與使用Navicat安裝和使用Mysql終端指令操作Mysql和python交互訂單管理案例實現 數據庫概述 數據庫的由來 發展歷程說明人工管理階段用紙帶等進行數據的存儲文件系統階段數據存儲在文件中數據庫階段解決了文件系統問題高級數據庫階段分布式…

IDEA 設置字體大小無效

設置字體大小&#xff0c;一般都是從file>settings>editor>font>Size里設置&#xff0c;一般都有效。 但是&#xff0c;如果是更換了主體&#xff0c;則需要從主體顏色菜單那里這是&#xff0c;你看這個頁面&#xff0c;上面黃色三角也提示你了&#xff0c;要去顏色…

學習筆記整理-DOM-03-定時器

一、定時器 1. setInterval()函數 setInterval()函數可以重復調用一個函數&#xff0c;在每次調用之間具有固定的時間間隔。 setInterval(function () { // 這個函數將自動被以固定間隔時間調用 }, 2000);第一個參數是函數第二個參數是間隔時間&#xff0c;以毫秒為單位&…

SpringBoot中間件使用之EventBus、Metric、CommandLineRunner

1、EventBus 使用EventBus 事件總線的方式可以實現消息的發布/訂閱功能&#xff0c;EventBus是一個輕量級的消息服務組件&#xff0c;適用于Android和Java。 // 1.注冊事件通過 EventBus.getDefault().register(); // 2.發布事件 EventBus.getDefault().post(“事件內容”); …

深入理解spring面經

1 了解SpringMVC的處理流程嗎&#xff1f; 用戶發送請求至前端控制器DispatcherServlet。DispatcherServlet通過處理器映射器HandlerMapping找到對應的處理器。DispatcherServlet將請求提交給對應的處理器Controller。Controller處理完請求后返回ModelAndView。DispatcherServ…

面試攻略,Java 基礎面試 100 問(十三)

什么時候用 assert&#xff1f; assertion(斷言)在軟件開發中是一種常用的調試方式&#xff0c;很多開發語言中都支持這種機制。一般來說&#xff0c;assertion 用于保證程序最基本、關鍵的正確性。assertion 檢查通常在開發和測試時開啟。為了提高性能&#xff0c;在軟件發布…

支持對接鴻蒙系統的無線模塊及其常見應用介紹

近距離的無線通信得益于萬物互聯網的快速發展&#xff0c;基于集成部近距離無線連接&#xff0c;為固定和移動設備建立通信的藍牙技術也已經廣泛應用于汽車領域、工業生產及醫療領域。為協助物聯網企業終端產品能快速接入鴻蒙生態系統&#xff0c;SKYLAB聯手國產芯片廠家研發推…