【问题标题】:ASP.NET Core | How to make local network gRPC clients poolASP.NET 核心 |如何使本地网络 gRPC 客户端池
【发布时间】:2020-04-23 22:41:45
【问题描述】:

我正在尝试构建一个由 1 个主服务器和至少 2 个 gRPC 服务(使用 HTTP.Sys 托管)组成的系统,这些服务既可以是主服务器的客户端,也可以接受来自主服务器的连接,以下称为“工人”。系统的每个元素都在本地网络内。一个worker一旦启动就会连接到主服务器,主服务器应该将连接添加到池中,稍后可以访问客户端worker以进行gRPC调用。我期望它在下面如何工作的示例

public class MainServer : MainServer.MainServerGrpcBase
{
    public List<GrpcChannel> ChannelPool { get; set; }
    public MainServer()
    {
        ChannelPool = new List<GrpcChannel>();
    }

    public override async Task<Confirmation> Connect(ConnectionRequest request, ServerCallContext context)
    {
        ChannelPool.Add(context.Channel);
        return new Confirmation { Success = true; }
    }

    // Having a channel pool allows me using methods like this.
    public void BroadcastMessage(string message)
    {
        foreach(var channel in ChannelPool)
        {
            var client = new Worker.WorkerClient(channel);
            client.SendMessage(message);
        }
    }
}

我尝试过的:

  • 在客户端确定工作人员 IP 并将其发送到主服务器,然后使用 GrpcChannel.FromAddress(...) 创建通道,结果我发现我无法获取适当的工作人员地址来创建通道。
  • ServerCallContext.Peer 创建通道时,该属性返回不适合创建通道的奇怪 IPv6 地址。

TLDR; 我需要一个能够存储客户端 gRPC 服务以供进一步使用的 gRPC 服务器,例如广播消息。

【问题讨论】:

    标签: c# asp.net-core connection-pooling grpc


    【解决方案1】:

    如果我正确理解您的问题,您尝试在从客户端到服务器的请求已经处理之后,从服务器向客户端发送消息。这是不可能的,因为 HTTP 允许从客户端向服务器发送请求,而不是相反。由于 gRPC 使用的是 HTTP/2,因此您需要使用另一种方法来解决您的问题。

    考虑创建订阅服务。它是一种服务器流服务,您可以将一条消息从客户端发送到服务器,然后服务器可以在需要时发送响应消息流。查看这篇文章了解更多信息: https://stackoverflow.com/a/52939764/9742876

    【讨论】:

      猜你喜欢
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2021-04-14
      相关资源
      最近更新 更多