用dotnet开发一个gRPC的为服务以及客服端

gRPC是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,跨平台,跨语言。支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

- windows 10
- vs 2017
https://github.com/iissy/dotnetGRPC

1. 安装搭建
打开vs 2017,创建3个项目,一个类库(MyHelloworld),2个控制台项目(MicroServer,MicroClient),在MyHelloworld项目中使用nuget下载Grpc,Grpc.Tools,Google.Protobuf,查看packages.config文件可以看见如下
<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Google.Protobuf" version="3.5.1" targetFramework="net461" />
  <package id="Grpc" version="1.9.0" targetFramework="net461" />
  <package id="Grpc.Core" version="1.9.0" targetFramework="net461" />
  <package id="Grpc.Tools" version="1.9.0" targetFramework="net461" />
  <package id="System.Interactive.Async" version="3.1.1" targetFramework="net461" />
</packages>

2. 创建proto文件,在MyHelloworld项目中创建一个hello.proto,内容如下
syntax = "proto3";
package hello;
service HelloSrv {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}
// The response message containing the greetings
message HelloReply {
  string message = 1;
}

3. 生成c#文件
在包Grpc.Tools的目录(packages\Grpc.Tools.1.9.0\tools\windows_x64)下面有两个exe文件protoc.exe,grpc_csharp_plugin.exe,这两个文件用来生产c#文件的执行文件,命令如下:
set TOOLS_PATH=C:\Users\hemin\.nuget\packages\grpc.tools\1.9.0\tools\windows_x64
%TOOLS_PATH%\protoc.exe -I MyHelloworld --csharp_out MyHelloworld MyHelloworld/hello.proto --grpc_out MyHelloworld --plugin=protoc-gen-grpc=%TOOLS_PATH%\grpc_csharp_plugin.exe
执行这个后,将生成2个c#文件,到这里我们可以看见项目的目录结构如下:


4. 服务实现,MyHelloworld项目中添加类
using Grpc.Core;
using Hello;
using System;
using System.Threading.Tasks;
namespace MyHelloworld
{
    public class HelloServiceImpl : HelloSrv.HelloSrvBase
    {
        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
        {
            Console.WriteLine(request.Name);
            HelloReply response = new HelloReply();
            response.Message = request.Name + ", Hello world!";
            return Task.FromResult(response);
        }
    }
}
然后在MicroServer项目中开启启动服务的代码
using Grpc.Core;
using Hello;
using MyHelloworld;
using System;
namespace MicroServer
{
    class Program
    {
        static void Main(string[] args)
        {
            var port = 50052;
            var server = new Server
            {
                Services = { HelloSrv.BindService(new HelloServiceImpl()) },
                Ports = { new ServerPort("0.0.0.0", port, ServerCredentials.Insecure) }
            };
            server.Start();
            Console.WriteLine("MyHelloworld server listening on port " + port);
            Console.WriteLine("Press any key to stop the server...");
            Console.ReadKey();
            server.ShutdownAsync().Wait();
        }
    }
}

5. 客户端调用,MicroClient项目中添加如下代码
using Grpc.Core;
using Hello;
using System;
namespace MicroClient
{
    class Program
    {
        static void Main(string[] args)
        {
            var channel = new Channel(string.Format("{0}:{1}", "192.168.0.103", 50052), ChannelCredentials.Insecure);
            HelloSrv.HelloSrvClient client = new HelloSrv.HelloSrvClient(channel);
            HelloRequest request = new HelloRequest();
            request.Name = "jimmy";
            HelloReply reply = new HelloReply();
            reply = client.SayHello(request);
            Console.WriteLine(reply.Message);
        }
    }
}
到此为止,我们的代码全部写完了,可以来测试了,首先启动grpc的服务,也就是启动MicroServer,然后启动客服端调用,效果如下:



 技巧:MicroServer通过从debug目录,双击启动,然后在让MicroClient调试,如上图所示,因为同时启动两个项目有可能不行,因为服务可能还没有成功启动,客户端已经调用,导致异常。生产环境比这个稍微复杂,要考虑注册成windows服务,详细可以参考github上代码,上面给出了地址。
Posted by 何敏
on 2018/02/06 23:15:27
Copyright ©2018 程序员网址导航 粤ICP备14091834号