C# 使用 grpc


孙广东2016.12.21
http://blog.csdn.NET/u010019717




GitHub: https://github.com/grpc/grpc
gRPC 官方文档中文版: http://doc.oschina.net/grpc?t=60132


基于ProtoBuf(ProtocolBuffers)序列化协议开发,且支持众多开发语言。gRPC提供了一种简单的方法来精确地定义服务和为iOS、Android和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低的TCP链接次数、节省CPU使用、和电池寿命。
C# 使用 grpc
文章图片




然后在当前解决方案下添加两个控制台应用程序 grpcServer 、grpcClient。


前面说了, grpc基于 Protobuffer,所以
定义服务 这里我们在grpcTest项目里添加一个 test.proto 内容如下:

下面主要定义一个gRPC的服务里面有个 SayHello rpc 方法


syntax ="proto3"; packagegrpcTesst; servicegRPC { rpc SayHello (TestRequest) returns(TestReply) {} } messageTestRequest { string name = 1; } messageTestReply { string message = 1; }






使用Grpc.Tools生成代码 有了服务,开始生成代码!
首先需要添加引用:
在每个项目中添加上Grpc 及 Google.Protobuf
切换项目简单:
C# 使用 grpc
文章图片




【C# 使用 grpc】NuGet 命令行(视图-> 其他窗口 -> 程序包管理器控制台):
Install-Package Grpc
Install-Package Google.Protobuf

然后在grpcTest项目中再添加上工具Grpc.Tools(要生成源文件)
Install-Package Grpc.Tools
CMD命令行来到解决方案下目录下(目录为packages 的上层目录)
C# 使用 grpc
文章图片


C# 使用 grpc
文章图片

然后输入下列命令(你可以把rpcTest该成你项目的名字!):
C# 使用 grpc
文章图片





packages\Grpc.Tools.1.0.0\tools\windows_x86\protoc.exe-IgrpcTest --csharp_out grpcTestgrpcTest\test.proto --grpc_out grpcTest --plugin=protoc-gen-grpc=packages\Grpc.Tools.1.0.0\tools\windows_x86\grpc_csharp_plugin.exe

跟Protobuffer类似啦~~~~
执行完以后,在 grpcTest 目录下会多出Test.cs 及 TestGrpc.cs 类,将其包含至grpcTest项目既可(项目上右键-》 添加-》现有项选择文件就行了)。

然后grpcServer、 grpcClient分别都引用 grpcTest (项目引用节点上右键-》 添加引用-》 项目解决方案下 选择项目确定就行了)。

创建服务端及客户端 下面我们来编写服务端及客户端

首先是服务端:
将默认Program.cs 文件按F2 重命名 为 TestServer.cs(注: 在 解决方案面板上操作,会提示 是否同时修改相关的引用,选择是!)

usingGrpc.Core; usingGrpcTesst; usingSystem; usingSystem.Threading.Tasks; namespacegrpcServer { class gRPCImpl : gRPC.gRPCBase { // 实现SayHello方法 public override TaskSayHello(TestRequest request, ServerCallContext context) { return Task.FromResult(newTestReply { Message = "Hello " + request.Name }); } } class TestServer { const int Port = 9007; public static void Main(string[] args) { Server server = new Server { Services= { gRPC.BindService(new gRPCImpl()) }, Ports = { newServerPort("localhost", Port, ServerCredentials.Insecure) } }; server.Start(); Console.WriteLine("gRPC serverlistening on port " + Port); Console.WriteLine("任意键退出..."); Console.ReadKey(); server.ShutdownAsync().Wait(); } } }





服务端需要实现SayHello方法。

然后是客户端:
将默认Program.cs 文件按F2 重命名 为TestClient.cs(注: 在 解决方案面板上操作,会提示 是否同时修改相关的引用,选择是!)

usingGrpc.Core; usingGrpcTesst; usingSystem; namespacegrpcClient { class TestClient { static void Main(string[] args) { Channel channel = newChannel("127.0.0.1:9007", ChannelCredentials.Insecure); var client = newgRPC.gRPCClient(channel); var reply = client.SayHello(newTestRequest { Name = "sunguangdong" }); Console.WriteLine("来自" +reply.Message); channel.ShutdownAsync().Wait(); Console.WriteLine("任意键退出..."); Console.ReadKey(); } } }






在这两个项目上右键生成。
分别到对应的目录执行,首先启动grpcServer.exe,然后执行grpcClient.exe。
C# 使用 grpc
文章图片


C# 使用 grpc
文章图片


成功进行通信了,实现了gRPC。
它们之间的通信使用Grpc.Core中的Services和Channel来通信。



    推荐阅读