gRPC 簡單介紹:java
grpc 是一個高性能、開源和通用的 RPC 框架,面向移動和 HTTP/2 設計。目前提供 C、Java 和 Go 語言版本,分別是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.windows
gRPC 基於 HTTP/2 標準設計,帶來諸如雙向流、流控、頭部壓縮、單 TCP 鏈接上的多複用請求等特。這些特性使得其在移動設備上表現更好,更省電和節省空間佔用。框架
參考文檔:ide
http://doc.oschina.net/grpc?t=57966工具
添加 - 新建項目 - 控制檯應用 GrpcClient、GrpcServer。性能
添加 - 新建項目 - 類庫 GrpcLibrary。 工程中的三個項目狀況以下: 測試
三個項目GrpcClient、GrpcServer、GrpcLibrary均安裝程序包Grpc。.net
Install-Package Grpc
三個項目GrpcClient、GrpcServer、GrpcLibrary均安裝程序包Google.Protobuf 。命令行
Install-Package Google.Protobuf
同上操做設計
類庫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(); } }
先啓動服務的,再啓動客戶端。