本文借用dubbo.learn的dubbo api方式來解釋原理。
服務消費端泛化呼叫
前面我們講解到,基於spring和基於dubbo api方式搭建簡單的分布式系統時,服務消費端引入了乙個sdk二方包,裡面存放著服務提供端提供的所有介面類,之所以需要引入介面類是因為服務消費端一般是基於介面使用jdk**實現遠端呼叫的。
泛化介面呼叫方式主要在服務消費端沒有api介面類及模型類元(比如入參和出參的pojo類)的情況下使用。其引數及返回值中沒有對應的pojo類,所以所有pojo均轉換為map表示。使用泛化呼叫時候服務消費模組不再需要引入sdk二方包。
下面基於dubbo api實現非同步呼叫,在consumer模組裡面testconsumerapigeneric是泛化呼叫的方式,**如下:
public上面**中,由於sayhello的引數是string,沒有很好的體現引數轉換為map,下面我們具體來說下pojo引數轉換map的含義。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));
}
}
比如服務提供者提供的乙個介面的 testpojo(person person) 方法的引數為如下所示:
package則pojo資料:com.test;
public
class personimpl implements
person
public
void
setname(string name)
public
string getpassword()
public
void
setpassword(string password)
}
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...