运行 docker 时 RabbitMQ/MassTransit 连接被拒绝

问题描述 投票:0回答:1

我正在尝试使用 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 中运行应用程序时所需的一段配置,但在查看了一天之后我无法弄清楚。

c# asp.net docker rabbitmq masstransit
1个回答
0
投票

您需要在

Host
部分中实际配置 MassTransit 才能使用这些自定义端口(上面的代码中没有配置)。

© www.soinside.com 2019 - 2024. All rights reserved.