• .NET Core 下使用 gRPC


    gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。

    gRPC 的主要优点

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

    这些优点使 gRPC 适用于

    • 效率至关重要的轻量级微服务。
    • 需要多种语言用于开发的 Polyglot 系统。
    • 需要处理流式处理请求或响应的点对点实时服务。

    gRPC 现在可以非常简单的在 .NET Core 和 ASP.NET Core 中使用,并且已经开源,它目前由微软官方 ASP.NET 项目的人员进行维护,良好的接入 .NET Core 生态。

    接下来演示如何使用 gRPC,要想使用 gRPC 需要 .NET Core 3.1或者以上的SDK支持。gRPC分服务端和客户端,所以新建两个项目,一个控制台当作客户端gRPC_ClientDemo,一个ASP.NET Core 项目当作服务端gRPC_ServerDemo

    先将服务端搞定,添加Grpc.AspNetCore组件

    Install-Package Grpc.AspNetCore
    

    然后Startup.cs中添加services.AddGrpc()

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
    }
    

    因为 gRPC 是基于 HTTP/2 来通信的,所以需要在配置文件中添加Kestrel 启用 HTTP/2 的配置。

    {
      "Kestrel": {
        "EndpointDefaults": {
          "Protocols": "Http2"
        }
      }
    }
    

    gRPC 与传统的api是不同的,需要我们自己定义proto文件,gRPC 使用协定优先方法进行 API 开发。 默认情况下,协议缓冲区 (protobuf) 用作接口设计语言 (IDL)。 *.proto 文件包含:

    • gRPC 服务的定义。
    • 在客户端与服务器之间发送的消息。

    有关 protobuf 文件的语法的详细信息,可以查看官方文档 (protobuf)。

    proto文件在实际开发中肯定会有多个存在,这里有一个技巧就是将proto文件放在一个文件夹内,然后利用ProtobufLink关联即可,这样就只用维护一份proto文件即可。

    同时微软还帮我们提供了dotnet-grpc,.NET Core 全局工具,请运行以下命令:

    dotnet tool install -g dotnet-grpc
    

    dotnet-grpc 可以用于将 Protobuf 引用作为 <Protobuf /> 项添加到 .csproj 文件:

    <Protobuf Include="Protosgreet.proto" GrpcServices="Server" />
    

    具体用法可以查看文档:https://docs.microsoft.com/zh-cn/aspnet/core/grpc/dotnet-grpc

    在解决访问文件夹根目录添加 Proto 文件夹,新建一个hello.protoproto文件,将其分别连接到两个项目中。

    现在来开始编写hello.proto,添加一个SayHello方法。

    syntax = "proto3";
    
    package hello; //定义包名
    
    // 定义服务
    service HelloService {
        // 定义一个 SayHello 方法
        rpc SayHello (HelloRequest) returns (HelloReply);
    }
    
    message HelloRequest {
        string name = 1;
    }
    
    message HelloReply {
        string message = 1;
    }
    

    然后来实现这个服务,在服务端添加一个GreeterService.cs

    using Grpc.Core;
    using Hello;
    using Microsoft.Extensions.Logging;
    using System.Threading.Tasks;
    
    namespace gRPC_ServerDemo.Services
    {
        public class GreeterService : HelloService.HelloServiceBase
        {
            private readonly ILogger _logger;
    
            public GreeterService(ILoggerFactory loggerFactory)
            {
                _logger = loggerFactory.CreateLogger<GreeterService>();
            }
    
            public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
            {
                _logger.LogInformation($"Sending hello to {request.Name}");
    
                return Task.FromResult(new HelloReply { Message = "Hello " + request.Name });
            }
        }
    }
    

    HelloService.HelloServiceBaseproto文件为我们自动生成的类。

    调用重载方法SayHello(),记录了一条日志然后返回客户端传进来的字段name。

    在配置文件中将GreeterService服务添加到路由管道中

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGet("/", async context =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    
        endpoints.MapGrpcService<GreeterService>();
    });
    

    支持我们服务端完成,启动服务端拿到启动地址,https://localhost:5001

    现在去客户端配置地址调用我们写的服务,在开始之前需要在客户端解决方案先引用下面几个nuget包。

    Install-Package Grpc.Net.Client
    Install-Package Google.Protobuf
    Install-Package Grpc.Tools
    
    using Grpc.Net.Client;
    using Hello;
    using System;
    using System.Threading.Tasks;
    
    namespace gRPC_ClientDemo
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                using var channel = GrpcChannel.ForAddress("https://localhost:5001");
    
                var client = new HelloService.HelloServiceClient(channel);
    
                await UnaryCallExample(client);
            }
    
            private static async Task UnaryCallExample(HelloService.HelloServiceClient client)
            {
                var reply = await client.SayHelloAsync(new HelloRequest { Name = "阿星Plus" });
    
                Console.WriteLine("Greeting: " + reply.Message);
            }
        }
    }
    

    启动服务端和客户端看看效果,成功发送消息和获取消息。

  • 相关阅读:
    Android Bitmap 常见的几个操作:缩放,裁剪,旋转,偏移
    vue.js 本地解决跨域
    VUE添加网站favicon.ico图标
    在mpvue引入flyio
    页面中加入地图map
    360校招——最后赢家(C++)
    奇安信校招——买口罩(c++)
    携程校招——携程海洋馆的海豚小宝宝(C++)
    阿里云Web应用托管服务,低成本建个人博客(wordpress和wiki.js)
    (嵌入式)工程模板的创建和MDK下配置开发STM32F103ZE
  • 原文地址:https://www.cnblogs.com/meowv/p/13614390.html
Copyright © 2020-2023  润新知