因此,我有2个服务。Kweet
当我手动运行这两个服务+docker中的其余服务时,它就工作了。其余的服务包括MongoDB
、RabbitMQ
、Spring Cloud Gateway
、Eureka 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.internal
和localhost
,而不是[rabbitmq-container-name]
3条答案
按热度按时间z0qdvdin1#
当您停靠时,您的服务将不再侦听
localhost
。如果您需要网络连接服务,则需要使用container_name而不是localhost。localhost指向容器本身,其中只有一个服务在侦听。
有关此here的更多信息
默认情况下,“编写”会为您的应用程序设置一个网络。服务的每个容器都会加入默认网络,并且可由该网络上的其他容器访问,也可由这些容器在与容器名称相同的主机名处发现。
您必须在您的
user-ms
应用程序(我们不知道是哪种应用程序)中的某个地方配置RabbitMQ服务在rabbitmq
(container_name)而不是localhost
上侦听。gkn4icbw2#
尝试使用带有环境变量的容器。对我来说,它足以工作。
我可以在浏览器中打开此容器:http://localhost:15672/上的文件
我使用PHP FPM和Symfony,并将env值传递给此容器以连接到rabbitmq。
对于Java,你需要找到并定义或重新定义应用程序的属性。config可能会使用localhost的默认值,比如
spring.rabbitmq.host=localhost
,但是你需要使用Docker的主机,它是rabbitmq
。kokeuurv3#
我犯了一个严重的错误。在它开始工作之前我做了两件事。
1.将Dockerfile
ADD
命令更改为COPY
(但不要认为这是问题所在)1.删除了我所有的图片和容器,并重新使它们a.k.a而不是
docker-compose up
我应该已经键入docker-compose up --build
.这是最有可能的问题