我正在编写一个用于连接到 RabbitMQ 的控制台应用程序,并将其作为 Docker 容器上的映像运行。
当我浏览到 http://localhost:15672/#/ 时,我的图像在端口 15672 上运行。我可以使用默认用户密码登录 RabbitMQ
我的控制台应用程序:
using System;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
class Program
{
static void Main(string[] args)
{
// Connection info
string hostName = "localhost";
string userName = "guest";
string password = "guest";
string queueName = "hello";
// Create connection factory
var factory = new ConnectionFactory()
{
HostName = hostName,
UserName = userName,
Password = password,
Port= 15672
};
// Connect to RabbitMQ server
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
// Declare a queue
channel.QueueDeclare(queue: queueName,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
// Create a consumer
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
};
// Consume messages from the queue
channel.BasicConsume(queue: queueName,
autoAck: true,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
}
运行控制台应用程序时出现的错误:
RabbitMQ.Client.Exceptions.BrokerUnreachableException: 'None of the specified endpoints were reachable'
错误发生在这一行:
using (var connection = factory.CreateConnection())
如何修复此错误?我的代码有错误吗?
我尝试了很多方法,比如在另一台电脑上运行docker,我检查了防火墙、防病毒和其他相关设置。我还有一个可以正常工作的 mysql 映像,我可以将它插入到我的数据库中!
如果您使用 RabbitMQ 的管理接口端口 15672,这是 RabbitMQ 管理插件的 HTTP API 和仪表板的默认端口,建议不要将此端口直接暴露给外界。此端口通常用于管理目的,而不用于客户端应用程序连接。
要将控制台应用程序从 Docker 容器内连接到 RabbitMQ,您应该使用标准 AMQP 端口(默认为 5672)或安全 AMQP 端口(启用 TLS/SSL 时默认为 5671)。这些端口用于 RabbitMQ 客户端和 RabbitMQ 服务器之间的通信。
以下是修改方法
以下是修改 Docker 设置以公开正确端口的方法:
# Use the official RabbitMQ image
来自rabbitmq:3-管理
曝光5672
通过此 Dockerfile,您将使用包含管理插件的官方 RabbitMQ 映像。它公开用于客户端连接的标准 AMQP 端口 (5672)。
在连接到 RabbitMQ 的控制台应用程序或任何其他客户端应用程序中,请确保使用适当的 AMQP 端口(SSL 为 5672 或 5671)与 RabbitMQ 服务器进行通信。
通过采用这种方法,您可以在端口 15672 上保持管理接口在内部(在 Docker 网络内)可访问,而客户端则使用标准 AMQP 端口连接到 RabbitMQ 服务器。