Dubbo學習

一、整體架構設計分層
接口服務層(Service):該層與業務邏輯相關,根據provider和consumer的業務設計對應的接口和實現

配置層(Config):對外配置接口,以ServiceConfig和ReferenceConfig為中心

服務代理層(Proxy):服務接口透明代理,生成服務的客戶端Stub和Skeleton,以ServiceProxy為中心,擴展接口為ProxyFactory

服務注冊層(Registry):封裝服務地址的注冊和發現,以服務URL為中心,擴展接口為RegistryFactory、Registry、RegistryService

路由層(Cluster):封裝多個提供者的路由和負載均衡,并橋接注冊中心,以Invoker為中心,擴展接口為 Cluster、Directory、Router 和 LoadBlancce

監控層(Monitor):RPC調用次數和調用時間監控,以Statistics為中心,擴展接口為 MonitorFactory、Monitor 和 MonitorService

遠程調用層(Protocal):封裝RPC調用,以Invocation和Result為中心,擴展接口為 Protocal、Invoker 和 Exporte

信息交換層(Exchange):封裝請求響應模式,同步轉異步,以Request和Response為中心,擴展接口為Exchanger、ExchangeChannel、ExchangeClient 和 ExchangeServe

網絡傳輸層(Transport):抽象mina和netty為統一接口,以Message為中心,擴展接口為Channel、Transport、Client、Server和Codec

數據序列化層(Serialize):可復用的一些工具,擴展接口為 Serialization、ObjectInput、ObjectOutput 和 ThreadPoo

二、默認使用Netty框架,還有mina

三、服務調用阻塞
Dubbo 是基于 NIO 的非阻塞實現并行調用,客戶端不需要啟動多線程即可完成
并行調用多個遠程服務,相對多線程開銷較小,異步調用會返回一個 Future 對
象。

四、核心模塊
dubbo:service 服務配置
dubbo:reference 引用配置
dubbo:protocol 協議配置
dubbo:application 應用配置
dubbo:module 模塊配置
dubbo:registry 注冊中心配置
dubbo:monitor 監控中心配置
dubbo:provider 提供方配置
dubbo:consumer 消費方配置
dubbo:method 方法配置
dubbo:argument 參數配置

五、集群容錯方案
Failover Cluster 失敗自動切換,自動重試其它服務器(默認)
Failfast Cluster 快速失敗,立即報錯,只發起一次調用
Failsafe Cluster 失敗安全,出現異常時,直接忽略
Failback Cluster 失敗自動恢復,記錄失敗請求,定時重發
Forking Cluster 并行調用多個服務器,只要一個成功即返回
Broadcast Cluster 廣播逐個調用所有提供者,任意一個報錯則報錯

六、Dubbo服務降級
通過 dubbo:reference 中設置 mock=“return null”。mock 的值也可以修
改為 true,然后再跟接口同一個路徑下實現一個 Mock 類,命名規則是 “接口
名稱+Mock” 后綴。然后在 Mock 類里實現自己的降級邏輯

七、Dubbo Monitor實現原理
Consumer 端在發起調用之前會先走 filter 鏈;provider 端在接收到請求時也是
先走 filter 鏈,然后才進行真正的業務邏輯處理。默認情況下,在 consumer 和 provider 的 filter 鏈中都會有 Monitorfilter。
1、MonitorFilter 向 DubboMonitor 發送數據
2、DubboMonitor 將數據進行聚合后(默認聚合 1min 中的統計數據)暫存到
ConcurrentMap<Statistics, AtomicReference> statisticsMap,然后使用一個
含有 3 個線程(線程名字:DubboMonitorSendTimer)的線程池每隔 1min 鐘,
調用 SimpleMonitorService 遍歷發送 statisticsMap 中的統計數據,每發送完畢
一個,就重置當前的 Statistics 的 AtomicReference
3、SimpleMonitorService 將這些聚合數據塞入 BlockingQueue queue 中(隊
列大寫為 100000)
4、SimpleMonitorService 使用一個后臺線程(線程名為:
DubboMonitorAsyncWriteLogThread)將 queue 中的數據寫入文件(該線程以
死循環的形式來寫)
5、SimpleMonitorService 還會使用一個含有 1 個線程(線程名字:
DubboMonitorTimer)的線程池每隔 5min 鐘,將文件中的統計數據畫成圖表

八、設計模式
工廠模式:Provider 在 export 服務時,會調用 ServiceConfig 的 export 方法。ServiceConfig
中有個字段:

裝飾器模式:Dubbo 在啟動和調用階段都大量使用了裝飾器模式。以 Provider 提供的調用鏈為例,具體的調用鏈代碼是在 ProtocolFilterWrapper 的 buildInvokerChain 完成的,具體是將注解中含有group=provider 的 Filter 實現,按照 order 排序,最后的調用順序是,更確切地說,這里是裝飾器和責任鏈模式的混合使用。例如,EchoFilter 的作用是判斷是否是回聲測試請求,是的話直接返回內容,這是一種責任鏈的體現。而像ClassLoaderFilter 則只是在主功能上添加了功能,更改當前線程的ClassLoader,這是典型的裝飾器模式。

觀察者模式:Dubbo 的 Provider 啟動時,需要與注冊中心交互,先注冊自己的服務,再訂閱自己的服務,訂閱時,采用了觀察者模式,開啟一個 listener。注冊中心會每 5 秒定時檢查是否有服務更新,如果有更新,向該服務的提供者發送一個 notify 消息,provider 接受到 notify 消息后,即運行 NotifyListener 的 notify 方法,執行監聽器方法。

動態代理模式:Dubbo 擴展 JDK SPI 的類 ExtensionLoader 的 Adaptive 實現是典型的動態代理實現。Dubbo 需要靈活地控制實現類,即在調用階段動態地根據參數決定調用哪個實現類,所以采用先生成代理類的方法,能夠做到靈活的調用。生成代理類的代碼是 ExtensionLoader 的 createAdaptiveExtensionClassCode 方法。代理類的主要邏輯是,獲取 URL 參數中指定參數的值作為獲取實現類的 key。

九、Dubbo配置文件加載到Spring中
Spring 容器在啟動的時候,會讀取到 Spring 默認的一些 schema 以及 Dubbo 自定義的 schema,每個 schema 都會對應一個自己的 NamespaceHandler,NamespaceHandler 里面通過 BeanDefinitionParser 來解析配置信息并轉化為需要加載的 bean 對象。

十、Dubbo SPI和Java SPI
Java SPI
JDK 標準的 SPI 會一次性加載所有的擴展實現,如果有的擴展吃實話很耗時,但也沒用上,很浪費資源。

DUBBO SPI
1,對 Dubbo 進行擴展,不需要改動 Dubbo 的源碼
2,延遲加載,可以一次只加載自己想要加載的擴展實現。
3,增加了對擴展點 IOC 和 AOP 的支持,一個擴展點可以直接 setter 注入其它擴展點。
4,Dubbo 的擴展機制能很好的支持第三方 IoC 容器,默認支持 Spring Bean。

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

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

相關文章

cache 2.單機并發緩存

0.對原教程的一些見解 個人認為原教程中兩點知識的引入不夠友好。 首先是只讀數據結構 ByteView 的引入使用是有點迷茫的&#xff0c;可能不能很好理解為什么需要ByteView。 第二是主體結構 Group的引入也疑惑。其實要是熟悉groupcache&#xff0c;那對結構Group的使用是清晰…

線性回歸與邏輯回歸:深入解析機器學習的基石模型

目錄 一、線性回歸 二、邏輯回歸 邏輯回歸算法和 KNN 算法的區別 分類算法評價維度

QT作業2

使用手動連接&#xff0c;將登錄框中的取消按鈕使用qt4版本的連接到自定義的槽函數中&#xff0c;在自定義的槽函數中調用關閉函數 將登錄按鈕使用qt5版本的連接到自定義的槽函數中&#xff0c;在槽函數中判斷ui界面上輸入的賬號是否為"admin"&#xff0c;密碼是否為…

Navicat 技術指引 | 適用于 GaussDB 分布式的數據查看器

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式數據庫。GaussDB 分布式模式更適合對系統可用性和數據處理能力要求較高的場景。Navicat 工具不僅提供可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結…

微服務學習:Nacos微服務架構中的服務注冊、服務發現和動態配置Nacos下載

Nacos的主要用途包括&#xff1a; 服務注冊與發現&#xff1a;Nacos提供了服務注冊和發現的功能&#xff0c;服務提供者可以將自己的服務注冊到Nacos服務器上&#xff0c;服務消費者則可以通過Nacos來發現可用的服務實例&#xff0c;從而實現服務調用。 動態配置管理&#xff…

聚觀早報 |華為暢享 70正式開售;夢餉科技雙12玩法

【聚觀365】12月8日消息 華為暢享 70正式開售 夢餉科技雙12玩法 華為Mate X5應對火海挑戰 谷歌發布AI模型Gemini 字節跳動開啟新一輪回購 華為暢享 70正式開售 精致外觀與創新科技兼具的華為暢享 70正式開售&#xff0c;1199元起搭載6000mAh超大電池&#xff0c;帶來超強…

機器視覺相機鏡頭光源選型

鏡頭選型工具 - HiTools - 海康威視 Hikvisionhttps://www.hikvision.com/cn/support/tools/hitools/cl8a9de13648c56d7f/ 海康機器人-機器視覺產品頁杭州海康機器人股份有限公司海康機器人HIKROBOT是面向全球的機器視覺和移動機器人產品及解決方案提供商&#xff0c;業務聚焦于…

oracle與sqlsever的區別

oracle與sqlsever的區別 區別一 oracle字符之間連接用|| sqlserver字符之間連接用區別二 oracle字段重命名用as sqlserver字段重命名用區別三 oracle判空用nvl sqlserver判空用isnull區別四 oracle多列合并成一列 select assid, LISTAGG(name, ) within group (order by…

Navicat 技術指引 | 適用于 GaussDB 分布式的數據生成功能

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式數據庫。GaussDB 分布式模式更適合對系統可用性和數據處理能力要求較高的場景。Navicat 工具不僅提供可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結…

GPTs的創建與使用,自定義GPTs中的Actions示例用法 定義和執行特定任務的功能模塊 通過API與外部系統或服務的交互

Name 等 Logo:自動生成 Name 介紹 Description 介紹 Instructions 要求或命令等 比如用中文回復&#xff0c;角色。 Knowledge 上傳你的知識庫&#xff0c;如果你有某一垂直行業的數據&#xff0c;基于數據來回答。比如我有某個芯片的指令集。 Capabilities 都要 Actions&…

Flink 使用場景

Apache Flink 功能強大&#xff0c;支持開發和運行多種不同種類的應用程序。它的主要特性包括&#xff1a;批流一體化、精密的狀態管理、事件時間支持以及精確一次的狀態一致性保障等。Flink 不僅可以運行在包括 YARN、 Mesos、K8s 在內的多種資源管理框架上&#xff0c;還支持…

工業IC是什么

工業IC 電子元器件百科 文章目錄 工業IC前言一、工業IC是什么二、工業IC的類別三、工業IC應用實例四、工業IC作用原理總結前言 工業IC包括微控制器(MCU)、采樣芯片、模擬-數字轉換器(ADC)、電源管理芯片、驅動芯片等。它們被廣泛應用于各個行業的工業控制和自動化系統中,…

2023年泰國加密市場概覽

一、泰國區塊鏈及加密生態概覽 1.加密貨幣數據分析平臺訪問人數火爆 2023年CoinMarketCap網站的平均月訪問量為64.8萬人次&#xff0c;占全國總人口的0.94%&#xff0c;泰國的人均訪問量比美國高出0.21%。 1.2泰國加密資產交易量可觀 根據CoinGecko上泰國領先的數字資產交易所…

vue3遞歸組件---樹形組件

第一種方式&#xff0c;直接自己調用自己 Tree.vue <template><div class"tree"><div v-for"(item, index) in data" :key"item.name">每一層 {{ item.name }}<Tree v-if"item?.children?.length" :dataitem…

linux如何清空文件內容

在做系統運維工作時&#xff0c;有時會發現一個問題&#xff1a;某些存儲空間的使用率過高。換句話說就是空間快被堆滿了&#xff0c;需要釋放空間。大多數情況下&#xff0c;導致空間不足的罪魁禍首通常是一些log日志文件。對于某些特殊系統來說&#xff0c;日志文件還不能直接…

AGM離線下載器使用說明

AGM專用離線下載器示意圖&#xff1a; 供電方式&#xff1a; 通過 USB 接口給下載器供電&#xff0c;跳線 JP 斷開。如果客戶 PCB 的 JTAG 口不能提供 3.3V 電源&#xff0c;或僅需燒寫下載器&#xff0c;尚未連接用戶 PCB 時&#xff0c;采用此種方式供電。 或者&#xff1a…

Linux中的網絡時間服務器

本章主要介紹網絡時間的服務器 使用chrony配置時間服務器配置chrony客戶端服務器同步時間 1.1 時間同步的重要性 一些服務對時間要求非常嚴格&#xff0c;例如如圖所示的由三臺服務器搭建的ceph集群 這三臺服務器的時間必須保持一致&#xff0c;如果不一致&#xff0c;就會顯…

Django講課筆記01:初探Django框架

文章目錄 一、學習目標二、課程導入&#xff08;一&#xff09;課程簡介&#xff08;二&#xff09;課程目標&#xff08;三&#xff09;適用人群&#xff08;四&#xff09;教學方式&#xff08;五&#xff09;評估方式&#xff08;六&#xff09;參考教材 三、新課講授&#…

android項目實戰之編輯器集成

引言 項目需要用到編輯器&#xff0c;采用RichEditor&#xff0c;如下效果 實現 1. 引入庫2 implementation jp.wasabeef:richeditor-android:2.0.0 2. XML <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width&q…

LeetCode:2008. 出租車的最大盈利(dp C++)

目錄 2008. 出租車的最大盈利 題目描述&#xff1a; 實現代碼與解析&#xff1a; DP 二分&#xff08;兩種寫法&#xff09; 原理思路&#xff1a; 2008. 出租車的最大盈利 題目描述&#xff1a; 你駕駛出租車行駛在一條有 n 個地點的路上。這 n 個地點從近到遠編號為 1 …