【问题标题】:RabbitMQ connection working on localhost but not trough networkRabbitMQ 连接在本地主机上工作但不通过网络
【发布时间】:2020-03-04 08:12:49
【问题描述】:

我正在尝试让 RabbitMQ 服务器正常工作。本地主机连接不是本教程的问题。但是每当我尝试通过网络执行相同操作时,我都无法让应用程序连接到代理。

发送:

var factory = new ConnectionFactory() { };
factory.HostName = "192.168.1.52";
factory.Port = 5672;
factory.UserName = "guest";
factory.Password = "guest";
factory.VirtualHost = "/";
using (var connection = factory.CreateConnection())
    using (var channel = connection.CreateModel())
       {
           channel.QueueDeclare(queue: "hello",
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            string message = "Hello World!";
            var body = Encoding.UTF8.GetBytes(message);

            channel.BasicPublish(exchange: "",
                                 routingKey: "hello",
                                 basicProperties: null,
                                 body: body);
            Console.WriteLine(" [x] Sent {0}", message);
        }

Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();

RabbitMQ 实例在 IP 地址为 192.168.1.52 的不同 PC 上运行。 RabbitMQ 使用的默认端口是 5672,我还没有更改用户名或密码,所以仍然是 guest 和 guest。

收到:

var factory = new ConnectionFactory() { };
factory.HostName = "192.168.1.52";
factory.Port = 5672;
factory.UserName = "guest";
factory.Password = "guest";
factory.VirtualHost = "/";
using (var connection = factory.CreateConnection())
    using (var channel = connection.CreateModel())
    {
        channel.QueueDeclare(queue: "hello",
                             durable: false,
                             exclusive: false,
                             autoDelete: false,
                             arguments: null);

        var consumer = new EventingBasicConsumer(channel);
        consumer.Received += (model, ea) =>
        {
            var body = ea.Body;
            var message = Encoding.UTF8.GetString(body);
            Console.WriteLine(" [x] Received {0}", message);
        };
        channel.BasicConsume(queue: "hello",
                             autoAck: true,
                             consumer: consumer);

        Console.WriteLine(" Press [enter] to exit.");
        Console.ReadLine();
    }

两个程序都抛出异常:

抛出异常:运行程序时 RabbitMQ.Client.dll 中出现“RabbitMQ.Client.Exceptions.ConnectFailureException”

但它不会破坏线程。一段时间后,威胁退出并出现以下错误:

ExtendedSocketException:连接尝试失败,因为连接方在一定时间后没有正确响应,或者连接失败,因为连接的主机没有响应。 192.168.1.52:5672

【问题讨论】:

  • 愚蠢的问题,但是您检查过防火墙设置吗?
  • 我不认为这是一个愚蠢的问题,而且很可能是罪魁祸首。
  • 干杯,伙计们,这似乎有帮助。几个后续问题。我试图在允许的应用程序列表中找到 RabbitMQ 的实例,但没有一个只是简单地称为 RabbitMQ。但是,我确实找到了 erl (我认为这是需要允许的(lists.rabbitmq.com/pipermail/rabbitmq-discuss/2013-January/…)),但我已经允许了。但是暂时关闭防火墙后,它确实抛出了一个不同的错误,我将尝试解决下一个
  • @Titulum 这绝对是问题所在。在解决下一个错误(由使用访客访客登录引起)后,我能够创建连接并发送消息。您是否知道我需要添加防火墙接受列表才能在不关闭防火墙的情况下实现这一点?

标签: c# networking rabbitmq


【解决方案1】:

创建一个新的用户帐户,默认访客帐户仅限于本地主机。

【讨论】:

  • 虽然您是完全正确的(我现在已经解决了这个问题),但我会将@Titulum 的答案标记为正确的答案,但也会在此处发表评论以指出您的答案。因为这也是我在解决问题中描述的问题后遇到的问题。所以谢谢你的回答!
【解决方案2】:

Tu-Jen Liang 部分正确。这是你需要做的:

  • 首先你需要启用 RabbitMq 管理

    rabbitmq-plugins 启用 rabbitmq_management

  • 其次你需要为rabbitmq_management创建一个账户,Guest没有足够的权限

  • 第三你需要配置防火墙通过5672端口或你设置的端口接收消息

【讨论】:

    【解决方案3】:

    问题可能是您的防火墙。 [RabbitMQ 有一些关于如何正确配置防火墙的文档,这样您就不必完全关闭它] (https://www.rabbitmq.com/networking.html#ports)。

    以下是链接腐烂的概述:

    Port Access
    
    RabbitMQ nodes bind to ports (open server TCP sockets) in order to accept client and CLI tool connections. Other processes and tools such as SELinux may prevent RabbitMQ from binding to a port. When that happens, the node will fail to start.
    
    CLI tools, client libraries and RabbitMQ nodes also open connections (client TCP sockets). Firewalls can prevent nodes and CLI tools from communicating with each other. Make sure the following ports are accessible:
    
        4369: epmd, a peer discovery service used by RabbitMQ nodes and CLI tools
        5672, 5671: used by AMQP 0-9-1 and 1.0 clients without and with TLS
        25672: used for inter-node and CLI tools communication (Erlang distribution server port) and is allocated from a dynamic range (limited to a single port by default, computed as AMQP port + 20000). Unless external connections on these ports are really necessary (e.g. the cluster uses federation or CLI tools are used on machines outside the subnet), these ports should not be publicly exposed. See networking guide for details.
        35672-35682: used by CLI tools (Erlang distribution client ports) for communication with nodes and is allocated from a dynamic range (computed as server distribution port + 10000 through server distribution port + 10010). See networking guide for details.
        15672: HTTP API clients, management UI and rabbitmqadmin (only if the management plugin is enabled)
        61613, 61614: STOMP clients without and with TLS (only if the STOMP plugin is enabled)
        1883, 8883: (MQTT clients without and with TLS, if the MQTT plugin is enabled
        15674: STOMP-over-WebSockets clients (only if the Web STOMP plugin is enabled)
        15675: MQTT-over-WebSockets clients (only if the Web MQTT plugin is enabled)
        15692: Prometheus metrics (only if the Prometheus plugin is enabled)
    
    It is possible to configure RabbitMQ to use different ports and specific network interfaces.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多