ASP.NET 核心 |如何使本地网络 gRPC 客户端池

Posted

技术标签:

【中文标题】ASP.NET 核心 |如何使本地网络 gRPC 客户端池【英文标题】:ASP.NET Core | How to make local network gRPC clients pool 【发布时间】: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 服务器,例如广播消息。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于ASP.NET 核心 |如何使本地网络 gRPC 客户端池的主要内容,如果未能解决你的问题,请参考以下文章

asp.net core 3.0 gRPC框架小试

gRPC在 ASP.NET Core 中应用学习

ASP.NET Core 搭载 Envoy 实现 gRPC 服务代理

ASP.NET Core 搭载 Envoy 实现 gRPC 服务代理

ASP.NET Core gRPC 打通前端世界的尝试

ASP.NET Core gRPC 打通前端世界的尝试