• Dapr + .NET Core实战(十二)服务调用之GRPC


    4小时Dapr+.NET 5+K8S 的实战  https://ke.qq.com/course/4000292?tuin=1271860f

    Dapr进阶虚拟机集群实战(非K8S) https://ke.qq.com/course/4002149?tuin=1271860f

                       

    什么是GRPC

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

    gRPC 的主要优点是:

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

    这些优点使 gRPC 适用于:

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

    Dapr中的GRPC

    Dapr中的GRPC与我们通常情况下使用GRPC大致是一致的,唯一的不同是Dapr中的GRPC会固定调用接口/dapr.proto.runtime.v1.AppCallback/OnInvoke,因此我们在Dapr中使用GRPC时,proto文件中不需要再定义service节点中的rpc接口,只需要定义交互使用的序列化结构体即可。

    项目实战

    我们继续使用FrontEnd+BackEnd项目,首先需要将BackEnd中的监听协议切换成https,因为GRPC是基于HTTP2实现的,传输层使用TLS。

            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>().UseUrls("https://*:5000");
                    });

    BackEnd

    1.为BackEnd引入Nuget包

    • Dapr.AspNetCore
    • Grpc.AspNetCore

    2.在BackEnd中新建Protos/greet.proto文件,定义交互的结构体

    syntax = "proto3";
    option csharp_namespace = "GrpcGreeter";
    package greet;
    
    message HelloRequest {
      string name = 1;
    }
    
    message HelloReply {
      string message = 1;
    }

    注意:不需要定义service.rpc接口,因为Dapr中的GRPC固定调用接口/dapr.proto.runtime.v1.AppCallback/OnInvoke。

    3.修改项目文件BackEnd.csproj

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

    4.新增接口类Services/HelloService

        public class HelloService : AppCallback.AppCallbackBase
        {
            public override async Task<InvokeResponse> OnInvoke(InvokeRequest request, ServerCallContext context)
            {
                var response = new InvokeResponse();
                switch (request.Method)
                {
                    case "sayhi":
                        var input = request.Data.Unpack<HelloRequest>();
                        response.Data = Any.Pack(new HelloReply { Message = "ok" });
                        break;
                }
                return response;
            }
        }

    HelloService中我们只需要定义OnInvoke方法,通过request.Method来实现不同业务的代码编写。

    5.为grpc注入类

     services.AddGrpc();

    6.为grpc新增终结点映射

    endpoints.MapGrpcService<HelloService>();

    FrontEnd

    1.为FrontEnd引入Nuget包

    • Google.Protobuf
    • Grpc.Net.Client
    • Grpc.Tools

    2.新增Protos/greet.proto文件

    syntax = "proto3";
    option csharp_namespace = "GrpcGreeter";
    package greet;
    
    message HelloRequest {
      string name = 1;
    }
    
    message HelloReply {
      string message = 1;
    }

    3.修改FrontEnd.csproj文件

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

    4.在DaprController中新增接口

         [HttpGet("grpc")]
            public async Task<ActionResult> GrpcAsync()
            {
                using var daprClient = new DaprClientBuilder().Build();
                var result = await daprClient.InvokeMethodGrpcAsync<HelloRequest, HelloReply>("backend", "sayhi", new HelloRequest { Name = "aaa" });
                return Ok(result);
            }

    测试

    1.运行BackEnd

    dapr run --dapr-http-port 3511 --app-port 5000 --app-id backend  --app-protocol grpc  dotnet  .BackEndinDebug
    et5.0BackEnd.dll --app-ssl

    我们通过--app-protocol grpc指明了使用grpc,通过--app-ssl指明了开启tls

    2.运行FrontEnd

    dapr run --dapr-http-port 3501 --app-port 5001  --app-id frontend dotnet  .FrontEndinDebug
    et5.0FrontEnd.dll

    3.调用FrontEnd的dapr/grpc接口进行测试,调用成功!!

  • 相关阅读:
    P5956[POI2017]Podzielno【数学】
    P6672[清华集训2016]你的生命已如风中残烛【结论】
    P5825排列计数【EGF,NTT】
    P3971[TJOI2014]Alice and Bob【贪心】
    P3244[HNOI2015]落忆枫音【dp】
    jquery 选中单选按钮的值
    jquery ajax 详解
    Common Lisp中的car和cdr
    publishing(android)
    Preparing for Release(发布前的准备)
  • 原文地址:https://www.cnblogs.com/chenyishi/p/15399034.html
Copyright © 2020-2023  润新知