gRPC 是什麼?

Po-Ching Liu
Jul 13, 2021

gRPC是什麼 ? gRPC是一套開源的遠端程序呼叫(remote procedure call) 系統,可搭配C#、python、Go等等(支援語言),由 google在2015年提出的,其http協定是"使用http/2" (http/2是什麼?),因此傳輸速率會比http/1.1來的快,又其使用 "Protocol Bufferes作為介面定義語言(interface definition language, IDL)",因此在開發上可以更快速的在不同的語言、服務上互動。有別於一般open api使用url、http methods、參數等在client與server間互動,gRPC的IDL則更為直觀明確,"client與server端皆須使用同一份 .proto 檔案作為介面"。寫了這麼多文謅謅的字,我想還是用軟體工程師的語言表達會來的直觀些,以下我會以C# .net core 3為example試著解釋給大家聽。

http/2 為協定

Binary framing layer (二進制影格層)、Server push (伺服器推送)、Header compression (標頭壓縮)、Request and response multiplexing (多路複用)皆為http/2協定的基本feature,目的則是為了加速http request傳輸的效率(http/2是什麼?)。

在.net core 3中,若要使用gRPC則需先安裝下述三個套件(nuget)
1. Grpc.Net.Client
2. Google.Protobuf
3. Grpc.Tools

安裝好後,可以新增Protos folder作為分類,並且新增副檔名為 .proto的檔案,此檔案就是以Protocol Buffers 作為IDL。

Protocol Buffers 作為介面定義語言(interface definition language, IDL)

由上述圖片可以看到,greet.proto檔案中清楚定義了
1. request跟response物件(包含型態)。
2. rpc (同於open api的end point概念)。
當然,同一個檔案可以定義多個request、response、rpc,此檔案可以共用於client與server,並可以直接讓你的IDE產生並調用。

client與server端皆須使用同一份 .proto 檔案作為介面

在client中,準備同樣的 .proto檔案,可以直接使用.net core gRPC套件產生的code調用對應server的rpc接口,如下圖。

經由上圖可知,透過注入可以直接拿到 gRPC對應的client instance,這樣的功能等價於open api 發一個http的request到server。

心得

在這個 microservice 的時代中,我們很常會將服務切割為一個一個service並以http作為溝通,筆者認為gRPC其優點不僅止於其protocal建構在http/2 上傳輸速率快,而是在於內部網路,服務與服務互call的開發效率高。試想,傳統上要發起http request 你要看提供api端的 http methods、他的參數要怎麼調用等。在gRPC基礎上你只需要client與server 維護同樣的一份 .proto 檔案,省時又省力,傳輸速率又快。不過若與第三方介接就要看對方有沒有提供gRPC這樣的接口囉~

--

--