gRPC 簡單介紹:
grpc 是一個高性能、開源和通用的 RPC 框架,面向移動和 HTTP/2 設計。目前提供 C、Java 和 Go 語言版本,分別是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.
gRPC 基於 HTTP/2 標准設計,帶來諸如雙向流、流控、頭部壓縮、單 TCP 連接上的多復用請求等特。這些特性使得其在移動設備上表現更好,更省電和節省空間占用。
參考文檔:
http://doc.oschina.net/grpc?t=57966
新建工程GrpcClient、GrpcServer和GrpcLibrary
添加 - 新建項目 - 控制台應用 GrpcClient、GrpcServer。
添加 - 新建項目 - 類庫 GrpcLibrary。 工程中的三個項目情況如下:
使用程序包管理器控制台
安裝程序包Grpc
三個項目GrpcClient、GrpcServer、GrpcLibrary均安裝程序包Grpc。
Install-Package Grpc
安裝程序包Google.Protobuf
三個項目GrpcClient、GrpcServer、GrpcLibrary均安裝程序包Google.Protobuf 。
Install-Package Google.Protobuf
同上操作
安裝程序包Grpc.Tools
類庫GrpcLibrary安裝程序包Grpc.Tools。
Install-Package Grpc.Tools
自定義服務
在項目GrpcLibrary里添加HelloWorld.proto用以生成代碼。
syntax = "proto3"; package GrpcLibrary; service GrpcService { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
然后在命令行執行以下命令,注意執行命令的目錄為packages 的上層目錄
注意:生成協議代碼需 protoc.exe、grpc_csharp_plugin.exe工具.
在.net framework 項目下引用安裝 Grpc.Tools 會得到protoc.exe、grpc_csharp_plugin.exe,但.net core 項目引用安裝是不會下載工具到項目目錄的,所以我們需要建一個.net framework項目,
我建了個.net framework類庫執行Install-Package Grpc.Tools用於引用安裝得到工具。
獲取grpc C# 的.cs文件
從packages\Grpc.Tools.1.19.0\tools\windows_x64文件夾下復制grpc_csharp_plugin.exe,protoc.exe復制到GrpcLibrary文件夾下
在GrpcLibrary下創建1.cmd文件,輸入一下內容並保存
protoc -I . --csharp_out . --grpc_out . --plugin=protoc-gen-grpc=grpc_csharp_plugin.exe HelloWorld.proto
雙擊執行
命令執行成功后,GrpcLibrary目錄下會生成HelloWorld.cs和HelloWorldGrpc.cs。(記得包含到項目中)
最后GrpcClient、GrpcServer分別引用類庫GrpcLibrary。
服務端
class GrpcImpl : GrpcService.GrpcServiceBase { // 實現SayHello方法 public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) { return Task.FromResult(new HelloReply { Message = "Hello " + request.Name }); } } class Program { const int Port = 10007; public static void Main(string[] args) { Server server = new Server { Services = { GrpcService.BindService(new GrpcImpl()) }, Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) } }; server.Start(); Console.WriteLine("GrpcService server listening on port " + Port); Console.WriteLine("任意鍵退出..."); Console.ReadKey(); server.ShutdownAsync().Wait(); } }
客戶端
class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); Channel channel = new Channel("127.0.0.1:10007", ChannelCredentials.Insecure); var client = new GrpcService.GrpcServiceClient(channel); var input = Console.ReadLine(); var reply = client.SayHello(new HelloRequest { Name = input }); Console.WriteLine("來自" + reply.Message); channel.ShutdownAsync().Wait(); Console.WriteLine("任意鍵退出..."); Console.ReadKey(); } }
測試
先啟動服務的,再啟動客戶端。