当服务停靠时RabbitMQ不工作

0yg35tkg  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(3)|浏览(180)

因此,我有2个服务。Kweet当我手动运行这两个服务+docker中的其余服务时,它就工作了。其余的服务包括MongoDBRabbitMQSpring Cloud GatewayEureka Discovery。但当我运行这两个服务时,(micro)服务(我只是使用一个docker compose),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.

Dock合成文件:

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]

我得到的 Postman 状态是503 Service Unavailable,这不是我做的任何try-catch的。有人知道问题可能出在哪里吗?

**EDIT[ConnectionFactory]:**我尝试使用文档并添加了一个CachingConnectionFactory,但结果是一样的。我做错了吗?我将此添加到RabbitMQ/Message-config(主机、用户名、密码来自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;
    }

**EDIT [docker-compose]:**找到了这个源代码(https://www.linkedin.com/pulse/binding-your-docker-app-container-rabbitmq-phani-bushan/),它消除了我的503 Service Unavailable错误。我现在发现的问题是,每当我启动容器时,它会生成新的队列和交换,而不是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]

试过的事情:

  • 通过CachingConnectionFactory在代码中将主机更改为[rabbitmq-container-name]
  • 使用environment: - spring_rabbitmq_host=[rabbitmq-container-name]在Docker compose中将主机更改为[rabbitmq-container-name]
build: ./user
  restart: unless-stopped
  container_name: user-ms
  depends_on:
    - eureka-service
    - rabbitmq
  ports:
    - 8081:8081
  environment:
    - spring_rabbitmq_host=[rabbitmq-container-name]
  • 我尝试了host.docker.internallocalhost,而不是[rabbitmq-container-name]
z0qdvdin

z0qdvdin1#

当您停靠时,您的服务将不再侦听localhost。如果您需要网络连接服务,则需要使用container_name而不是localhost。
localhost指向容器本身,其中只有一个服务在侦听。
有关此here的更多信息
默认情况下,“编写”会为您的应用程序设置一个网络。服务的每个容器都会加入默认网络,并且可由该网络上的其他容器访问,也可由这些容器在与容器名称相同的主机名处发现。
您必须在您的user-ms应用程序(我们不知道是哪种应用程序)中的某个地方配置RabbitMQ服务在rabbitmq(container_name)而不是localhost上侦听。

gkn4icbw

gkn4icbw2#

尝试使用带有环境变量的容器。对我来说,它足以工作。

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,你需要找到并定义或重新定义应用程序的属性。config可能会使用localhost的默认值,比如spring.rabbitmq.host=localhost,但是你需要使用Docker的主机,它是rabbitmq

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

kokeuurv3#

我犯了一个严重的错误。在它开始工作之前我做了两件事。
1.将Dockerfile ADD命令更改为COPY(但不要认为这是问题所在)
1.删除了我所有的图片和容器,并重新使它们a.k.a而不是docker-compose up我应该已经键入docker-compose up --build .这是最有可能的问题

brb gonna cry in a corner

相关问题