云原生集成開發(fā)環(huán)境——TitanIDE
通過網(wǎng)頁在任何地方更安全、更高效地編碼2022-05-07
1205
作者:樂魚創(chuàng)新 ZHOU
REST 主導(dǎo)著現(xiàn)代 API 領(lǐng)域,尤其是在 Web 應(yīng)用場(chǎng)景。
然而,REST 并不是唯一可用的 API 架構(gòu),對(duì)于某些場(chǎng)景,gRPC/Protobuf 已占據(jù)主導(dǎo)地位。
比較 REST 和 gRPC 的文章俯拾皆是,這里亦不多贅述,只把關(guān)鍵差異述說一二:
1、REST 通?;?HTTP/1.1 構(gòu)建,它使用請(qǐng)求-響應(yīng)通信模型,這意味著無法進(jìn)行全雙工通信。REST 也可以使用 HTTP/2,但它們?nèi)匀粌H限于請(qǐng)求-響應(yīng)模型,不能利用 HTTP/2 對(duì)雙向流式通信的支持,這是瀏覽器的專屬私域。
相比之下,gRPC 使用 HTTP/2,它利用 HTTP/2 支持請(qǐng)求-響應(yīng)式通信和雙向通信。因此,gRPC 可以處理類似于 HTTP/1.1 的請(qǐng)求-響應(yīng)式交互(客戶端發(fā)送一個(gè)請(qǐng)求,服務(wù)器發(fā)送一個(gè)響應(yīng))。同時(shí),客戶端還可以支持長(zhǎng)連接,每個(gè) gRPC 調(diào)用都會(huì)打開一個(gè)新的 HTTP/2 流——也稱雙向全雙工通信。
2、對(duì)于消息的格式,REST 通常使用 json(盡管 REST 也可以承載 Protobuf),GRPC 通常搭配 Protobuf 使用。
3、從客戶端編程角度看,REST 服務(wù)對(duì) Web 天然友好,但對(duì)于微服務(wù)之間東西流量的調(diào)用,則需要為客戶端提供 SDK,否則客戶端程序員只能編寫大量直接調(diào)用 API 的無腦代碼,這對(duì)客戶端開發(fā)人員很不友好。
gRPC 恰恰相反,無需提供客戶端 SDK,gRPC 可以為多種語言自動(dòng)生成客戶端樁代碼,客戶端像調(diào)用本地函數(shù)一樣調(diào)用 gRPC 服務(wù),但 gRPC 對(duì)于 Web 應(yīng)用不友好,需要通過類似 grpc-gateway(https://github.com/grpc-ecosystem/grpc-gateway)的產(chǎn)品將 gRPC 服務(wù)轉(zhuǎn)成 REST 服務(wù),或者網(wǎng)頁中的 JavaScript 使用諸如 grpc-web 庫(kù)(https://github.com/grpc/grpc-web)直接調(diào)用 gRPC 服務(wù)。
4、從性能角度看,gRPC 數(shù)倍優(yōu)于 REST。
5、從公有云網(wǎng)關(guān)易接入性角度看。所有公有云廠商的 API 網(wǎng)關(guān)都支持 REST。但支持 gRPC 的比較少。例如,阿里云的 API 網(wǎng)關(guān)只支持 REST,騰訊云的 API 網(wǎng)關(guān)可以通過插件的方式支持 gRPC,Google Cloud 的 Apigee 原生支持 REST 和 gRPC。這意味著入口側(cè)的南北流量,REST 具有更廣泛的適用能力。
無論選 REST 還是 gRPC,面向資源的設(shè)計(jì)理念都同樣適用、都同樣重要。
例如,下面的 proto 定義,通過 option (google.api.http) 設(shè)置 gRPC 方法和 REST 接口之間的映射關(guān)系,借助 protoc 的 protoc-gen-grpc-gateway 插件生成 REST 代碼,從而使通過 proto 定義的接口可以同時(shí)支持 REST 和 gRPC 兩種協(xié)議。
該 proto 遵循面向資源的設(shè)計(jì)理念,抽象出組織(organization)和項(xiàng)目(project),并按 /v1/organizations/{organization}/projects/{project} 的方式組織資源。
面向資源的 API 設(shè)計(jì)按以下步驟展開:
1、確定資源的類型
2、確定資源之間的關(guān)系
3、確定資源的名稱
4、確定資源的結(jié)構(gòu)(schema)
5、給資源附加最小的方法集
深入看一下創(chuàng)建 project 的設(shè)計(jì):
通過 gRPC 創(chuàng)建 project 的過程是:首先創(chuàng)建 CreateProjectRequest struct 對(duì)象,然后調(diào)用 CreateProject 方法。
等價(jià)的 REST 調(diào)用是:創(chuàng)建 CreateProjectRequest json 對(duì)象,通過 POST 方法訪問 /v1/organizations/{organization}/projects。