【问题标题】:protobuf-net.grpc client and .NET Core's gRPC client factory integrationprotobuf-net.grpc 客户端和 .NET Core 的 gRPC 客户端工厂集成
【发布时间】:2020-03-26 14:28:04
【问题描述】:

我正在使用 proto 文件试验 gRPC 服务和客户端。建议是在 .NET Core (https://docs.microsoft.com/en-us/aspnet/core/grpc/clientfactory?view=aspnetcore-3.1) 中使用 gRPC 客户端工厂集成。为此,您需要注册从 Grpc.Tools 包生成的 Grpc.Core.ClientBase 派生的客户端,如下所示:

Host.CreateDefaultBuilder(args)
    .ConfigureServices((hostContext, services) =>
    {
        services.AddGrpcClient<MyGrpcClientType>(o =>
        {
            o.Address = new Uri("https://localhost:5001");
        });
    })

我的理解是 MyGrpcClientType 是在 DI 中注册为临时客户端,意味着每次注入时都会创建一个新的,但是客户端与 HttpClientFactory 集成在一起,允许重用通道而不是每次都创建时间。

现在,我想使用 protobuf-net.grpc 从接口生成客户端,看起来是这样完成的:

GrpcClientFactory.AllowUnencryptedHttp2 = true;
using var http = GrpcChannel.ForAddress("http://localhost:10042");
var calculator = http.CreateGrpcService<ICalculator>();

如果我正确地认为创建通道很昂贵,但客户端很便宜,我如何使用 protobuf-net.grpc 实现与 HttpClientFactory 的集成(以及底层通道的重用)?上面似乎每次我想要一个客户端时都会创建一个 GrpcChannel,那么重用通道的正确方法是什么?

同样,是否可以在 ASP.Net Core 中使用以下代码注册 protobuf-net.grpc 生成的服务类?

endpoints.MapGrpcService&lt;MyGrpcServiceType&gt;();

(请纠正以上误解)

【问题讨论】:

    标签: asp.net-core .net-core protobuf-net grpc-dotnet


    【解决方案1】:

    请注意,您不需要 AllowUnencryptedHttp2 - 如果您不使用 https,但:您似乎正在使用 https。

    关于“类似”;这应该已经可以工作了 - 您可能缺少的唯一一点是对services.AddCodeFirstGrpc() 的调用(通常在Startup.cs 中,通过ConfigureServices)。

    至于AddGrpcClient;我得调查一下。到目前为止,这不是我在集成中探索过的东西。可能需要新的作品。

    【讨论】:

    • 感谢您非常迅速的回复 Marc - 非常感谢。
    • 对于读者,这是 Startup.cs 服务的示例:github.com/protobuf-net/protobuf-net.Grpc/blob/master/examples/…
    • Marc - 当您有机会研究 HttpClientFactory 集成时,您会在这里发布您的发现吗?我很想了解它是如何工作的以及你在想什么。再次感谢。
    • @Julius 这是我最初的想法;您对在您的 API 中使用 CodeFirstClient&lt;T&gt; 有什么感觉?如果我们这样做我认为我们可以让它工作(这是一个新的实验性API,实际上并不存在)
    • @Julius 我已提议对Grpc.Net.ClientFactory 进行一些API 更改以直接完成这项工作:github.com/grpc/grpc-dotnet/pull/837
    【解决方案2】:

    Client Factory 支持不存在,并且 exactly like documented here 支持,除非您使用该方法注册

    services.AddCodeFirstGrpcClient<IMyService>(o =>
    {
        o.Address = new Uri("...etc...");
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多