gRPC 和 C#


前些天gRPC 發布1.0 版本,代表着gRPC 已經正式進入穩定階段。 

今天我們就來學習gRPC C# 。而且目前也已經支持.NET Core 可以實現完美跨平台。

傳統的.NET 可以通過Mono 來實現跨平台調用。

GitHub: https://github.com/grpc/grpc

gRPC 簡單介紹:

gRPC是一個高性能、通用的開源RPC框架,其由Google主要面向移動應用開發並基於HTTP/2協議標准而設計,基於ProtoBuf(Protocol Buffers)序列化協議開發,且支持眾多開發語言。gRPC提供了一種簡單的方法來精確地定義服務和為iOS、Android和后台支持服務自動生成可靠性很強的客戶端功能庫。客戶端充分利用高級流和鏈接功能,從而有助於節省帶寬、降低的TCP鏈接次數、節省CPU使用、和電池壽命。

gRPC支持多種語言,並能夠基於語言自動生成客戶端和服務端功能庫。目前,在GitHub上已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它語言的版本正在積極開發中,其中 grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等語言,grpc-java已經支持Android開發。

gRPC已經應用在Google的雲服務和對外提供的API中,其主要應用場景如下:

低延遲、高擴展性、分布式的系統
同雲服務器進行通信的移動應用客戶端
設計語言獨立、高效、精確的新協議
便於各方面擴展的分層設計,如認證、負載均衡、日志記錄、監控等

參考文檔:

http://www.infoq.com/cn/news/2015/03/grpc-google-http2-protobuf

本篇文章主要講解傳統.NET 應用如何支持gRPC。

下面就正式開始。

新建項目

首先我們創建一個gRPCDemo 的類庫。

然后添加兩個控制台應用程序 gRPCServer gRPCClient。

最終項目結構如下:

定義服務

建好項目以后我們來定義服務

這里我們在gRPCDemo 項目里添加一個 helloworld.proto 內容如下:

下面主要定義一個gRPC 的服務里面有個 SayHello rpc 方法

復制代碼
syntax = "proto3";
package gRPCDemo;
service gRPC {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}
復制代碼

使用Grpc.Tools生成代碼

定義好服務以后我們就可以來生成代碼了。

首先需要添加引用:

在每個項目中添加上Grpc 及 Google.Protobuf 

Install-Package Grpc
Install-Package Google.Protobuf

然后在gRPCDemo 項目中再添加上工具 Grpc.Tools

NuGet 命令行:

Install-Package Grpc.Tools

然后在命令行執行以下命令,注意執行命令的目錄為packages 的上層目錄

 

packages\Grpc.Tools.1.0.0\tools\windows_x86\protoc.exe -IgRPCDemo --csharp_out gRPCDemo  gRPCDemo\helloworld.proto --grpc_out gRPCDemo --plugin=protoc-gen-grpc=packages\Grpc.Tools.1.0.0\tools\windows_x86\grpc_csharp_plugin.exe

執行完以后,在gRPCDemo 目錄下會多出Helloworld.cs 及 HelloworldGrpc.cs 類,將其包含至gRPCDemo 項目既可。

然后gRPCServer gRPCClient 分別都引用 gRPCDemo。

 

創建服務端及客戶端

下面我們來編寫服務端及客戶端

 

首先是服務端:

 Program.cs 

復制代碼
    class gRPCImpl : gRPC.gRPCBase
    {
        // 實現SayHello方法
        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
        {
            return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
        }
    }

    class Program
    {
        const int Port = 9007;

        public static void Main(string[] args)
        {
            Server server = new Server
            {
                Services = { gRPC.BindService(new gRPCImpl()) },
                Ports = { new ServerPort("localhost", Port, ServerCredentials.Insecure) }
            };
            server.Start();

            Console.WriteLine("gRPC server listening on port " + Port);
            Console.WriteLine("任意鍵退出...");
            Console.ReadKey();

            server.ShutdownAsync().Wait();
        }
    }
復制代碼

服務端需要實現SayHello 方法。

然后是客戶端 Program.cs

復制代碼
    class Program
    {
        static void Main(string[] args)
        {
            Channel channel = new Channel("127.0.0.1:9007", ChannelCredentials.Insecure);

            var client = new gRPC.gRPCClient(channel);
            var reply= client.SayHello(new HelloRequest { Name = "LineZero" });
            Console.WriteLine("來自" + reply.Message);

            channel.ShutdownAsync().Wait();
            Console.WriteLine("任意鍵退出...");
            Console.ReadKey();
        }
    }
復制代碼

然后我們將Client 和Server 都生成一下。

分別到對應的目錄執行,首先啟動gRPCServer ,然后執行gRPCClient。

成功進行通信了,實現了gRPC。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM