Dubbo學習筆記4 服務消費端泛化呼叫與非同步呼叫

2022-07-16 23:15:16 字數 2412 閱讀 6463

本文借用dubbo.learn的dubbo api方式來解釋原理。

服務消費端泛化呼叫

前面我們講解到,基於spring和基於dubbo api方式搭建簡單的分布式系統時,服務消費端引入了乙個sdk二方包,裡面存放著服務提供端提供的所有介面類,之所以需要引入介面類是因為服務消費端一般是基於介面使用jdk**實現遠端呼叫的。

泛化介面呼叫方式主要在服務消費端沒有api介面類及模型類元(比如入參和出參的pojo類)的情況下使用。其引數及返回值中沒有對應的pojo類,所以所有pojo均轉換為map表示。使用泛化呼叫時候服務消費模組不再需要引入sdk二方包。

下面基於dubbo api實現非同步呼叫,在consumer模組裡面testconsumerapigeneric是泛化呼叫的方式,**如下:

public

class

testconsumerapigeneric(),new object);

system.out.println(json.json(result));

//pojo引數轉換為map

mapmap = new hashmap();

map.put("class","com.test.personimpl");

map.put("name","jiaduo");

map.put("password","password");

result = userservice.$invoke("testpojo",new string,new

object);

system.out.println((result));

}

}

上面**中,由於sayhello的引數是string,沒有很好的體現引數轉換為map,下面我們具體來說下pojo引數轉換map的含義。

比如服務提供者提供的乙個介面的 testpojo(person person) 方法的引數為如下所示:

package

com.test;

public

class personimpl implements

person

public

void

setname(string name)

public

string getpassword()

public

void

setpassword(string password)

}

則pojo資料:

person person = new

personimpl();

person.setname("jiaduo");

person.setpassword("password");

正常情況下呼叫介面是使用:

serviceperson.testpojo(person);
泛化呼叫下需要首先轉換person為map,如下表示:

mapmap = new hashmap();

//注意:如果引數型別是介面,或者list等丟失泛型,可通過class屬性指定型別。

map.put("class","com.test.personimpl");

map.put("name","jiaduo");

map.put("password","password");

然後使用下面方法進行泛化呼叫:

serviceperson.$invoke("testpojo",new string,new object);
泛化呼叫通常用於框架整合,比如:實現乙個通用的服務測試框架,可通過genericservice呼叫所有服務實現,而不需要依賴服務實現方提供的介面類以及介面的入參和出參的pojo類。

服務消費端非同步呼叫

無論前面我們講解的正常呼叫還是泛化呼叫,都是同步呼叫,也就是服務消費方發起乙個遠端呼叫後,呼叫執行緒要被阻塞掛起,直到服務提供方返回。

本節講解下服務消費端非同步呼叫,非同步呼叫是指服務消費方發起乙個遠端呼叫後,不等服務提供方返回結果,呼叫方法就返回了,也就是當前執行緒不會被阻塞,這就允許呼叫方同時呼叫多個遠端方法。

在consumer模組裡面testconsumerasync是泛化呼叫,**如下:

public

class

testconsumerasync

}

執行上面**,輸出如下圖所示:

其中**(2)(3)處輸出null,說明開啟非同步呼叫後呼叫方直接返回null。

輸出costs:2說明非同步呼叫生效了,因為sayhello和sayhello2方法內都sleep了2s,如果是順序呼叫則會耗時至少4s,這裡耗時2s說明兩次呼叫是併發進行的。

非同步呼叫是基於nio的非阻塞實現並行呼叫,客戶端不需要啟動多執行緒即可完成並行呼叫多個遠端服務,相對呼叫不同的服務使用不同執行緒來說開銷較小。  

Dubbo 消費端服務併發控制

二.原始碼分析 三.使用 原始碼說明 該類表示提供端服務介面 包括介面中所有服務方法 消費端服務介面 包括介面中所有服務方法 的當前呼叫次數 總數 失敗數 呼叫間隔等狀態資訊 中有詳細注釋,重點關注begincount方法 endcount方法 service statistics method s...

SpringCloud學習筆記 服務消費

在前文中我們已經搭建了高可用的註冊中心,並向註冊中心註冊了兩個服務,hello service,現在已經有了服務的提供方,那麼自然也要有服務的消費方,這篇文章就來搭建乙個服務消費者,可以發現並且消費服務。服務的發現是由eureka的客戶端完成的,而服務的消費是由ribbon完成的。ribbon是乙個...

DUBBO學習筆記

1 該例子是spring整合dubbo,spring包有點問題 2 3 springboot整合dubb,可以執行 2 zookeeper安裝 1 server.port 8082 5 dubbo是面向介面呼叫的,該介面被實現後註冊到zookeeper上 spring配置檔案中配置了zookeepe...