服务 dockerized 时 RabbitMQ 不工作

RabbitMQ not working when services are dockerized

所以我有 2 个服务。 Kweet(这是一条推文)和 User。当我手动 运行 2 项服务 + docker 中的其余服务时,它可以工作。其余服务包括 MongoDBRabbitMQSpring Cloud GatewayEureka Discovery。但是当我 运行 Docker 中的 2 个(微)服务(我只使用 docker 组合)时,rabbitmq 功能停止工作。正常的 API 调用有效,特别是失败的 RabbitMQ 调用。

RabbitMQ 功能:

EditUsername, edits username in user-service. 
Than sends data via RabbitMQ (this is where it goes wrong I think) to kweet-service where it edits the username of a kweet.

Docker-编写文件:

version: '3.8'

services:
  eureka-service:
    build: ./eureka-discovery-service
    restart: always
    container_name: eureka-service
    ports:
      - 8087:8087

  api-gateway:
    build: ./api-gateway
    restart: always
    container_name: api-gateway
    depends_on:
      - eureka-service
    ports:
      - 8080:8080

  user:
    build: ./user
    restart: unless-stopped
    container_name: user-ms
    ports:
      - 8081:8081
    depends_on:
      - eureka-service

  kweet:
    build: ./kweet
    restart: unless-stopped
    container_name: kweet-ms
    depends_on:
      - eureka-service
    ports:
    - 8082:8082

  mongodb:
    image: mongo
    restart: always
    container_name: mongodb
    ports:
      - 27017:27017

  rabbitmq:
    image: rabbitmq:management
    restart: always
    container_name: rabbitmq
    hostname: rabbitmq
    ports:
      - 5672:5672
      - 15672:15672

当我尝试拨打电话时,控制台显示:

user-ms  |  2022-04-27 08:52:04.823  INFO 1 --- [nio-8081-exec-4] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:5672]

我返回的邮递员状态是 503 Service Unavailable不是我创建的任何 try-catch 中的。有人知道问题出在哪里吗?

编辑[ConnectionFactory]: 我尝试使用文档并添加了 CachingConnectionFactory 但结果相同。我做错了吗? 我将其添加到 RabbitMQ/Message-config(HOST、USERNAME、PASSWORD 来自 application.properties:

@Bean
    public AmqpTemplate template() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory(HOST);
        connectionFactory.setUsername(USERNAME);
        connectionFactory.setPassword(PASSWORD);
        final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(converter());
        return rabbitTemplate;
    }

编辑[docker-撰写]: 找到这个来源 (https://www.linkedin.com/pulse/binding-your-docker-app-container-rabbitmq-phani-bushan/) that got rid of my 503 Service Unavailable error. The problem I found now is that whenever I start up the containers, it generates new queues and exchanges that aren't the ones I set up in my application.properties.

现在每当我打电话时,它都会显示此日志:

user-ms | 2022-04-28 07:36:28.825  INFO 1 --- [nio-8081-exec-1] o.s.a.r.c.CachingConnectionFactory : Created new connection: rabbitConnectionFactory#2ca65ce4:0/SimpleCo
nnection@7e7052f [delegate=amqp://guest@172.23.0.4:5672/, localPort= 43208]

尝试过的事情:

  build: ./user
  restart: unless-stopped
  container_name: user-ms
  depends_on:
    - eureka-service
    - rabbitmq
  ports:
    - 8081:8081
  environment:
    - spring_rabbitmq_host=[rabbitmq-container-name]

尝试使用带有环境变量的容器。对我来说工作够了。

  rabbitmq:
    image: rabbitmq:management
    restart: always
    container_name: rabbitmq
    environment:
      RABBITMQ_DEFAULT_USER: guest
      RABBITMQ_DEFAULT_PASS: guest
      RABBITMQ_DEFAULT_VHOST: /
    ports:
      - 5672:5672
      - 15672:15672

我可以在浏览器中打开这个容器:http://localhost:15672/

我使用 PHP FPM 和 Symfony,并将 env 值传递给此容器以连接到 rabbitmq。

services:
    php-fpm:
        environment:
            ENQUEUE_DSN: amqp://guest:guest@rabbitmq:5672

对于 Java,您需要查找并定义或重新定义应用程序属性。配置可能使用localhost的默认值,像这样spring.rabbitmq.host=localhost,但是你需要使用Docker的主机,它是rabbitmq.

spring.rabbitmq.host=rabbitmq
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

当您 dockerize 时,您的服务将不再监听 localhost。如果您需要网络连接服务,您需要使用 container_name 而不是 localhost。

localhost 指向容器本身,其中只有一个服务在监听。当您在没有容器的笔记本电脑上进行开发时,请不要误会,所有内容都在 localhost

有关此内容的更多信息here

By default Compose sets up a single network for your app. Each container for a service joins the default network and is both reachable by other containers on that network, and discoverable by them at a hostname identical to the container name.

您必须在 user-ms 应用程序(我们不知道是哪种应用程序)的某处配置 RabbitMQ 服务正在侦听 rabbitmq (container_name) 而不是 localhost.

我犯了一个严重的错误。在开始工作之前我做了 2 件事。

  1. 将 Dockerfile ADD 命令更改为 COPY(但不要认为这是问题所在)
  2. 删除了我所有的图像和容器,re-made 它们 a.k.a 而不是 docker-compose up 我应该输入 docker-compose up --build。这很可能是问题所在
brb gonna cry in a corner