Dubbo使用及底層通訊原理

2022-06-14 04:48:12 字數 2174 閱讀 2660

dubbo採用的是一種非常簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,所以基於這一點可以抽象出服務提供方(provider)和服務消費方(consumer)兩個角色。dubbo除了可以提供服務之外,還可以實現軟負載均衡。它還提供了兩個功能monitor 監控中心和呼叫中心。這兩個是可選的,需要單獨配置。

常用場景:

dubbo採用單一長連線和nio非同步通訊,適合於小資料量大併發的服務呼叫,以及服務消費者機器數遠大於服務提供者機器數的情況

dubbo原理

1. 節點角色說明

provider:暴露服務的服務提供方

consumer:呼叫遠端服務的服務消費方

registry:服務註冊與發現的註冊中心(provider將服務暴露給它,consumer在這裡查詢所需服務)

monitor:統計服務的呼叫次數和呼叫事件的監控中心

cotainer:服務執行容器,常見的容器有spring容器。

2. 原理

整個發布-訂閱的過程可以簡單的理解為生產者-消費者模型+註冊中心+監控中心:

如果考慮失敗或變更的情況,就需要考慮下面的過程。

分析源**,基本原理如下:

client乙個執行緒呼叫遠端介面,生成乙個唯一的id(比如一段隨機字串,uuid等),dubbo是使用atomiclong從0開始累計數字的

將打包的方法呼叫資訊(如呼叫的介面名稱,方法名稱,引數值列表等),和處理結果的**物件callback,全部封裝在一起,組成乙個物件object

向專門存放呼叫資訊的全域性concurrenthashmap裡面put(id, object)

將id和打包的方法呼叫資訊封裝成一物件connrequest,使用iosession.write(connrequest)非同步傳送出去

當前執行緒再使用callback的get()方法試圖獲取遠端返回的結果,在get()內部,則使用synchronized獲取**物件callback的鎖, 再先檢測是否已經獲取到結果,如果沒有,然後呼叫callback的wait()方法,釋放callback上的鎖,讓當前執行緒處於等待狀態。

服務端接收到請求並處理後,將結果(此結果中包含了前面的id,即回傳)傳送給客戶端,客戶端socket連線上專門監聽訊息的執行緒收到訊息,分析結果,取到id,再從前面的concurrenthashmap裡面get(id),從而找到callback,將方法呼叫結果設定到callback物件裡。

監聽執行緒接著使用synchronized獲取**物件callback的鎖(因為前面呼叫過wait(),那個執行緒已釋放callback的鎖了),再notifyall(),喚醒前面處於等待狀態的執行緒繼續執行(callback的get()方法繼續執行就能拿到呼叫結果了),至此,整個過程結束。

思考

了解了前面的原理部分,思考幾個問題考察一下自己是否真的懂了.

1. 當前執行緒怎麼讓它「暫停」,等結果回來後,再向後執行?

答:先生成乙個物件obj,在乙個全域性map裡put(id,obj)存放起來,再用synchronized獲取obj鎖,再呼叫obj.wait()讓當前執行緒處於等待狀態,然後另一訊息監聽執行緒等到服 務端結果來了後,再map.get(id)找到obj,再用synchronized獲取obj鎖,再呼叫obj.notifyall()喚醒前面處於等待狀態的執行緒。

【後面這句是廢話】回想之前做專案時,需在前台呼叫某一服務(該服務要求在後一服務前發生),當時還不懂dubbo,以為呼叫服務及其相應的行為都是同步的,沒有使用巢狀,結果導致**邏輯未達到預期設想。

2. socket通訊是乙個全雙工的方式,如果有多個執行緒同時進行遠端方法呼叫,這時建立在client server之間的socket連線上會有很多雙方傳送的訊息傳遞,前後順序也可能是亂七八糟的,server處理完結果後,將結果訊息傳送給client,client收到很多訊息,怎麼知道哪個訊息結果是原先哪個執行緒呼叫的?

答:使用乙個id,讓其唯一,然後傳遞給服務端,再服務端又回傳回來,這樣就知道結果是原先哪個執行緒的了。

Dubbo的配置使用及原理

1.dubbo簡介 dubbo 是一款微服務開發框架,它提供了 rpc通訊 與 微服務治理 兩大關鍵能力。這意味著,使用 dubbo 開發的微服務,將具備相互之間的遠端發現與通訊能力,同時利用 dubbo 提供的豐富服務治理能力,可以實現諸如服務發現 負載均衡 流量排程等服務治理訴求。同時 dubb...

Dubbo底層採用Socket進行通訊詳解

基本的通訊方法有並行通訊和序列通訊兩種。1.一組資訊 通常是位元組 的各位資料被同時傳送的通訊方法稱為並行通訊。並行通訊依靠並行i o介面實現。並行通訊速度快,但傳輸線根數多,只適用於近距離 相距數公尺 的通訊。2.一組資訊的各位資料被逐位順序傳送的通訊方式稱為序列通訊。序列通訊可通過序列介面來實現...

dubbo使用原理

dubbo是阿里巴巴公司開放源 的高效能優秀的伺服器框架,使得應用可通過高效能的rpc實現服務的輸入和輸出功能,可以與spring進行繼承。上述的工作原理 provider 暴露服務方稱之為 服務提供者 consumer 呼叫遠端服務 方稱之為 服務消費者 registry 服務註冊與發現的中心目錄...