netcore6 下的grpc 体验

8/2/2022 2:03:24 PM
696
0

一、GRPC服务

1、使用vs2022 的项目模板创建一个grpc的默认项目 

2、添加  proto文件

添加proto文件时候,弹出对话框提示:必须指定语言 ,这是vs2022 的bug,更新到最新版本解决了,跟配置无关。跟新后,再次添加proto文件,有可能添加的文件vs作为普通文件对待,需要设置一下

3、参考网络上的grpc案例,直接复制了人家的撸猫的服务代码,懒得自己手撸。

并且要编辑csproj文件,增加一行代码,如果存在,则不用增加。增加后生成项目,会自动生成一些服务要用基类

添加一个service类 

   public class LuCatService: LuCat.LuCatBase
    {
        private static readonly List<string> Cats = new List<string>() { "英短银渐层", "英短金渐层", "美短", "蓝猫", "狸花猫", "橘猫" };
        private static readonly Random Rand = new Random(DateTime.Now.Millisecond);
        public   override  Task<SuckingCatResult> SuckingCat(Empty request, ServerCallContext context)
        {
            return Task.FromResult(new SuckingCatResult()
            {
                Message = $"您吸了一只{Cats[Rand.Next(0, Cats.Count)]}"
            });
        }
    }

注意:这里继承了一个基类 LuCat.LuCatBase  ,这类是根据 proto 文件自动生成的

最后,在Program.cs  文件中注册服务

至此,一个grpc项目算是完成了。

二、测试Grpc服务

1、安装调试工具

grpc的服务需要客户端才能够进行测试,所以我们需要安装一个客户端工具。百度,Google了一圈,发现基本上都是用 grpcurl和grpcui,这两个基本一样。只不过grpcui带有web ui。

微软官方也是推荐使用此工具 ,参考微软官方文档   https://docs.microsoft.com/zh-cn/aspnet/core/grpc/test-tools?view=aspnetcore-6.0

github源码地址:
https://github.com/fullstorydev/grpcui

个人使用的window 系统,下载地址

https://github.com/fullstorydev/grpcui/releases

下载并解压后

地址栏里输入 cmd ,启动命令行工具。

输入以下命令查看是否有问题。如果有问题就是有问题,如果没有问题就是没有问题

grpcui -help

首先启动用你的grpc服务,必须的。

然后再 grpcui的命令行中输入以下命令,启动web  ui。其中  127.0.0.1:50051 是你的grpc的服务根地址,根据你自己的来,如果你的地址使用https 方案,请将 plaintext 参数换成  insecure

grpcui -plaintext 127.0.0.1:50051

ui启动了,有可能你启动不了。如果启动不了,则参考过程2 进行配置

仅做演示

2、配置grpc服务自动发现服务协定

终端工具必须了解服务的 Protobuf 协定,然后才能调用它们。 有两种方法可以实现此目的:

  • 在服务器上设置 gRPC 反射。 gRPCurl 和 Postman 等工具会自动发现服务协定。
  • 在 gRPCurl 的命令行参数中指定 .proto 文件。

使用 gRPC 反射会更加轻松。 gRPC 反射向应用添加了新的 gRPC 服务,客户端可以调用该服务来发现服务。

gRPC ASP.NET Core 包含 Grpc.AspNetCore.Server.Reflection 包,因此具有对 gRPC 反射的内置支持。 在应用中配置反射:

  • 添加 Grpc.AspNetCore.Server.Reflection 包引用。
  • 在 Program.cs 中注册反射:
    • AddGrpcReflection 用于注册启用反射的服务。
    • MapGrpcReflectionService 用于添加反射服务终结点。
builder.Services.AddGrpc();

//这里-------------------------------------
builder.Services.AddGrpcReflection();

var app = builder.Build();

app.MapGrpcService<GreeterService>();

IWebHostEnvironment env = app.Environment;


//这里---------------------------------
if (env.IsDevelopment())
{
    app.MapGrpcReflectionService();
}

原码附件 下载

全部评论



提问