来自控制台应用程序的兔子连接:
var factory = new ConnectionFactory()
{
HostName = Environment.GetEnvironmentVariable("RabbitMq/Host"),
UserName = Environment.GetEnvironmentVariable("RabbitMq/Username"),
Password = Environment.GetEnvironmentVariable("RabbitMq/Password")
};
using (var connection = factory.CreateConnection()) // GETTING ERROR HERE
using (var channel = connection.CreateModel())
{
channel.QueueDeclare(queue: "rss",
durable: fa...
我收到此错误:
未处理的异常: RabbitMQ.Client.Exceptions.BrokerUnreachableException:没有一个 指定端点可达 ---> RabbitMQ.Client.Exceptions.ConnectFailureException:连接失败 ---> System.Net.Internals.SocketExceptionFactory + ExtendedSocketException: 连接被拒绝 127.0.0.1:5672
我的 docker-compose.yml 文件:
version: '3'
services:
message.api:
image: message.api
build:
context: ./message_api
dockerfile: Dockerfile
container_name: message.api
environment:
- "RabbitMq/Host=rabbit"
- "RabbitMq/Username=guest"
- "RabbitMq/Password=guest"
depends_on:
- rabbit
rabbit:
image: rabbitmq:3.7.2-management
hostname: rabbit
ports:
- "15672:15672"
- "5672:5672"
rsscomparator:
image: rsscomparator
build:
context: ./rss_comparator_app
dockerfile: Dockerfile
container_name: rsscomparator
environment:
- "RabbitMq/Host=rabbit"
- "RabbitMq/Username=guest"
- "RabbitMq/Password=guest"
depends_on:
- rabbit
我正在使用 dotnetcore 控制台应用程序。当我在 docker 中使用这个应用程序时,出现错误。我可以访问rabbitmq网络浏览器(http://192.168.99.100:15672),但应用程序无法访问。
您正在尝试从容器应用程序连接到rabbitmq应用程序。 您尝试在控制台应用程序容器中使用
127.0.0.1:5672
来实现此目的。
但这指向此容器内的本地主机,而不是主机上的本地主机。
您正在使用相同的 docker-compose 部署服务,而无需指定网络设置,这意味着它们都部署在同一个 docker 桥接网络内。这将允许您让容器使用其容器或服务名称相互通信。
因此请尝试连接到
rabbit:5672
而不是 127.0.0.1:5672
。该名称将被转换为容器 IP (172.xx.xx.xx),这意味着您将在容器之间创建私有连接。
在通过 docker-compose 文件启动容器后尝试连接
rabbit:5672
时,我仍然遇到同样的问题。这不是这里的原始问题,但我遇到了相同的“连接被拒绝”错误。
我发现rabbitMQ服务需要一段时间才能启动,因此其他服务(容器)会在它运行之前尝试连接。主要原因是
depends_on
子句只保证rabbitMQ启动,但不保证它运行且健康。
要解决此问题,您可以根据 RabbitMQ 将
restart: unless-stopped
或 restart: on-failure
设置为其他服务。
rabbit:
image: rabbitmq:3-management
ports:
- "15672:15672"
- "5672:5672"
gobackend:
build: ./go-backend
ports:
- "8080:8080"
restart: unless-stopped
depends_on:
- rabbit
另一种可能的解决方案是在 RabbitMQ 服务中添加一个
healthcheck
子句并在其他服务中检查它,就像这样
rabbit:
image: rabbitmq:3-management
ports:
- "15672:15672"
- "5672:5672"
healthcheck:
test: rabbitmq-diagnostics -q ping
interval: 10s
timeout: 5s
retries: 2
start_period: 5s
gobackend:
build: ./go-backend
ports:
- "8080:8080"
depends_on:
rabbit:
condition: service_healthy