Zipkin 无法在 Docker 中工作 - 连接被拒绝

问题描述 投票:0回答:3

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:
spring-boot docker rabbitmq microservices zipkin
3个回答
6
投票

解决方案1

错误告诉您

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 配置文件。


解决方案2

对于您来说,这个解决方案实施起来更快,但我没有测试它。您将 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


0
投票

当我从 3.0 降级到 Spring 2.x 时问题就解决了。

目前 Zipkin 似乎与 Spring 3.0 配合得不太好。问题出在 docker 上,而不是本地运行上。我找不到足够的资源来支持这个想法。但根据我的经验,情况确实如此。我在 Spring 3.0.0 中尝试使用带有“最新”标签的 Zipkin,但问题仍然存在。但它确实与 Spring 2.x 配合得很好


0
投票

在我的 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
© www.soinside.com 2019 - 2024. All rights reserved.