Zipkin 在本地运行良好,但在 docker 容器中运行不佳。所有的微服务都在Eureka中注册良好,并且可以很好地通信。但唯一的问题是Zipkin。我收到以下错误:
org.springframework.web.client.ResourceAccessException:I/O 错误 “http://localhost:9411/api/v2/spans”的 POST 请求:连接到 http://localhost:9411 [localhost/127.0.0.1] 失败:连接被拒绝
我的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/api/v2/spans
上的连接被拒绝。当您在 docker 容器内运行应用程序时,您需要不使用 localhost 发送请求,而是通过 docker 网络(在您的情况下为 saman-network )发送请求。要访问运行 zipkin 的 docker 容器,您需要将请求发送到 http://zipkin-server:9411/api/v2/spans
。
从 Spring Boot 3 开始,Sleuth 已被弃用,您将需要使用 micrometer。 要使用 zipkin 进行跟踪,您可以将以下 4 个依赖项添加到您的
pom.xml
文件
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-observation-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
最后,要更改 Zipkin 端点以发送跟踪信息,您需要将以下内容添加到 application.yaml 文件中。
management:
tracing:
sampling:
probability: 1.0 # only for testing purpose, switch back to 0.1 for production code
zipkin:
tracing:
endpoint: http://localhost:9411/api/v2/spans
使用 Spring 配置文件是一个很好的做法,因此您可以复制您的
application.yaml
文件并将其命名为 application-docker.yaml
。在这个新文件中,您可以使用 zipkin 容器名称修改 Zipkin 端点 zipkin-server
。
management:
tracing:
sampling:
probability: 1.0 # only for testing purpose, switch back to 0.1 for production code
zipkin:
tracing:
endpoint: http://zipkin-server:9411/api/v2/spans
您可以在环境中通过
SPRING_PROFILES_ACTIVATE=docker
来激活 Spring 配置文件。
对于您来说,这个解决方案实施起来更快,但我没有测试它。您将 Zipkin url 作为环境值
SPRING.ZIPKIN.BASE-URL
传递到 docker-compose.yml
内。
此属性与 Sleuth 包一起使用。使用 Spring Boot 3 和 micrometer 尝试通过:MANAGEMENT.ZIPKIN.TRACING.ENDPOINT: http://zipkin-server:9411/api/v2/spans
当我从 3.0 降级到 Spring 2.x 时问题就解决了。
目前 Zipkin 似乎与 Spring 3.0 配合得不太好。问题出在 docker 上,而不是本地运行上。我找不到足够的资源来支持这个想法。但根据我的经验,情况确实如此。我在 Spring 3.0.0 中尝试使用带有“最新”标签的 Zipkin,但问题仍然存在。但它确实与 Spring 2.x 配合得很好
在我的 Spring Boot 3 项目中,我遇到了同样的问题,以下解决方案对我有用:
我将以下依赖项添加到我的项目中:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-observation</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-otel</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-zipkin</artifactId>
</dependency>
在我的 Docker Compose 文件中,我设置环境变量如下:
services:
currency-exchange:
image: XX
ports:
- XX
networks:
- XX
depends_on:
- XX
environment:
EUREKA.CLIENT.SERVICEURL.DEFAULTZONE: http://naming-server:8761/eureka
MANAGEMENT.ZIPKIN.TRACING.ENDPOINT: http://zipkin-server:9411/api/v2/spans