gRPC由google開發,是一款語言中立、平台中立、開源的遠端過程調用系統
gRPC用戶端和服務端可以在多種環境中運作和互動,例如用java寫一個服務端,可以用go語言寫用戶端調用
微服務架構中,由于每個服務對應的代碼庫是獨立運作的,無法直接調用,彼此間的通信就是個大問題
gRPC可以實作微服務,将大的項目拆分為多個小且獨立的業務子產品,也就是服務,各服務間使用高效的protobuf協定進行RPC調用,gRPC預設使用protocol buffers,這是* * * google開源的一套成熟的結構資料序列化機制(當然也可以使用其他資料格式如JSON)
可以用proto files建立gRPC服務,用message類型來定義方法參數和傳回類型
安裝protobuf
<code>go get github.com/golang/protobuf/proto</code>
安裝grpc
<code>go get google.golang.org/grpc</code>
安裝protoc-gen-go.exe
<code>go get github.com/golang/protobuf/protoc-gen-go</code>
上面安裝好後,會在GOPATH/bin下生成protoc-gen-go.exe
安裝protoc.exe
<code>https://github.com/protocolbuffers/protobuf/releases/tag/v3.19.1</code>
下載下傳後解壓,然後将解壓的protoc.exe同樣放在GOPATH/bin下
gRPC 是一個高性能、開源、通用的RPC架構,由Google推出,基于HTTP2協定标準設計開發,預設采用Protocol Buffers資料序列化協定,支援多種開發語言。gRPC提供了一種簡單的方法來精确的定義服務,并且為用戶端和服務端自動生成可靠的功能庫。
在gRPC用戶端可以直接調用不同伺服器上的遠端程式,使用姿勢看起來就像調用本地程式一樣,很容易去建構分布式應用和服務。和很多RPC系統一樣,服務端負責實作定義好的接口并處理用戶端的請求,用戶端根據接口描述直接調用需要的服務。用戶端和服務端可以分别使用gRPC支援的不同語言實作。
強大的IDL
gRPC使用ProtoBuf來定義服務,ProtoBuf是由Google開發的一種資料序列化協定(類似于XML、JSON、hessian)。ProtoBuf能夠将資料進行序列化,并廣泛應用在資料存儲、通信協定等方面。
多語言支援
gRPC支援多種語言,并能夠基于語言自動生成用戶端和服務端功能庫。目前已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它語言的版本正在積極開發中,其中,grpc支援C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等語言,grpc-java已經支援Android開發。
HTTP2
gRPC基于HTTP2标準設計,是以相對于其他RPC架構,gRPC帶來了更多強大功能,如雙向流、頭部壓縮、多複用請求等。這些功能給移動裝置帶來重大益處,如節省帶寬、降低TCP連結次數、節省CPU使用和延長電池壽命等。同時,gRPC還能夠提高了雲端服務和Web應用的性能。gRPC既能夠在用戶端應用,也能夠在伺服器端應用,進而以透明的方式實作用戶端和伺服器端的通信和簡化通信系統的建構。
按照慣例,這裡也從一個Hello項目開始,本項目定義了一個Hello Service,用戶端發送包含字元串名字的請求,服務端傳回Hello消息。
流程:
編寫.proto描述檔案
編譯生成.pb.go檔案
服務端實作約定的接口并提供服務
用戶端按照約定調用.pb.go檔案中的方法請求服務
項目結構:
hello.proto檔案中定義了一個Hello Service,該服務包含一個SayHello方法,同時聲明了HelloRequest和HelloResponse消息結構用于請求和響應。用戶端使用HelloRequest參數調用SayHello方法請求服務端,服務端響應HelloResponse消息。一個最簡單的服務就定義好了。
在目前目錄内生成的hello.pb.go檔案,按照.proto檔案中的說明,包含服務端接口HelloServer描述,用戶端接口及實作HelloClient,及HelloRequest、HelloResponse結構體。
注意:<code>不要手動編輯該檔案</code>
點選檢視代碼
服務端引入編譯後的proto包,定義一個空結構用于實作約定的接口,接口描述可以檢視hello.pb.go檔案中的HelloServer接口描述。執行個體化grpc Server并注冊HelloService,開始提供服務。
運作:
用戶端初始化連接配接後直接調用hello.pb.go中實作的SayHello方法,即可向服務端發起請求,使用姿勢就像調用本地方法一樣。
```
$ go run main.go
Hello gRPC. // 接收到服務端響應
如果你收到了"Hello gRPC"的回複, grpc遠端過程調用成功了。