• C#编写gRPC应用程序所需的概念


    proto 文件

    gRPC 使用协定优先方法进行 API 开发。 默认情况下,协议缓冲区(protobuf)用作接口设计语言(IDL)。 *的 proto文件包含:

    • GRPC 服务的定义。
    • 客户端和服务器之间发送的消息。

    有关 protobuf 文件语法的详细信息,请参阅官方文档(protobuf)

    例如,请考虑gRPC 服务入门中使用的fibonacci文件:

    • 定义 Greeter 服务。
    • Greeter 服务定义 SayHello 调用。
    • SayHello 发送 HelloRequest 消息并收到 HelloReply 消息:
     
    syntax = "proto3";
     
    option csharp_namespace = "GrpcGreeter";
     
    package greet;
     
    // The greeting service definition.
    service Greeter {
      // 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;
    }

    将一个 proto 文件添加到 C# 应用

    在项目中,将 *proto文件添加到 <Protobuf> 项组:

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

    .proto 文件的 C# 工具支持

    需要工具包Grpc才能从C# *proto文件生成资产。 生成的资产(文件):

    • 每次生成项目时都按需生成。
    • 不会添加到项目中,也不会签入源控件。
    • 是包含在obj目录中的生成项目。

    服务器项目和客户端项目都需要此包。 Grpc.AspNetCore 元包包括对 Grpc.Tools的引用。 服务器项目可以使用 Visual Studio 中的包管理器或通过将 <PackageReference> 添加到项目文件来添加 Grpc.AspNetCore

    <PackageReference Include="Grpc.AspNetCore" Version="2.23.2" />

    客户端项目应直接引用 Grpc.Tools 使用 gRPC 客户端所需的其他包。 运行时不需要工具包,因此,该依赖项标记为 PrivateAssets="All"

    <PackageReference Include="Google.Protobuf" Version="3.9.2" />
    <PackageReference Include="Grpc.Net.Client" Version="2.23.2" />
    <PackageReference Include="Grpc.Tools" Version="2.23.0" PrivateAssets="All" />

    生成C#的资产

    工具包将生成表示C#在包含的 *proto文件中定义的消息的类型。

    对于服务器端资产,会生成抽象服务基类型。 基类型包含proto文件中包含的所有 gRPC 调用的定义。 创建一个派生自此基类型的具体服务实现,并为 gRPC 调用实现逻辑。 对于 greet.proto(前面所述的示例),将生成一个包含虚拟 SayHello 方法的抽象 GreeterBase 类型。 具体的实现 GreeterService 重写方法,并实现处理 gRPC 调用的逻辑。

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

    对于客户端资产,会生成具体的客户端类型。 Proto文件中的 gRPC 调用被转换为具体类型上的方法,可以调用该类型。 在 greet.proto中,将生成一个具体 GreeterClient 类型。 调用 GreeterClient.SayHelloAsync 以启动对服务器的 gRPC 调用。

    static async Task Main(string[] args)
    {
        // The port number(5001) must match the port of the gRPC server.
        using var channel = GrpcChannel.ForAddress("https://localhost:5001");
        var client =  new Greeter.GreeterClient(channel);
        var reply = await client.SayHelloAsync(
                          new HelloRequest { Name = "GreeterClient" });
        Console.WriteLine("Greeting: " + reply.Message);
        Console.WriteLine("Press any key to exit...");
        Console.ReadKey();
    }

    默认情况下,将为 <Protobuf> 项组中包含的每个 *proto文件生成服务器和客户端资产。 若要确保服务器项目中仅生成服务器资产,则 GrpcServices 属性设置为 Server

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

    同样,特性设置为在客户端项目中 Client

    其他资源

  • 相关阅读:
    强化学习快速入门
    Spark GraphX图计算简单案例【代码实现,源码分析】
    CDA数据分析【第二章:数据收集与导入】
    CDA数据分析实务【第一章:营销决策分析概述】
    CDA数据分析【第一章:数据分析概述】
    BLAS快速入门
    Tachyon内存文件系统快速入门
    Solr新特性【4.x,5.x,6.x,7.x】
    利用Redis keyspace notification(键空间通知)实现过期提醒
    设计模式 行为型
  • 原文地址:https://www.cnblogs.com/puzi0315/p/12550668.html
Copyright © 2020-2023  润新知