使用docker-compose部署含Sleuth、Zipkin、RabbitMQ的SpringBoot项目失败求助
问题解决方案
1 docker-compose.yml语法错误修正
多个核心配置因语法错误未生效,需先做如下修改:
- 移除重复
environment块:你每个服务定义了多个environment字段,后定义的会直接覆盖前面的,导致Eureka、Zipkin、RabbitMQ配置全部丢失。此外customermodule配置中还多了一层嵌套的environment字段,属于语法错误。所有服务仅保留一个environment块,所有参数都放在同一块下,参考如下示例:
customermodule: image: kolludocker/customer-customermodule:0.0.1-phase6 ports: - "9095:9095" networks: - eurekaserver-network depends_on: - eurekaserver - rabbitmq - zipkin-server environment: EUREKA.CLIENT.SERVICEURL.DEFAULTZONE: http://eurekaserver:8761/eureka SPRING.ZIPKIN.BASEURL: http://zipkin-server:9411/ RABBIT_URI: amqp://guest:guest@rabbitmq:5672 SPRING_RABBITMQ_HOST: rabbitmq SPRING.ZIPKIN_SENDER_TYPE: rabbit TZ: Asia/Kolkata
- 补充服务依赖:在所有集成Sleuth的服务
depends_on中增加zipkin-server,避免Zipkin未启动完成就启动业务服务导致链路上报失败。 - 升级RabbitMQ版本:你使用的
rabbitmq:3.5.3-management版本过老,和Spring Boot 2.x、Zipkin 2.23版本兼容性差,建议替换为rabbitmq:3.9-management稳定版本。 - 补充Zipkin配置:在zipkin-server的environment中增加
SPRING_RABBITMQ_ADDRESSES: rabbitmq:5672,确保Zipkin能正常从RabbitMQ读取链路数据。
2 application.properties配置修正
- 替换所有本地地址:配置中
spring.datasource.url、eureka.client.service-url.defaultZone、spring.config.import均使用了localhost,容器内部的localhost指向自身而非宿主机或其他服务:- Oracle如果部署在宿主机,将地址中的localhost替换为宿主机局域网IP;如果Oracle也部署在同Docker网络中,替换为Oracle服务的容器名
- Eureka地址替换为
http://eurekaserver:8761/eureka,和docker-compose中服务名保持一致
- 开启Zipkin配置:取消配置中Zipkin相关参数的注释,确保
spring.zipkin.enabled=true、spring.zipkin.sender.type=rabbit参数生效,链路数据会通过RabbitMQ发送而非直连上报。 - 检查Oracle驱动:Oracle JDBC驱动属于商业组件,需确认你构建Spring Boot镜像时已经将适配Oracle 11g的ojdbc6驱动打入镜像,否则启动会报驱动类找不到错误。
3 运行问题优化
- 优化启动顺序:
depends_on仅控制容器启动顺序,不会等待服务内部初始化完成,建议给所有业务服务增加restart: on-failure配置,启动失败后自动重试,等RabbitMQ、Eureka、Zipkin完全就绪后即可正常运行。 - 错误排查:如果修改后仍启动失败,执行
docker logs 容器ID查看具体报错,优先排查三类错误:RabbitMQ连接失败、Eureka连接失败、Oracle数据库连接失败。
内容的提问来源于stack exchange,提问作者Bhardwaja
相关产品推荐
相关产品推荐

