【问题标题】:docker-compose with rabbitmqdocker-compose 与 rabbitmq
【发布时间】:2019-01-11 12:13:05
【问题描述】:

我正在尝试设置一个 docker-compose 脚本 - 启动一个虚拟对象:网站、API、网关和 RabbitMQ。 (微服务方式)

请求管道:

Web >> 网关 >> API >> RabbitMQ

我的 docker-compose 看起来像这样:

version: "3.4"

services:
  web:
    image: webclient
    build:
      context: ./WebClient
      dockerfile: dockerfile
    ports:
      - "4000:4000"  
    depends_on:
     - gateway

  gateway:
    image: gatewayapi
    build:
      context: ./GateWayApi
      dockerfile: dockerfile
    ports:
      - "5000:5000"
    depends_on:
     - ordersapi

  ordersapi:
    image: ordersapi
    build:
      context: ./ExampleOrders
      dockerfile: dockerfile
    ports:
      - "6002:6002" 
    depends_on:
      - rabbitmq

  rabbitmq:
    image: rabbitmq:3.7-management
    container_name: rabbitmq
    hostname: rabbitmq
    volumes:
      - rabbitmqdata:/var/lib/rabbitmq
    ports:
      - "7000:15672"
      - "7001:5672"
    environment:
      - RABBITMQ_DEFAULT_USER=rabbitmquser
      - RABBITMQ_DEFAULT_PASS=some_password

此管道有效:

网页 >> 网关 >> API

我从网站上的 API 收到响应。

但是当我尝试从 API 向 rabbitmq 推送消息时,我收到以下错误:

System.AggregateException: One or more errors occurred. (Connection failed) ---> RabbitMQ.Client.Exceptions.ConnectFailureException: Connection failed ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: Connection refused 127.0.0.1:7001

RabbitMQ 管理 GUI 仍然在定义的端口 7000 上工作。 对端口 7001 的请求不会。

但是,如果我手动启动 API 和 RabbitMQ,它就像一个魅力。 API 我只是从调试器开始(.Net core + IIS - 默认设置在 VS 中按 F5),这是我用来手动启动 docker 映像的命令:

docker run -p 7001:5672 -p 7000:15672 --hostname localhost -e RABBITMQ_DEFAULT_USER=rabbitmquser -e RABBITMQ_DEFAULT_PASS=some_password rabbitmq:3.7-management

更新

这就是我在 .Net 核心管道中注入配置的方式。

startup.cs

public void ConfigureServices(IServiceCollection services)
{
    // setup RabbitMQ
    var configSection = Configuration.GetSection("RabbitMQ");
    string host = configSection["Host"];
    int.TryParse(configSection["Port"], out int port);
    string userName = configSection["UserName"];
    string password = configSection["Password"];

    services.AddTransient<IConnectionFactory>(_ => new ConnectionFactory()
    {
        HostName = host,
        Port = port,
        UserName = userName,
        Password = password
    });

 services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

}

controller.cs

private readonly IConnectionFactory _rabbitFactory;

public ValuesController(IConnectionFactory rabbitFactory)
{
    _rabbitFactory = rabbitFactory;
}

public void PublishMessage()
{
    try
    {
        using (var connection = _rabbitFactory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            string exchangeName = "ExampleApiController";
            string routingKey = "MyCustomRoutingKey";
            channel.ExchangeDeclare(exchange: exchangeName, type: "direct", durable: true); 
            SendMessage("Payload to queue 1", channel, exchangeName, routingKey);
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.InnerException);
    }
}

private static void SendMessage(string message, IModel channel, string exchangeName, string routingKey)
{
    byte[] body = Encoding.UTF8.GetBytes(message);
    channel.BasicPublish(exchange: exchangeName,
                         routingKey: routingKey,
                         basicProperties: null,
                         body: body);
    Console.WriteLine($" Sending --> Exchange: { exchangeName }    Queue: { routingKey }    Message: {message}");
}

【问题讨论】:

    标签: docker .net-core docker-compose rabbitmq


    【解决方案1】:

    我想在你的调用者中你将 rabbitmq_url 设置为localhost:7001。但是,调用者在一个容器中,该容器在端口 7001 上运行着任何东西。Rabbitmq 在 您的主机上 的端口 7001 上运行。

    如果您使用的是window或mac docker 18.03+,则需要将url更改为rabbitmq:5672以使用内部网络或使用host.docker.internal:7001

    【讨论】:

    • 是的,你说得对。我需要定位 rabbitmq:5672 - 而不是 localhost:7001