我正在尝试使用 MassTransit 运行 .NET 8 Web 应用程序来连接到 RabbitMQ。
在开发过程中,我只是运行我的 docker-compose 文件并手动运行 .NET 应用程序,这工作得很好,我的 docker-compose 中的所有服务都正确启动并通过了健康检查。我还能够在本地运行的应用程序中使用它们。
但是,docker-compose 内部的 Web 应用程序无法正常工作,并在启动过程中出现以下错误:
Connection Failed: rabbitmq://messaging:8085/ <s:MassTransit>
RabbitMQ.Client.Exceptions.BrokerUnreachableException: None of the specified endpoints were reachable
---> System.AggregateException: One or more errors occurred. (Connection failed)
---> RabbitMQ.Client.Exceptions.ConnectFailureException: Connection failed
---> System.Net.Sockets.SocketException (111): Connection refused
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
at System.Threading.Tasks.ValueTask.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
以下是docker-compose和配置的相关部分。
messaging:
image: rabbitmq:management
container_name: messaging
hostname: messaging
restart: always
volumes:
- ./.container-data/queue/data:/var/lib/rabbitmq
- ./.container-data/queue/logs:/var/log/rabbitmq
ports:
- 8085:5672
- 8083:15672
environment:
RABBITMQ_DEFAULT_USER: quotable
RABBITMQ_DEFAULT_PASS: quotable
networks:
- quotable-network
healthcheck:
test: rabbitmq-diagnostics -q ping
interval: 5s
timeout: 15s
retries: 3
internal static void AddAndConfigureMassTransit(this WebApplicationBuilder builder)
{
ArgumentNullException.ThrowIfNull(builder);
var config = builder.GetOrAddMassTransitConfig(ServiceCollectionOptions.Return);
builder.Services.AddMassTransit(massTransitConfig =>
{
massTransitConfig.SetKebabCaseEndpointNameFormatter();
massTransitConfig.AddAndConfigureConsumers();
massTransitConfig.AddAndConfigureSagas();
massTransitConfig.UsingRabbitMq((context, rabbitMqConfig) =>
{
rabbitMqConfig.Host(new Uri(config.Host), host =>
{
host.Username(config.UserName);
host.Password(config.Password);
});
rabbitMqConfig.UseInMemoryOutbox(context);
rabbitMqConfig.ConfigureEndpoints(context);
});
});
}
该配置是自定义记录:
public sealed record MassTransitConfig
{
required public string Address { get; init; }
required public int Port { get; init; }
required public string UserName { get; init; }
required public string Password { get; init; }
public string Host => $"amqp://{Address}:{Port}";
public string ConnectionString => $"amqp://{UserName}:{Password}@{Address}:{Port}";
}
起初我以为主机有问题,仍然像本地配置一样定向到 localhost:8085,但是不,主机正确地指向 messages:8085。
我的服务已启动并正确运行,因为当我在本地运行 Web 应用程序时,我的应用程序设置使用完全相同的值(除了切换到 localhost 而不是容器名称)。
我假设我缺少在 docker 中运行应用程序时所需的一段配置,但在查看了一天之后我无法弄清楚。
您需要在
Host
部分中实际配置 MassTransit 才能使用这些自定义端口(上面的代码中没有配置)。