dubbo 回聲測試 泛化呼叫 RPC呼叫原理

2021-10-07 12:46:50 字數 2246 閱讀 4902

檢測服務是否可用,dubbo獲取的所有服務**物件都實現了echoservice介面,用於監控

**實現

如果沒問題返回ok字串否則丟擲異常

輸出結果

當provider發布了某個介面a,但consumer不知道這個介面a具體內容,但直到其中某個方法時,可採用泛化呼叫(但不推薦,影響透明化),跨越了消費端的**物件

在消費端引用介面時開啟

<

dubbo:referenceid=

"hystrixservice"

inte***ce

="com.sdcuike.dubbo.learning.service.hystrixservice"

generic

="true"

retries

="0"

/>

generic="true"這個就是用來表示當前介面是泛化呼叫的

**中呼叫時

//獲取上下文

new(

newstring

);//獲取bean,強轉成genericservice(這是乙個**物件,dubbo定義的)

genericservice hystrixservice=

(genericservice) context.

getbean

("hystrixservice"

)//呼叫方法,這裡第乙個引數是方法名,第二個是引數型別,第三個是實際入參

object result = hystrixservice.$invoke

("testgenerre"

,new

string

,new

object

);

1、問題:若泛化呼叫服務消費端先啟動,在服務提供端未啟動之前,泛化呼叫服務消費端某介面(a)進行了一次呼叫,在後續即使服務提供端成功啟動,泛化呼叫服務消費端依然不能正常訪問某介面(a)

2、原因:因為referenceconfig例項很重,封裝了與註冊中心的連線以及與提供者的連線,需要快取,否則重複生成referenceconfig可能造成效能問題並且會有記憶體和連線洩漏。所以在呼叫服務時,不論服務提供端介面服務是否存在,referenceconfigcache都會快取referenceconfig例項(若呼叫服務提供端不存在,referenceconfig例項的ref引數為空,即不能生成genericservice物件),再下次請求時,即使服務提供端正常提供服務,但因為referenceconfigcache已經快取了referenceconfig例項,所以不會再重新建立鏈結,直接從referenceconfigcach快取中獲取genericservice物件,導致genericservice例項一直報空指標(因為ref引數為空),最終導致一直呼叫不到真正的服務

3、處理方法:在genericservice物件呼叫方法($invoke)之前,先判斷genericservice是否為空,若為空,則呼叫referenceconfigcache物件的destroy方法,下次呼叫時即會重新生成referenceconfig例項,不會再從快取中取。

rpc是一種協議,客戶端生成**物件,服務端暴露中轉物件,網路中使用rmi或者socket等協議都可以

服務方建立中轉物件(原始碼)

主動暴露(手寫)

消費端建立**物件

dubbo的泛化呼叫研究

結論 泛化呼叫需要繼承乙個類,在配置檔案裡需要明確指出generic true 泛化呼叫在書寫provider 時,變化不大 泛化呼叫和普通呼叫的區別主要在consumer,從 呼叫 的表面意思也能看到端倪 泛化呼叫書寫客戶端時,不需要明確繼承和服務端相同的介面 使用泛化呼叫結合jmeter打壓,也...

dubbo的泛化呼叫研究

結論 泛化呼叫需要繼承乙個類,在配置檔案裡需要明確指出generic true 泛化呼叫在書寫provider 時,變化不大 泛化呼叫和普通呼叫的區別主要在consumer,從 呼叫 的表面意思也能看到端倪 泛化呼叫書寫客戶端時,不需要明確繼承和服務端相同的介面 使用泛化呼叫結合jmeter打壓,也...

Dubbo泛化呼叫閘道器初試

由於之前閘道器採用的是dubbo的rest協議,但使用一段時間發現速度有些慢,而且總感覺不如直接使用泛化呼叫來的爽,所以打算研究一下dubbo的泛化呼叫,在此記錄一下,參照了很多大神的思路,水平有限,歡迎指正。dubbo泛化呼叫的原理就不細講了,網上有很多文章,底層基於netty做資料傳輸,進行rp...