如何将多个SpringBoot微服务连接到MongoDB?解决连接拒绝异常
解决Stock微服务MongoDB连接拒绝问题
问题分析
从异常信息可见,Stock微服务尝试连接localhost:27017被拒绝,而非配置文件中指定的mongodb:27017。结合配置细节,问题根源如下:
- application.yml配置错误:Stock的
application.yml中server.port写成了5000:5000,这是Docker端口映射的写法,Spring Boot的server.port只需指定容器内端口(应为5000),错误配置可能导致Spring加载配置异常,转而读取application.properties中的localhost配置。 - 配置优先级冲突:
application.properties与application.yml共存时,部分场景下properties优先级更高,导致Stock微服务采用了spring.data.mongodb.host=localhost的配置——容器内的localhost指向自身,而非MongoDB容器。 - 服务启动顺序问题:Stock微服务可能在MongoDB容器完全就绪前就发起连接,导致连接失败。
修复步骤
1. 修正Stock微服务的application.yml
将错误的server.port配置改为容器内端口:
server: port: 5000 contextPath: /stock spring: application: name: Stock-Service data: mongodb: uri: mongodb://mongodb:27017/store_stock
2. 统一MongoDB配置(推荐)
删除application.properties中的MongoDB相关配置,避免配置冲突:
# 仅保留端口配置,移除MongoDB相关项 server.port=5000
3. 优化docker-compose.yml配置
- 为stock-service添加依赖,确保MongoDB启动就绪后再启动服务
- 替换MongoDB健康检查命令(mongo镜像默认无
nc,改用官方推荐的ping命令)
修改后的Stock微服务docker-compose.yml:
version: "3.8" services: stock-service: build: . container_name: stock-service ports: - 5000:5000 depends_on: mongodb: condition: service_healthy mongodb: image: mongo:latest healthcheck: test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017 --quiet interval: 5s timeout: 5s retries: 3 container_name: mongodb-stock ports: - 27017:27017
4. 验证修复效果
重新构建并启动容器:
docker-compose down docker-compose build docker-compose up -d
查看Stock微服务日志,确认连接目标为mongodb:27017而非localhost:27017。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

