在C#中使用gRPC及protobuf简介

简介

gRPC提供了很多的语言开发包,C#也可以很容易使用。结合使用protobuf及其编译器,很容易地生成了gRPC的服务stub和proxy。
在CSharp中使用gRPC和Protobuf,可以简单地使用Nuget安装grpc和protobuf的支持包。
protobuf的编译器使用各种语言的支持插件,可以创建各种语言的Message及序列化操作列,以及grpc服务定义类。这些插件有java、c#、python……。

简单示例

此示例创建一个gRPC的服务,已经调用client端。利用了protobuf定义文件和protobuf编译器来自动生成框架。

定义一个库项目

在这个库中,使用protobuf定义传递的Message,已经service的api定义。
如下的`grpchello.pb`这是一个protobuf定义文件。
syntax = "proto3";
package grpcDemo;

message HelloRequest {
   string name = 1;
}

message HelloReply {
   string message = 1;
}


service gRPC {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

接着需要使用protobuf编译器,编译准备好的protobuf定义文件,为我们生成服务定义和消息定义等各种class。

  • 先使用nuget安装grpc和protobuf包:搜索Grpc包和Google.Protobuf依赖包,这2个包在下面的server和client工程中也需要安装。
  • 这个库因为需要使用protobuf的编译器,还需要安装一个Grpc.Tools的工具包。

在安装了Grpc.Tools后,在solution目录下的packages\Grpc.Tools.1.4.1\tools\windows_x64下,包括了protoc.exe已经cs的生成插件grpc_csharp_plugin.exe。然后我们可以使用它们编译protobuf定义文件,生成cs源码了。
到protoc.exe命令的对应目录下,执行

packages\Grpc.Tools.1.4.1\tools\windows_x64\protoc.exe -IgrpcDemo --csharp_out grpcDemo   --grpc_out grpcDemo --plugin=protoc-gen-grpc=packages\Grpc.Tools.1.4.1\tools\windows_x64\grpc_csharp_plugin.exe  grpcDemo\grpchello.pb

执行后,会生成Grpchello.cs和GrpchelloGrpc.cs源码文件。将源码文件添加到工程中,然后编译好库文件。
- 在Grpchello.cs类,定义了传递的Message。
- 在GrpchelloGrpc.cs中,定义了grpc服务stub和proxy的形式。

在C#中使用gRPC及protobuf简介_第1张图片

插件grpc的服务端

现在,根据我们定义的grpc服务接口API,我们需要实现服务,为调用的客户端提供服务。

创建一个应用工程,就使用最简单的Console 应用。添加上面的库工程依赖。然后使用Nuget安装Grpc依赖。

  • 实现服务API

实现gRPC.gRPCBase类,实现我们定义的方法。

  class gRPCImpl : gRPC.gRPCBase
    {
        // 实现SayHello方法
        public override Task SayHello(HelloRequest request, ServerCallContext context)
        {
            Console.WriteLine("Get : " + request.Name);
            return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
        }
    }
  • 在应用中启动服务

使用Grpc.Core中提供的Server类,指定服务端口,和提供服务的实现类。

using Grpc.Core;

using GrpcDemo;


//....

class Program
    {
        static void Main(string[] args)
        {
            const int Port = 9007;

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

        }
    }

创建客户端

为使用grpc服务,需要一个客户端。简单地创建一个Console App应用。
然后添加Grpc依赖包,和开始的工程依赖库grpcDemo。

using Grpc.Core;
using GrpcDemo;

//....

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

            var client = new gRPC.gRPCClient(channel);
            for (int i = 0; i < 5; i++)
            {
                var reply = client.SayHello(new HelloRequest { Name = " -- client "+ i});
                Console.WriteLine("来自" + reply.Message);
            }

            channel.ShutdownAsync().Wait();
            Console.WriteLine("任意键退出...");
            Console.ReadKey();
        }
    }

如示例所示,客户端通过一个channel创建一个gRPCClient,在Channel中指定了服务地址和安全方式,client为服务的proxy。调用方式很简单,和普通的API一致。

执行测试

编译完成后,分别到服务端和客户端,启动应用,可以看到调用及结果。

你可能感兴趣的:(grpc,protobuf,C#)