HTTP和RPC概念


HTTP就是一種RPC,

只要是遠程調用都可以叫RPC,和是不是通過http沒什么關系。

 

http好比普通話,rpc好比團伙內部黑話。

講普通話,好處就是誰都聽得懂,誰都會講。

講黑話,好處是可以更精簡、更加保密、更加可定制,壞處就是要求“說”黑話的那一方(client端)也要懂,而且一旦大家都說一種黑話了,換黑話就困難了。
 
 
這個回答里恰巧講了一些rpc通信協議的細節,但是強調一遍通信協議不是rpc最重要的部分,不要被這個回答帶偏了。如果要了解rpc請更多的去了解服務治理(soa)的一些基本策略,推薦去看看dubbo的文檔。

首先 http 和 rpc 並不是一個並行概念。

rpc是遠端過程調用,其調用協議通常包含傳輸協議和序列化協議。

傳輸協議包含: 如著名的 [gRPC](grpc / grpc.io) 使用的 http2 協議,也有如dubbo一類的自定義報文的tcp協議。

序列化協議包含: 如基於文本編碼的 xml json,也有二進制編碼的 protobuf hessian等。

因此我理解的你想問的問題應該是:為什么要使用自定義 tcp 協議的 rpc 做后端進程通信?

要解決這個問題就應該搞清楚 http 使用的 tcp 協議,和我們自定義的 tcp 協議在報文上的區別。

首先要否認一點 http 協議相較於自定義tcp報文協議,增加的開銷在於連接的建立與斷開。http協議是支持連接池復用的,也就是建立一定數量的連接不斷開,並不會頻繁的創建和銷毀連接。二一要說的是http也可以使用protobuf這種二進制編碼協議對內容進行編碼,因此二者最大的區別還是在傳輸協議上。

通用定義的http1.1協議的tcp報文包含太多廢信息,一個POST協議的格式大致如下

HTTP/1.0 200 OK 
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84

<html>
  <body>Hello World</body>
</html>

 

 

即使編碼協議也就是body是使用二進制編碼協議,報文元數據也就是header頭的鍵值對卻用了文本編碼,非常占字節數。如上圖所使用的報文中有效字節數僅僅占約 30%,也就是70%的時間用於傳輸元數據廢編碼。當然實際情況下報文內容可能會比這個長,但是報頭所占的比例也是非常可觀的。

那么假如我們使用自定義tcp協議的報文如下

報頭占用的字節數也就只有16個byte,極大地精簡了傳輸內容。

這也就是為什么后端進程間通常會采用自定義tcp協議的rpc來進行通信的原因。

 

所謂的效率優勢是針對http1.1協議來講的,http2.0協議已經優化編碼效率問題,像grpc這種rpc庫使用的就是http2.0協議。這么來說吧http容器的性能測試單位通常是kqps,自定義tpc協議則通常是以10kqps到100kqps為基准

簡單來說成熟的rpc庫相對http容器,更多的是封裝了“服務發現”,"負載均衡",“熔斷降級”一類面向服務的高級特性。可以這么理解,rpc框架是面向服務的更高級的封裝。如果把一個http servlet容器上封裝一層服務發現和函數代理調用,那它就已經可以做一個rpc框架了。

所以為什么要用rpc調用?

因為良好的rpc調用是面向服務的封裝,針對服務的可用性和效率等都做了優化。單純使用http調用則缺少了這些特性。

 

 

參考  https://www.zhihu.com/question/41609070/answer/191965937


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM