Dubbo原理與框架設計

Dubbo是常用的開源服務治理型RPC框架,在之前osgi框架下不同bundle之間的方法調用時用到過。其工作原理和框架設計值得開源技術愛好者學習和研究。

一、Dubbo的工作原理

dubbo-architucture


調用關系說明
  1. 服務容器負責啟動,加載,運行服務提供者。
  2. 服務提供者在啟動時,向注冊中心注冊自己提供的服務。
  3. 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
  4. 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數據給消費者。
  5. 服務消費者,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。
  6. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。

二、Dubbo的框架分層

/dev-guide/images/dubbo-framework.jpg

圖例說明:

  • 圖中左邊淡藍背景的為服務消費方使用的接口,右邊淡綠色背景的為服務提供方使用的接口,位于中軸線上的為雙方都用到的接口。
  • 圖中從下至上分為十層,各層均為單向依賴,右邊的黑色箭頭代表層之間的依賴關系,每一層都可以剝離上層被復用,其中,Service 和 Config 層為 API,其它各層均為 SPI。
  • 圖中綠色小塊的為擴展接口,藍色小塊為實現類,圖中只顯示用于關聯各層的實現類。
  • 圖中藍色虛線為初始化過程,即啟動時組裝鏈,紅色實線為方法調用過程,即運行時調時鏈,紫色三角箭頭為繼承,可以把子類看作父類的同一個節點,線上的文字為調用的方法。

各層說明

  • config 配置層:對外配置接口,以?ServiceConfig,?ReferenceConfig?為中心,可以直接初始化配置類,也可以通過 spring 解析配置生成配置類
  • proxy 服務代理層:服務接口透明代理,生成服務的客戶端 Stub 和服務器端 Skeleton, 以?ServiceProxy?為中心,擴展接口為?ProxyFactory
  • registry 注冊中心層:封裝服務地址的注冊與發現,以服務 URL 為中心,擴展接口為?RegistryFactory,?Registry,?RegistryService
  • cluster 路由層:封裝多個提供者的路由及負載均衡,并橋接注冊中心,以?Invoker?為中心,擴展接口為?Cluster,?Directory,?Router,?LoadBalance
  • monitor 監控層:RPC 調用次數和調用時間監控,以?Statistics?為中心,擴展接口為?MonitorFactory,?Monitor,?MonitorService
  • protocol 遠程調用層:封裝 RPC 調用,以?Invocation,?Result?為中心,擴展接口為?Protocol,?Invoker,?Exporter
  • exchange 信息交換層:封裝請求響應模式,同步轉異步,以?Request,?Response?為中心,擴展接口為?Exchanger,?ExchangeChannel,?ExchangeClient,?ExchangeServer
  • transport 網絡傳輸層:抽象 mina 和 netty 為統一接口,以?Message?為中心,擴展接口為?Channel,?Transporter,?Client,?Server,?Codec
  • serialize 數據序列化層:可復用的一些工具,擴展接口為?Serialization,?ObjectInput,?ObjectOutput,?ThreadPool

嘗試試用可參考Dubbo安裝配置手冊

三、其它RPC框架

motan是和Dubbo類似的服務治理型RPC框架,是新浪2016年開源的RPC框架,總體設計和Dubbo類似,相當于Dubbo的精簡版,去掉了一些不常用的協議、注冊中心、通訊組件等的支持。

雖然Dubbo本身不支持多語言,但它可以很方便的集成其它多語言型RPC框架,如thrift等。

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

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

相關文章

面向全球用戶的Teams app之Culture計量單位和禁忌篇

我在前一篇文章里分享了Global Ready的app時會遇到的不同文化對于數字方面的挑戰。這篇我繼續分享不同文化對于計量單位和禁忌方面的挑戰。 我們先來看一個例子,假如有一個teams bot,它告訴你一些動物的速度,比如它告訴你: 獵豹能…

【我的Android進階之旅】Android自定義Lint實踐

背景 2017年8月份的時候,我在公司開始推廣Lint、FindBugs等靜態代碼檢測工具。然后發現系統自帶的Lint檢測的Issue不滿足我們團隊內部的特定需求,因此去自定義了部分Lint規則。這個檢測運行了大半年,運行良好,團隊的代碼規范也有了…

存儲結構與索引

一、SQL數據存儲的基本介紹 數據庫中的數據存儲涉及頁(Page)和區(Extent)這兩個概念了。SQL server中數據存儲的基本單位是頁。為數據庫中的數據文件(.mdf或.ndf)分配的磁盤空間可以從邏輯上劃分成頁(從0到…

面向全球用戶的Teams app之時區篇

我在前兩篇文章里分享了Global Ready的app時會遇到的不同文化的挑戰。這篇我繼續分享在時區方面的挑戰。 時間是最復雜的,最容易出錯的部分。時間復雜的最根本原因是時區問題。 首先,大家都知道,我們地球是圓的,這個意味著如果大…

Linux: Nginx proxy_pass域名解析引發的故障

背景 業務架構: 部署細節:  兩容器均部署在同一機器上,通過 docker-compose 編排,并且通過link方式鏈接。 故障描述 在有次更新代碼時,發現前端能夠打開,但是所有接口請求全是502(Bad GateWay) 故障排查 …

Oracle建立全文索引詳解

Oracle建立全文索引詳解1.全文檢索和普通檢索的區別 不使用Oracle text功能,當然也有很多方法可以在Oracle數據庫中搜索文本,比如INSTR函數和LIKE操作: SELECT *FROM mytext WHERE INSTR (thetext, Oracle) > 0; SELECT * FROM mytext WHE…

面向全球用戶的Teams app之夏令時篇

我在前兩篇文章里分享了Global Ready的teams app時會遇到的不同挑戰。這篇我繼續分享在夏令時方面的挑戰。 夏令時,主要是為了節約能源,英文里通常縮寫成DST(Daylight Saving Time)。一般在天亮早的夏季人為將時間調快一小時,可以使人早起早…

爬取全部的校園新聞

1.從新聞url獲取新聞詳情: 字典,anews 2.從列表頁的url獲取新聞url:列表append(字典) alist 3.生成所頁列表頁的url并獲取全部新聞 :列表extend(列表) allnews *每個同學爬學號尾數開始的10個列表頁 4.設置合理的爬取間隔 import time import…

面向全球用戶的Teams app之合規性篇

我在前兩篇文章里分享了Global Ready的app時會遇到的不同挑戰。這篇我繼續分享在合規性方面的挑戰。 說到合規性compliance,不得不說GDPR標準,當我們發布了一個teams app后,微軟會要求開發人員做一個security self assessment,這…

C進階 - 內存四驅模型

一.內存四驅模型 不知我們是否有讀過 《深入理解 java 虛擬機》這本書,強烈推薦讀一下。在 java 中我們將運行時數據,分為五個區域分別是:程序計數器,java 虛擬機棧,本地方法棧,java 堆,方法區。…

行內元素中去掉文字的上下間距,使得文字所在元素的高度同字體高度一致的方法...

之前在p這類塊元素中的文字,給line-hight1;就可以去掉文字自帶的上下間距, 像這樣: 最近突然發現這個方法在行內塊和塊元素上好使,可當用在span或者a這類內聯元素上都不好使,除了轉為塊元素的方法來去掉上下間距&#…

VSCode的Teams插件

隨著今年在線的Build大會的結束,又是一大波的 Teams 新功能,新工具,新SDK。我接下來幾篇博客就會詳細和大家一一介紹。我今天先從VSCode的插件開始。 打開VS Code,搜索Teams,就可以找到Microsoft Teams Toolkit插件&a…

ADB原理,Wi-Fi連接,常用命令及拓展

Android 開發筆記 onGithub 文章多處鏈接需要科學上網 本文按順序主要講解了ADB的原理,使用Wi-Fi連接設備,ADB常用命令,在Java代碼中執行shell命令,使用ddmlib進行擴展。 ADB的原理 參考 官方文檔 ADB(Android Debug B…

使用Flow快速開發Teams小應用

繼續我的上一篇博客,這篇繼續介紹BUILD大會里的內容:Flow。 Flow是微軟power平臺的一個服務,通過簡單的拖拽就可以完成一個業務邏輯的處理,現在Flow和Teams的結合十分緊密。我們來試一下。 先點擊Teams左邊的Flow菜單。 如果你的…

python正則中如何匹配漢字以及encode(‘utf-8’)和decode(‘utf-8’)的互轉

正則表達式&#xff1a;  [\u2E80-\u9FFF]$ 匹配所有東亞區的語言   [\u4E00-\u9FFF]$ 匹配簡體和繁體   [\u4E00-\u9FA5]$ 匹配簡體   <input type"text" name"username" οnkeyup"valuevalue.replace([\u4E00-\u9FA5]$)"> 正則表…

【區塊鏈】認識區塊鏈的基本概念

2018年區塊鏈技術風卷全球&#xff0c;似乎大家都在談論區塊鏈&#xff0c;那到底什么區塊鏈&#xff0c;區塊鏈到底能干什么&#xff0c;對普通人會有什么影響&#xff0c;很多人還是稀里糊涂&#xff0c;那么就談談我的一些理解吧&#xff0c;拋磚引玉歡迎探討。 我是如何接觸…

Java 分割、合并byte數組

場景&#xff1a;上傳文件較大&#xff0c;把存放文件內容byte數組拆分成小的。下載的時候按照順序合并。 起初覺得挺麻煩的&#xff0c;寫完覺得挺簡單。 切割&#xff1a; /*** 拆分byte數組* * param bytes* 要拆分的數組* param size* 要按幾個組成一…

Java版本的Bot Framework SDK

微軟為了鼓勵Java開發人員開發bot&#xff0c;在上個月推出了Java的Bot SDK v4.6版本&#xff0c;目前還在Preview版本&#xff0c;相信不用多久就可以趕上其他版本了。 我的java還停留在 n 年前的水平&#xff0c;但是處于好奇&#xff0c;決定玩一下這套sdk。 這套sdk目前建…

jquery方法.serializeArray()獲取name和value并轉為json數組

jquery的.serializeArray()方法可以獲取形如以下 [ {name: firstname, value: Hello}, {name: lastname, value: World}, ] name value組成的對象數組&#xff0c;如果我們想得到key為name,value為value的json對象&#xff0c;則如下轉換&#xff1a; var m {}; $.each($(&quo…

Teams Bot 如何使用新的 System.Text.Json 庫

我最近把 LuckyDraw的代碼升級到了 .net core 3.1&#xff0c;當然我也很想使用最新的微軟json庫&#xff0c;System.Text.Json這個庫的性能比之前Newtonsoft.Json速度更快&#xff0c;而且就我本人愛好來說&#xff0c;更加喜歡System.Text.Json的命名&#xff0c;之前一直覺得…