C# gRPC

499 阅读2分钟

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

What's gRPC

引用一段官网的介绍:

gRPC 的主要优点是:

  • 现代高性能轻量级 RPC 框架。
  • 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
  • 可用于多种语言的工具,以生成强类型服务器和客户端。
  • 支持客户端、服务器和双向流式处理调用。
  • 使用 Protobuf 二进制序列化减少对网络的使用。

它主要用于和多个服务之间的调用,例如A服务放在了5001 端口,B服务放在了5002端口。通过消息队列虽然也可以做到进程间通信。但是gRPC使用Protobuf序列化传输的体积,同时还支持双向流等等...所以在服务调用方面一般优先考虑gRPC

gRPC in Asp.net core

使用dotnet cli 创建项目:

dotnet new grpc -o GrpcExample
dotnet sln add GrpcExample

📢 2.1 了解文件结构

image.png

greet.proto:这是一个grpc的模板文件,他用于grpc服务的定义与代码的生成
GreeterService: 这个类是服务的实现,他里面有真实的业务逻辑处理

📢 2.2 认识proto文件

proto 是一个模板文件,语法有点类似Go,它将向外界描述这个文件里面的服务、方法(字段)之类的。 同时还可以用它生成服务、客户端的C#代码

例如,我们现在生成一下GrpcExample 项目,可以看到 obj/Debug/net5.0/Protos/ 目录下面有与proto文件同名的类

image.png

如果要生成客户端代码(供于gRPC的消息传递之类的...)需要把proto文件复制到client项目里面。
然后再修改*.csproj文件里面的Protobuf节点,将GrpcServices属性改为 "Client",并且安装Nuget包 我的客户端项目(Console)的csproj文件是这样的:

image.png

📢 2.3 运行程序查看结果

首先,必须得先运行起来服务端。使用kestrel运行服务后:

info: Microsoft.Hosting.Lifetime[0] 
      Now listening on: https://localhost:5001 
info: Microsoft.Hosting.Lifetime[0] 
      Application started. Press Ctrl+C to shut down. 
info: Microsoft.Hosting.Lifetime[0] 
      Hosting environment: Development

看一下客户端的代码:

static async Task Main(string[] args)
{
    var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var client = new GreeterClient(channel);

    var reply = await client.SayHelloAsync(new GrpcExample.HelloRequest
    {
        Name = "hello gRPC!"
    });

    Console.WriteLine(reply);
}

gRPC with http and https

使用grpc之后呢,同时也想让这个Grpc Server 支持http服务咋办?例如:我们在一个服务里面已经写好了http服务,但是后来发现其他项目需要经常调用这个服务,于是把这个服务做成了可供Grpc调用的Server。

现在,看一下如何配置http 服务 和 grpc 的共存配置吧

"Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://*:9002"
      },
      "HttpsInlineCertFile": {
        "Url": "https://*:5060",
        "Protocols": "Http2",
        "Certificate": {
          "Path": "",
          "Password": ""
        }
      }
    }
}

当然,这里也可以使用两个Https