# gRPC gRPC是什麼? --- gRPC Remote Procedure Calls是Google發起的一個開源遠端程序呼叫系統基於<span style="color:red">HTTP/2</span>協定傳輸,使用<span style="color:red">Protocol Buffers</span>作為介面描述語言 --- gRPC溝通模式 --- - **一元** - 跟一般call api方式相同,一來一往 - **伺服器串流** - server端可以一直送資料給client - client只有request一次 - **用戶端串流** - client端可以一直送資料給server - server只有resopnse一次 - **雙向串流** - server、client可以一直送資料給對方,直到結束通話 --- gRPC的介面描述語言 **proto** --- ```protobuf //第三版 syntax = "proto3"; //C#的namespace option csharp_namespace = "GrpcService"; //引用的套件,用到什麼去自行下載 //把下載的proto 放在 Protos/google/protobuf/timestamp.proto import "google/protobuf/timestamp.proto"; //定義所屬package package greet; //定義API interface service Greeter { //雙向串流 rpc StreamingBothWays (stream HelloRequest) returns (stream HelloReply); // 看stream在哪裡決定串流 } message BaccOpenListResponse { message BaccOpenList { string ServerId = 1; //時間戳 google.protobuf.Timestamp UpdateDatetime = 2; //Decimal customTypes.DecimalValue BetMoney = 3; } //陣列這列寫 repeated BaccOpenList items = 1; } ``` - <span style="color:red">寫法要注意的地方</span> - csharp_namespace可能會有引入的問題命名要注意 - 欄位的數字按照順序寫 - 欄位大駝峰(C#會有引用不到的問題) - 陣列不能set,只能AddRange(處理麻煩) - 時間的格式用timestamp - decimal暫時不支援,請參考微軟實作 - float、double會有精度問題 - guid不支援,請用string --- Server --- - 系統導入 - 把現有系統Controller的功能複製到gRPC service - 資料mapping至gRPC Model - WebApi與gRPC會同時存在 Client --- - 功能設定 - 憑證可以關閉 - 純http2可以關閉ssl - 純http2 client不用特別設定ssl - Load Balance - client可以切換多server(dns:///xxx-svc.svc) - 輪詢、第一條 - 系統導入 - HttpClient改為gRPC Client - 把資料從gRPC Model倒回Api Model gRPC的Middleware **Interceptor** --- - 伺服器攔截器 - UnaryServerHandler:攔截一元 RPC。 - ClientStreamingServerHandler:攔截用戶端串流 RPC。 - ServerStreamingServerHandler:攔截伺服器串流 RPC。 - DuplexStreamingServerHandler:攔截雙向串流 RPC。 開發上注意的點 --- - WebApi與gRPC的專案要在同一個專案會遇到的問題 - WebApi走http1 - gRPC走http2 - kestrel設定Http1AndHttp2,強制要憑證 - Local端可以用自簽憑證(dotnet內建) - K8S目前沒有憑證管理 - - 解決方法 - 調整設定,程式上版要用雙port(一個http1、一個http2) --- 效能 --- - 百家開牌紀錄 WebApi與gRPC差異 - 開牌紀錄x100 - 1次送、100次送,流量沒有差異 - Json、JsonStr(純字串)流量沒有差異 - 網路流量  測試工具 --- - **Postman**可以調整憑證是否啟用,其他強制ssl 參考連結 --- Git Sample ><https://gitlab.royal-test.com/rcg-platform/poc/grpcservicegreet> gRPC介紹 ><https://zh.wikipedia.org/zh-tw/GRPC> Http2介紹 ><https://zh.wikipedia.org/wiki/HTTP/2> Protocol Buffers介紹 ><https://zh.wikipedia.org/zh-tw/Protocol_Buffers> C#對應型別 ><https://learn.microsoft.com/zh-tw/aspnet/core/grpc/protobuf?view=aspnetcore-7.0#scalar-value-types> JSON to Protobuf ><https://json-to-proto.github.io/> gRPC Services種類 ><https://learn.microsoft.com/zh-tw/aspnet/core/grpc/basics?view=aspnetcore-7.0> Client附載平衡、通道認證ssl ><https://learn.microsoft.com/zh-tw/aspnet/core/grpc/loadbalancing?view=aspnetcore-7.0> gRPC 攔截器 ><https://learn.microsoft.com/zh-tw/aspnet/core/grpc/interceptors?view=aspnetcore-7.0> gRPC測試工具 ><https://learn.microsoft.com/zh-tw/aspnet/core/grpc/test-tools?view=aspnetcore-7.0> 為什麼要雙port ><https://learn.microsoft.com/zh-tw/aspnet/core/fundamentals/servers/kestrel/endpoints?view=aspnetcore-7.0#listenoptionsprotocols> float、double精度 ><https://github.com/grpc/grpc/issues/2227>
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up