Docker Compose 配置 RabbitMQ

6
我正在尝试设置一个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

这是一段关于Web、Gateway和API之间通信管道的描述,其中API可以从网站获取响应。但是,当尝试从API向rabbitmq推送消息时,会出现连接失败的错误。RabbitMQ管理GUI仍然可以在定义的端口7000上工作,而对端口7001的请求则无法正常运行。但是,如果手动启动API和RabbitMQ,则可以正常工作。在.NET核心中,这是如何注入配置的。
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}");
}
1个回答

10
我想你在调用程序中将rabbitmq_url设置为localhost:7001。然而,调用程序在容器中运行,该容器上没有任何进程在7001端口运行。Rabbitmq正在主机上的7001端口上运行。
你需要更改URL为rabbitmq:5672以使用内部网络,或者如果你使用的是Windows或Mac Docker 18.03+,可以使用host.docker.internal:7001

是的,你说得完全正确。我需要针对rabbitmq:5672进行目标定位,而不是localhost:7001。 - Henkolicious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接