0

我正在使用 Grpc.Net 版本:Grpc.AspNetCore 2.27.0

点网核心版本:Asp.Net Core 3.1

Grpc 服务的项目 Sdk ="Microsoft.NET.Sdk.Web"

Grpc 客户端的项目 Sdk ="Microsoft.NET.Sdk"

目标框架:netcoreapp 3.1

Grpc.Net.ClientFactory 版本:2.27.0

我使用 Grpc.Net.ClientFactory 创建了命名的 Grpc 客户端。但是,问题是,Grpc 客户端不会等待 Grpc 服务器启动。我尝试配置底层 HttpClient 的超时以及 RPC 调用截止日期。那是行不通的。如何让 Grpc 客户端等待 Grpc 服务启动,这可能是不确定的?(可能是 10 秒或 5 分钟等待) 为什么最后期限设置在这里不起作用?RPC的截止时间是多少,是服务收到请求后的等待时间,还是包括待建立通道通信在内的等待时间?它立即抛出异常。失败后如何重试异步 Grpc 调用,它的配置是什么?我感觉,Grpc.Net.Client 比 Grpc.Net 的客户端工厂好。

grpc客户端代码:

程序.cs


    public class Program
        {
            public static void Main(string[] args)
            {
                CreateHostBuilder(args).Build().Run();
            }
    
            // Additional configuration is required to successfully run gRPC on macOS.
            // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682
            public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.UseStartup<Startup>();
                    });
        }

工人.cs


    public class Worker : BackgroundService
        {
            private readonly Greeter.GreeterClient greeterClient;
            private readonly ILogger<Worker> _logger;
            public Worker(GrpcClientFactory clientFactory, ILogger<Worker> logger)
            {
                greeterClient = clientFactory.CreateClient<Greeter.GreeterClient>("greeter-client");
                _logger = logger;
            }
            protected override async Task ExecuteAsync(CancellationToken stoppingToken)
            {
                var reply = await greeterClient.SayHelloAsync(new HelloRequest { Name = "Greeter client" },
                    deadline: DateTime.UtcNow.AddSeconds(120));
                _logger.LogInformation($"Response from greeter service: {reply.Message}");
            }
        }

grpc服务代码:


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

启动.cs


    public class Startup
        {
            // This method gets called by the runtime. Use this method to add services to the container.
            // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddGrpc();
            }
    
            // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseRouting();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapGrpcService<GreeterService>();
    
                    endpoints.MapGet("/", async context =>
                    {
                        await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
                    });
                });
            }
        }

我得到的异常详细信息:


    fail: Grpc.Net.Client.Internal.GrpcCall[6]
          Error starting gRPC call.
          System.Net.Http.HttpRequestException: No connection could be made because the target machine actively refused it.
           ---> System.Net.Sockets.SocketException (10061): No connection could be made because the target machine actively refused it.
             at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
             --- End of inner exception stack trace ---
             at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
             at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken)
             at System.Net.Http.HttpConnectionPool.GetHttp2ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
             at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
             at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
             at System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
             at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
             at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
             at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
             at Grpc.Net.Client.Internal.GrpcCall`2.RunCall(HttpRequestMessage request)
    fail: Grpc.Net.Client.Internal.GrpcCall[3]
          Call failed with gRPC error status. Status code: 'Internal', Message: 'Error starting gRPC call: No connection could be made because the target machine actively refused it.'.

4

0 回答 0