Docker环境下Zipkin连接失败:请求localhost:9411被拒绝
问题:Docker容器中Zipkin无法正常工作,本地运行正常
Zipkin在本地运行正常,但部署到Docker容器后无法正常工作。所有微服务已成功注册到Eureka且通信正常,仅Zipkin出现问题,报错信息如下:
org.springframework.web.client.ResourceAccessException: I/O error on
POST request for "http://localhost:9411/api/v2/spans": Connect to
http://localhost:9411 [localhost/127.0.0.1] failed: Connection refused
我的docker-compose.yaml配置如下:
version: '3.8' services: currency-exchange: image: samankt/springboot-udemy-currency-exchange:0.0.1-SNAPSHOT mem_limit: 512m ports: - '8000:8000' networks: - saman-network environment: EUREKA.CLIENT.SERVICE-URL.DEFAULTZONE: http://naming-server:8761/eureka EUREKA.INSTANCE.PREFERIPADDRESS: true SPRING.ZIPKIN.BASE-URL: http://zipkin-server:9411/ RABBIT_URI: amqp://guest:guest@rabbitmq:5672 SPRING_RABBITMQ_HOST: rabbitmq SPRING_ZIPKIN_SENDER_TYPE: rabbit depends_on: - naming-server - rabbitmq api-gateway: image: samankt/springboot-udemy-currency-api-gateway:0.0.1-snapshot mem_limit: 512m ports: - '8765:8765' networks: - saman-network environment: EUREKA.CLIENT.SERVICE-URL.DEFAULTZONE: http://naming-server:8761/eureka EUREKA.INSTANCE.PREFERIPADDRESS: true SPRING.ZIPKIN.BASE-URL: http://zipkin-server:9411/ RABBIT_URI: amqp://guest:guest@rabbitmq:5672 SPRING_RABBITMQ_HOST: rabbitmq SPRING_ZIPKIN_SENDER_TYPE: rabbit depends_on: - naming-server - rabbitmq currency-converter: image: samankt/currency-conversion:0.0.1-SNAPSHOT mem_limit: 700m ports: - '8100:8100' networks: - saman-network environment: EUREKA.CLIENT.SERVICE-URL.DEFAULTZONE: http://naming-server:8761/eureka EUREKA.INSTANCE.PREFERIPADDRESS: true SPRING.ZIPKIN.BASE-URL: http://zipkin-server:9411/ SPRING.ZIPKIN.DISCOVERYCLIENTENABLED: true RABBIT_URI: amqp://guest:guest@rabbitmq:5672 SPRING_RABBITMQ_HOST: rabbitmq SPRING_ZIPKIN_SENDER_TYPE: rabbit depends_on: - naming-server - rabbitmq naming-server: image: samankt/naming-server:0.0.1-SNAPSHOT mem_limit: 512m ports: - '8761:8761' environment: SPRING.ZIPKIN.BASE-URL: http://zipkin-server:9411/ networks: - saman-network zipkin-server: image: openzipkin/zipkin:latest mem_limit: 400m ports: - '9411:9411' networks: - saman-network environment: RABBIT_URI: amqp://guest:guest@rabbitmq:5672 depends_on: - rabbitmq restart: always rabbitmq: image: rabbitmq:3.8.12-management ports: - '5672:5672' - '15672:15672' networks: - saman-network networks: saman-network:
解决方案
问题根源
报错显示微服务尝试连接http://localhost:9411,但在Docker容器环境中,每个容器都是独立的网络命名空间,localhost指向容器自身而非宿主机的Zipkin服务。尽管你在docker-compose中配置了SPRING.ZIPKIN.BASE-URL: http://zipkin-server:9411/,但可能存在以下问题:
- 微服务镜像内部的配置文件硬编码了
localhost:9411,覆盖了环境变量的配置 currency-converter服务设置了SPRING.ZIPKIN.DISCOVERYCLIENTENABLED: true,可能导致服务发现逻辑优先于指定的base-url,引发连接错误
修复步骤
- 清理硬编码配置:检查所有微服务的
application.properties或application.yml,删除任何硬编码的spring.zipkin.base-url=http://localhost:9411配置,确保环境变量能正常覆盖。 - 调整发现客户端配置:将
currency-converter服务的SPRING.ZIPKIN.DISCOVERYCLIENTENABLED改为false,因为已经通过环境变量指定了明确的Zipkin地址,无需通过Eureka发现。 - 重启服务集群:修改配置后,若配置是打包在镜像内,需重新构建镜像;然后执行
docker-compose down && docker-compose up -d重启所有服务。 - 验证网络连通性:进入任意微服务容器,执行
curl http://zipkin-server:9411/health,确认能正常访问Zipkin的健康检查接口,验证网络连通性。
额外优化建议
- 添加服务依赖:在每个服务的
depends_on中加入zipkin-server,确保启动顺序合理(注意:depends_on不保证服务就绪,仅保证启动顺序)。 - 配置Zipkin健康检查:为
zipkin-server添加健康检查,确保服务完全就绪后再启动依赖服务,修改后的配置如下:zipkin-server: image: openzipkin/zipkin:latest mem_limit: 400m ports: - '9411:9411' networks: - saman-network environment: RABBIT_URI: amqp://guest:guest@rabbitmq:5672 depends_on: - rabbitmq restart: always healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9411/health"] interval: 10s timeout: 5s retries: 5
内容的提问来源于stack exchange,提问作者Saman KHATAEI
相关产品推荐
相关产品推荐

