如何解决如何找出为什么RabbitMQ连接失败的原因?
在这上面我已经把头撞在墙上几天了。
我在docker中设置了一个非常基本的RabbitMQ服务。我可以编写一个简单的控制台应用程序来写入和读取该服务。我也可以访问rabbitMQ Web门户。
但是,当我尝试从正在使用的相当复杂的Web应用程序中使用它时,每次在factory.CreateConnection()
方法上都失败,并出现None of the specified endpoints were reachable
错误。我首先想到的是从IISExpress访问时出现问题。因此,我尝试了以下方法来确定哪里出了问题:
- 尝试从一个新的MVC ASP应用程序内部运行-可以。
- 从启用了SSL的全新MVC ASP应用程序内部尝试-可以正常工作。
所以现在我知道它可以在控制台中工作,并且可以通过带有或不带有SSL的IISExpress进行工作。然后,我在失败应用中尝试了以下操作(扰流器,这些都不起作用):
- 将
CreateConnection()
代码移到构造函数之外,以便Ninject不会实例化它。 - 在配置文件中将loopback_users设置为无。
- 创建具有不同权限级别的新用户(通过Web门户和在definitions.json中),并在连接方法中使用它们。
- 为新用户创建新的虚拟主机,并尝试在有无新主机的情况下进行连接。
- 更改超时。
在每种情况下,我都得到相同的结果。当通过正常工作的应用程序(具有相同的代码)时,我在输出中得到以下结果:
rabbitMQTest_1 | 2020-08-21 16:24:28.820 [info] <0.11124.0> accepting AMQP connection <0.11124.0> (198.19.0.1:57186 -> 198.19.0.2:5672)
rabbitMQTest_1 | 2020-08-21 16:24:28.899 [info] <0.11124.0> connection <0.11124.0> (198.19.0.1:57186 -> 198.19.0.2:5672): user 'testuser' authenticated and granted access to vhost 'test-vhost'
rabbitMQTest_1 | 2020-08-21 16:24:28.983 [info] <0.11124.0> closing AMQP connection <0.11124.0> (198.19.0.1:57186 -> 198.19.0.2:5672,vhost: 'test-vhost',user: 'testuser')
尝试通过失败的应用程序时,我得到了这个信息:
rabbitMQTest_1 | 2020-08-21 16:26:30.640 [info] <0.11354.0> accepting AMQP connection <0.11354.0> (198.19.0.1:57202 -> 198.19.0.2:5672)
rabbitMQTest_1 | 2020-08-21 16:26:40.613 [error] <0.11354.0> closing AMQP connection <0.11354.0> (198.19.0.1:57202 -> 198.19.0.2:5672):
rabbitMQTest_1 | {handshake_timeout,frame_header}
工作和非工作应用之间的唯一区别是,后者具有安全登录功能,并且可以通过内部应用进行身份验证。
作为参考,这是我的docker.yml文件:
version: '3.4'
services:
rabbitMQTest:
image: rabbitmq-local
hostname: localhost
build:
context: .
dockerfile: Dockerfile
ports:
- 15672:15672
- 5672:5672
我的Docker文件:
FROM rabbitmq:3-management
ADD rabbitmq.conf /etc/rabbitmq/
ADD definitions.json /etc/rabbitmq/
RUN chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.conf /etc/rabbitmq/definitions.json
RUN rabbitmq-plugins enable rabbitmq_management
CMD ["rabbitmq-server"]
我的配置文件:
loopback_users = none
# IPv4
listeners.tcp.default = 5672
## HTTP listener and embedded Web server settings.
management.tcp.port = 15672
# Load queue definitions
management.load_definitions = /etc/rabbitmq/definitions.json
#Ignore SSL
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = true
这是用于连接和写入RabbitMQ的沼泽标准C#代码:
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost",UserName = "testuser",Password = "testpassword",VirtualHost = "test-vhost"};
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare("MyExchange","direct",true);
channel.QueueDeclare(queue: "MyQueue",durable: true,exclusive: false,autoDelete: false,arguments: null);
channel.QueueBind("MyQueue","MyExchange","routingKey");
var message = "Howdy";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "",routingKey: "routingKey",basicProperties: null,body: body);
Console.WriteLine(" [x] Send {0}",message);
}
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
正如我所说,我现在唯一能想到的就是我的非工作应用具有内部验证,而其他应用则没有。我不知道这有什么不同。我现在需要做的是深入研究。有谁知道从RabbitMQ获取更多日志信息的方法吗?特别是,在握手拒绝拒绝的那10秒内发生了什么?只是没有任何信息而下降的事实使我发疯!
或者,如果有人直接回答了这个问题,我将不胜感激!
谢谢。
解决方法
我自己回答这个问题。也许这可以帮助遇到类似问题的人。
问题在于RabbitMQ依赖的dll版本。我注意到我的应用程序的版本略有不同。通过对 RabbitMQ 依赖的绑定重定向,我解决了这个问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。