您的位置:首页 > 编程语言 > C#

在C#中使用gRPC及protobuf简介

2017-11-08 11:57 946 查看

简介

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一致。

执行测试

编译完成后,分别到服务端和客户端,启动应用,可以看到调用及结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: