前言
什麼是協議?協議可以認爲是一種語言,是一種交互的標準。比如A和B互相發手機短信。A和B必須互相知道對方手機號(IP地址),知道手機號後,全部使用漢語(協議)即可互相通信。
http即超文本傳輸協議,它是運行在TCP之上的應用層協議。http誕生之初主要是應用於WEB端內容獲取。http協議簡單快速,支持很多請求方法,如GET,POST等等;使用靈活,可以傳輸任意數據,只需要Content-Type標記即可;安全性,使用https交互,可防止數據竊取;
既然http應用這麼厲害,爲什麼還會dubbo協議?那麼dubbo協議存在的意義又是什麼?
報文格式不同
創建socketServer,因爲http是tcp之上的協議,dubbo是tcp協議進行傳輸,所以通過socketServer即可查看兩者發送數據的區別。
public static final Integer port = 8080;
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(port);
Socket accept = serverSocket.accept();
InputStreamReader reader = new InputStreamReader(accept.getInputStream());
BufferedReader bufferedReader = new BufferedReader(reader);
String str = null;
while ((str = bufferedReader.readLine())!=null){
System.out.println("----------");
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
啓動之後,通過瀏覽器發送一個簡單的http請求,比如http://localhost:8080/index.html?userName=123
這種請求是其爲常見的。
我們只是需要請求index.html,並且攜帶userName=123,即可發現,瀏覽器發送了很多數據,瀏覽器類型,cookie等等。
通過dubbo客戶端發送一個簡單的dubbo請求,比如訪問com.nacos.dubbo.service.IUserService
接口中的getUserInfo
方法並且入參爲哈哈
請求數據很明顯,http協議數據量要大很多。
傳輸方式不同
http協議是應用層協議,是一種無狀態協議,在交互之前需要進行tcp三次握手,握手成功之後進行數據傳輸。不知道大家有沒有想過,http每次傳輸都需要三次握手麼?那麼本來一個頁面那麼多http請求都需要三次握手麼?豈不是很浪費資源?
在早期的HTTP/1.0中,每次http請求都要創建一個連接,而創建連接的過程需要消耗資源和時間,爲了減少資源消耗,縮短響應時間,就需要重用連接。在後來的HTTP/1.1中,引入了重用連接的機制,就是在http請求頭中加入Connection: keep-alive來告訴對方這個請求響應完成後不要關閉,下一次咱們還用這個請求繼續交流。協議規定HTTP/1.1如果想要保持長連接,需要在請求頭中加上Connection: keep-alive,而HTTP/1.1默認是支持長連接的,有沒有這個請求頭都行。
dubbo默認使用socket長連接,即首次訪問建立連接以後,後續網絡請求使用相同的網絡通道。
總結
通過如上對比,到現在dubbo存在的意義就很明顯了,dubbo協議追求的是數據量小,小則快,協議的設計也符合dubbo框框架的理念,適用與內部服務之間的數據交互。安全性就沒有https做的那麼好,但是也不需要,畢竟dubbo協議設計的初衷就是內部使用的。
既然dubbo協議適用於服務之間的互相調用。spring cloud的feign內部爲什麼使用http協議呢?個人認爲是架構的需要吧,例如服務A是java寫的,服務B是python寫的。這個時候dubbo協議就跑不通了。只能用http這種標準協議來交互。