.NET使用gRPC

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

   三個項目GrpcClient、GrpcServer、GrpcLibrary均安裝程序包Grpc。.net

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();
        }
    }

  

測試

先啓動服務的,再啓動客戶端。

 

 

相關文章
相關標籤/搜索