背景gRPC是google開源的高性能跨語言的RPC方案。gRPC的設(shè)計(jì)目標(biāo)是在任何環(huán)境下運(yùn)行,支持可插拔的負(fù)載均衡,跟蹤,運(yùn)行狀況檢查和身份驗(yàn)證。它不僅支持?jǐn)?shù)據(jù)中心內(nèi)部和跨數(shù)據(jù)中心的服務(wù)調(diào)用,它也適用于分布式計(jì)算的最后一公里,將設(shè)備,移動(dòng)應(yīng)用程序和瀏覽器連接到后端服務(wù)。
GRPC設(shè)計(jì)的動(dòng)機(jī)和原則
個(gè)人覺得官方的文章令人印象深刻的點(diǎn):
HTTP/2是什么在正式討論gRPC為什么選擇HTTP/2之前,我們先來簡單了解下HTTP/2。 HTTP/2可以簡單用一個(gè)圖片來介紹:來自:https:/// 可以看到:
在Chrome瀏覽器里,打開 gRPC over HTTP/2準(zhǔn)確來說gRPC設(shè)計(jì)上是分層的,底層支持不同的協(xié)議,目前gRPC支持:
但是大多數(shù)情況下,討論都是基于gRPC over HTTP2。 下面從一個(gè)真實(shí)的gRPC 可以看到下面這些Header:
然后請(qǐng)求的參數(shù)在DATA frame里:
簡而言之,gGRPC把元數(shù)據(jù)放到HTTP/2 Headers里,請(qǐng)求參數(shù)序列化之后放到 DATA frame里。 基于HTTP/2 協(xié)議的優(yōu)點(diǎn)HTTP/2 是一個(gè)公開的標(biāo)準(zhǔn)Google本身把這個(gè)事情想清楚了,它并沒有把內(nèi)部的Stubby開源,而是選擇重新做?,F(xiàn)在技術(shù)越來越開放,私有協(xié)議的空間越來越小。 HTTP/2 是一個(gè)經(jīng)過實(shí)踐檢驗(yàn)的標(biāo)準(zhǔn)HTTP/2是先有實(shí)踐再有標(biāo)準(zhǔn),這個(gè)很重要。很多不成功的標(biāo)準(zhǔn)都是先有一大堆廠商討論出標(biāo)準(zhǔn)后有實(shí)現(xiàn),導(dǎo)致混亂而不可用,比如CORBA。HTTP/2的前身是Google的SPDY,沒有Google的實(shí)踐和推動(dòng),可能都不會(huì)有HTTP/2。 HTTP/2 天然支持物聯(lián)網(wǎng)、手機(jī)、瀏覽器實(shí)際上先用上HTTP/2的也是手機(jī)和手機(jī)瀏覽器。移動(dòng)互聯(lián)網(wǎng)推動(dòng)了HTTP/2的發(fā)展和普及。 基于HTTP/2 多語言客戶端實(shí)現(xiàn)容易只討論協(xié)議本身的實(shí)現(xiàn),不考慮序列化。
HTTP/2支持Stream和流控在業(yè)界,有很多支持stream的方案,比如基于websocket的,或者rsocket。但是這些方案都不是通用的。 HTTP/2里的Stream還可以設(shè)置優(yōu)先級(jí),盡管在rpc里可能用的比較少,但是一些復(fù)雜的場景可能會(huì)用到。 基于HTTP/2 在Gateway/Proxy很容易支持
HTTP/2 安全性有保證
HTTP/2 鑒權(quán)成熟
比如傳統(tǒng)的rpc dubbo,需要寫一個(gè)dubbo filter,還要考慮把鑒權(quán)相關(guān)的信息通過thread local傳遞進(jìn)去。rpc協(xié)議本身也需要支持??傊?,非常復(fù)雜。實(shí)際上絕大部分公司里的rpc都是沒有鑒權(quán)的,可以隨便調(diào)。 基于HTTP/2 的缺點(diǎn)
gRPC選擇基于HTTP/2,那么它的性能肯定不會(huì)是最頂尖的。但是對(duì)于rpc來說中庸的qps可以接受,通用和兼容性才是最重要的事情。
Google制定標(biāo)準(zhǔn)的能力近10年來,Google制定標(biāo)準(zhǔn)的能力越來越強(qiáng)。下面列舉一些標(biāo)準(zhǔn):
當(dāng)然google也并不都會(huì)成功,很多事情它想推也失敗了,比如Chrome的Native Client。 gRPC目前是k8s生態(tài)里的事實(shí)標(biāo)準(zhǔn)。 gRPC是否會(huì)成為更多地方,更大領(lǐng)域的RPC標(biāo)準(zhǔn)? 為什么會(huì)出現(xiàn)gRPC準(zhǔn)確來說為什么會(huì)出現(xiàn)基于HTTP/2的RPC? 個(gè)人認(rèn)為一個(gè)重要的原因是,在Cloud Native的潮流下,開放互通的需求必然會(huì)產(chǎn)生基于HTTP/2的RPC。即使沒有g(shù)RPC,也會(huì)有其它基于HTTP/2的RPC。 gRPC在Google的內(nèi)部也是先用在Google Cloud Platform和公開的API上:https://opensource.google.com/projects/grpc 盡管gRPC它可能替換不了內(nèi)部的RPC實(shí)現(xiàn),但是在開放互通的時(shí)代,不止在k8s上,gRPC會(huì)有越來越多的舞臺(tái)可以施展。 |
|