GRPC

Posted by 戚骏 on April 14, 2021

项目添加引用

Install-Package Grpc
Install-Package Google.Protobuf
Install-Package Grpc.Tools

定义helloworld.proto

syntax = "proto3";
package gRPCDemo;
service gRPC {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

生成Helloworld.cs及HelloworldGrpc.cs类

 C:\Users\用户\.nuget\packages\grpc.tools\2.37.0\tools\windows_x64\protoc --csharp_out .  helloworld.proto --grpc_out . --plugin=protoc-gen-grpc=C:\Users\用户\.nuget\packages\grpc.tools\2.37.0\tools\windows_x64\grpc_csharp_plugin.exe

网上的例子是

packages\Grpc.Tools.1.0.0\tools\windows_x86\protoc.exe -IgRPCDemo --csharp_out gRPCDemo  gRPCDemo\helloworld.proto --grpc_out gRPCDemo --plugin=protoc-gen-grpc=packages\Grpc.Tools.1.0.0\tools\windows_x86\grpc_csharp_plugin.exe

需要使用visual studio,在PM命令行中使用。我的使用Rider,未找到PM命令行,所以使用绝对路径执行

工程demo

class gRPCImpl : gRPC.gRPCBase
{
    public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
    {
        return Task.FromResult(new HelloReply {Message = "Hello " + request.Name});
    }
}

static void Main(string[] args)
{
    int Port = 9007;
    
    Server server = new Server
    {
        Services = {gRPC.BindService(new gRPCImpl())},
        Ports = {new ServerPort("localhost", Port, ServerCredentials.Insecure)}
    };
    server.Start();
    
    Channel channel = new Channel("127.0.0.1:"+Port, ChannelCredentials.Insecure);
    var client = new gRPC.gRPCClient(channel);
    var reply = client.SayHello(new HelloRequest {Name = "xxx"});
    Console.WriteLine("返回结果: "+reply.Message);
}