在C#中使用gRPC及protobuf简介

来源:互联网 发布:传染病监测数据分析 编辑:程序博客网 时间:2024/06/05 18:34

简介

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的形式。

生成的库

插件grpc的服务端

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

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

  • 实现服务API

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

  class gRPCImpl : gRPC.gRPCBase    {        // 实现SayHello方法        public override Task<HelloReply> 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一致。

执行测试

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

原创粉丝点击