為什么還要用rpc調(diào)用?
首先 http 和 rpc 并不是一個(gè)并行概念。
rpc是遠(yuǎn)端過(guò)程調(diào)用,其調(diào)用協(xié)議通常包含傳輸協(xié)議和序列化協(xié)議。
傳輸協(xié)議包含: 如著名的 [gRPC](grpc / grpc.io) 使用的 http2 協(xié)議,也有如dubbo一類(lèi)的自定義報(bào)文的tcp協(xié)議。
序列化協(xié)議包含: 如基于文本編碼的 xml json,也有二進(jìn)制編碼的 protobuf hessian等。
因此我理解的你想問(wèn)的問(wèn)題應(yīng)該是:為什么要使用自定義 tcp 協(xié)議的 rpc 做后端進(jìn)程通信?
要解決這個(gè)問(wèn)題就應(yīng)該搞清楚 http 使用的 tcp 協(xié)議,和我們自定義的 tcp 協(xié)議在報(bào)文上的區(qū)別。
首先要否認(rèn)一點(diǎn) http 協(xié)議相較于自定義tcp報(bào)文協(xié)議,增加的開(kāi)銷(xiāo)在于連接的建立與斷開(kāi)。http協(xié)議是支持連接池復(fù)用的,也就是建立一定數(shù)量的連接不斷開(kāi),并不會(huì)頻繁的創(chuàng)建和銷(xiāo)毀連接。二一要說(shuō)的是http也可以使用protobuf這種二進(jìn)制編碼協(xié)議對(duì)內(nèi)容進(jìn)行編碼,因此二者最大的區(qū)別還是在傳輸協(xié)議上。
HTTP有用信息占比少,畢竟HTTP工作在第七層,包含了大量的HTTP頭等信息。其次是效率低,還是因?yàn)榈谄邔拥木壒省_€有,其可讀性似乎沒(méi)有必要,因?yàn)槲覀兛梢砸刖W(wǎng)關(guān)增加可讀性。此外,使用HTTP協(xié)議調(diào)用遠(yuǎn)程方法比較復(fù)雜,要封裝各種參數(shù)名和參數(shù)值。
通用定義的http1.1協(xié)議的tcp報(bào)文包含太多廢信息,一個(gè)POST協(xié)議的格式大致如下:
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>
即使編碼協(xié)議也就是body是使用二進(jìn)制編碼協(xié)議,報(bào)文元數(shù)據(jù)也就是header頭的鍵值對(duì)卻用了文本編碼,非常占字節(jié)數(shù)。如上圖所使用的報(bào)文中有效字節(jié)數(shù)僅僅占約 30%,也就是70%的時(shí)間用于傳輸元數(shù)據(jù)廢編碼。當(dāng)然實(shí)際情況下報(bào)文內(nèi)容可能會(huì)比這個(gè)長(zhǎng),但是報(bào)頭所占的比例也是非常可觀的。
那么假如我們使用自定義tcp協(xié)議的報(bào)文如下:
報(bào)頭占用的字節(jié)數(shù)也就只有16個(gè)byte,極大地精簡(jiǎn)了傳輸內(nèi)容,采用自定義tcp協(xié)議的rpc來(lái)進(jìn)行通信減少了通訊內(nèi)容,可以提高通訊效率。
所謂的效率優(yōu)勢(shì)是針對(duì)http1.1協(xié)議來(lái)講的,http2.0協(xié)議已經(jīng)優(yōu)化編碼效率問(wèn)題,像grpc這種rpc庫(kù)使用的就是http2.0協(xié)議。這么來(lái)說(shuō)吧http容器的性能測(cè)試單位通常是kqps,自定義tpc協(xié)議則通常是以10kqps到100kqps為基準(zhǔn)
簡(jiǎn)單來(lái)說(shuō)成熟的rpc庫(kù)相對(duì)http容器,更多的是封裝了“服務(wù)發(fā)現(xiàn)”,"負(fù)載均衡",“熔斷降級(jí)”一類(lèi)面向服務(wù)的高級(jí)特性。可以這么理解,rpc框架是面向服務(wù)的更高級(jí)的封裝。如果把一個(gè)http servlet容器上封裝一層服務(wù)發(fā)現(xiàn)和函數(shù)代理調(diào)用,那它就已經(jīng)可以做一個(gè)rpc框架了。
所以為什么要用rpc調(diào)用?因?yàn)榱己玫膔pc調(diào)用是面向服務(wù)的封裝,針對(duì)服務(wù)的可用性和效率等都做了優(yōu)化。單純使用http調(diào)用則缺少了這些特性。