服务 dockerized 时 RabbitMQ 不工作
RabbitMQ not working when services are dockerized
所以我有 2 个服务。 Kweet
(这是一条推文)和 User
。当我手动 运行 2 项服务 + docker 中的其余服务时,它可以工作。其余服务包括 MongoDB
、RabbitMQ
、Spring Cloud Gateway
、Eureka 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]
尝试过的事情:
- 通过
CachingConnectionFactory
在代码中将主机更改为 [rabbitmq-container-name]
- 在 docker 中将主机更改为 [rabbitmq-container-name] compose with
environment: - spring_rabbitmq_host=[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.internal
和 localhost
而不是 [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 件事。
- 将 Dockerfile
ADD
命令更改为 COPY
(但不要认为这是问题所在)
- 删除了我所有的图像和容器,re-made 它们 a.k.a 而不是
docker-compose up
我应该输入 docker-compose up --build
。这很可能是问题所在
brb gonna cry in a corner
所以我有 2 个服务。 Kweet
(这是一条推文)和 User
。当我手动 运行 2 项服务 + docker 中的其余服务时,它可以工作。其余服务包括 MongoDB
、RabbitMQ
、Spring Cloud Gateway
、Eureka 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]
尝试过的事情:
- 通过
CachingConnectionFactory
在代码中将主机更改为 [rabbitmq-container-name]
- 在 docker 中将主机更改为 [rabbitmq-container-name] compose with
environment: - spring_rabbitmq_host=[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.internal
和localhost
而不是 [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 件事。
- 将 Dockerfile
ADD
命令更改为COPY
(但不要认为这是问题所在) - 删除了我所有的图像和容器,re-made 它们 a.k.a 而不是
docker-compose up
我应该输入docker-compose up --build
。这很可能是问题所在
brb gonna cry in a corner