Note: gRPC study

gRPC 是一個Google推出的RPCs(Remote Procedure Calls) 架構, 目標是高效可以到處執行, 實際上RPC從有網路以來就有各種標準與架構, 像是DCE(Distributed Computing Environment)CORBA(Common Object Request Broker Architecture)Microsoft 的DCOM (Distributed Component Object Model), 等等都是不過很多都有適用場景與環境, 這幾年網路公司的各種Service/Microservice 興起, 透過SOAP/RESTful API 做RPCs 的場景也很多, 不過一般來說因為用起來太過負擔, 所以產生了一些更高效架構的設計像是 Facebook 捐給Apache 的 ThriftApache 本來的 Avro 看了一些網路上的效能測是好像Thrift還是領先gPRC不少 , 不過我還是考慮引入gRPC在下一個工作計畫中, 基於Google還是蠻積極發展gRPC,而用protobuf (Protocol Buffers) 當作IDL(Interface Description Language) 算是它本身持續性與發展性, 同時支援的程式語言夠多,並且效能也足以應付工作需求。另外還有gRPC gateway  這東西如果要跨網/穿防火牆轉成Restful API變成是可能的

因此要來練習使用gRPC, 今天就透過 Go Quick Start 練習開始, 按照文檔建議裝好環境後

先看 helloworld.protohelloworld-gprc.png

它定義了一個 service Greeter 然後有一個 rpc 叫做 SayHello, 而傳遞的資料是HelloRequest,  裡面有一個name 的欄位, 而回傳 HelloReply 回來裡面值是 message 的字串, 全部含在 helloworld pacage 裡面, 這樣執行 protoc 去編譯, 透過 protoc-gen-go產生對應的程式碼 helloworld.pb.go

protoc -I helloworld/ helloworld/helloworld.proto –go_out=plugins=grpc:helloworld

會產生 helloworld.pb.go 的檔案裡面可以看出, 它有把資料封裝與解封的程式碼,也生出Service/Client的界面碼,  說起來有點像Android AIDL/HIDL編譯後的結果, 不過這也不奇怪因為實際上做Binder IPC也是基於一樣的構想與原理

helloworld-gogrpc.png

這時看Server 的 code 可以看出它透過RegisterGreeterServer 將server 跟跟grpc.newServer, bind在一起然後透過reflection 去映射到 SayHello func, 最後呼叫s.Serve 就完成整各Server的基本架構了
helloworld-gogrpc-server

而Client 端就更簡單, 先透過grpc.Dial 直接連上grpc的Server, 然後透過 pb.NewGreeterClient(conn) 產生GreeterClient 的實體物件, 就可以透過c.SayHello()去進行RPC執行了

helloworld-gogrpc-client.png

基本上看起就是要熟悉本來的語言架構, Golang 對我來說用的很少, 所以一些基本語法讓我要想一下在幹嘛, 其它工具會幫你完成整各架構, 還是要熟整個網路程式的架構但是gPRC幫你把其中繁雜的細節包裝起來, 其他調校還是看你對該語言開發的理解與調校能力, 不過基本上這樣應該已經省了不少事情, 尤其初期開發Prototype驗證可以快速先驗證API的可行性就好

Tips: 按照文件做SayHelloAgain 會出現那個未定義, 只是import 他是 “pb google.golang.org/grpc/examples/helloworld/helloworld" 改成  對應的本地端目錄 如"pb ../helloworld" 即可,  記得Server/Client 同時引用protoc 透過 protoc-gen-go 產生的helloworld.pb.go 所以同時要改

Reference.

廣告