IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]C# 使用 grpc

    u010019717发表于 2017-01-21 14:06:12
    love 0

    孙广东  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使用、和电池寿命。



            然后在当前解决方案下     添加两个控制台应用程序 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 

    切换项目简单:



          NuGet 命令行(视图-> 其他窗口 -> 程序包管理器控制台):

    Install-Package Grpc

    Install-Package Google.Protobuf

        

          然后在  grpcTest  项目中再添加上工具   Grpc.Tools(要生成源文件)

    Install-Package Grpc.Tools

                  CMD命令行来到解决方案下目录下(目录为packages 的上层目录)

     

     

     

    然后输入下列命令(你可以把  rpcTest  该成你项目的名字!): 


     


             packages\Grpc.Tools.1.0.0\tools\windows_x86\protoc.exe-IgrpcTest --csharp_out grpcTest  grpcTest\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 Task<TestReply>SayHello(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。

     

     

     

     

               成功进行通信了,实现了gRPC。

    它们之间的  通信使用Grpc.Core中的   Services    和  Channel    来通信。

     

     

     



沪ICP备19023445号-2号
友情链接