SpringCloud系列——分布式链路追踪


  前言

  分布式环境下,服务直接相互调用,一个复杂的业务可能要调用多个服务,例如A -> B -> C -> D,如何追踪http请求的轨迹?

  本文记录Spring Cloud Sleuth + Zipkin实现分布式链路追踪

  代码编写

  zipkin-server

  一个普通SpringBoot项目,继承我们的SpringCloud工程的父类pom,引入zipkin服务依赖,为了方便管理,也将它作为客户端注册到eureka

  pom文件

<dependencies>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
        dependency>

        
        
        <dependency>
            <groupId>io.zipkin.javagroupId>
            <artifactId>zipkin-serverartifactId>
            <version>2.12.3version>
            
            <exclusions>
                <exclusion>
                    <artifactId>log4j-slf4j-implartifactId>
                    <groupId>org.apache.logging.log4jgroupId>
                exclusion>
            exclusions>
        dependency>
        <dependency>
            <groupId>io.zipkin.javagroupId>
            <artifactId>zipkin-autoconfigure-uiartifactId>
            <version>2.12.3version>
        dependency>
    dependencies>

  配置文件

server.port=10000
spring.application.name=zipkin-server

management.metrics.web.server.auto-time-requests=false
#logging.level.root=debug

eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1111/eureka/
#健康检查(需要spring-boot-starter-actuator依赖)
eureka.client.healthcheck.enabled=true
# 续约更新时间间隔(默认30秒)
eureka.instance.lease-renewal-interval-in-seconds=10
# 续约到期时间(默认90秒)
eureka.instance.lease-expiration-duration-in-seconds=10
#eureka服务列表显示ip+端口
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=http://${spring.cloud.client.ip-address}:${server.port}
eureka.instance.hostname= ${spring.cloud.client.ip-address}

  启动类

@EnableZipkinServer
@EnableEurekaClient
@SpringBootApplication
public class ZipkinServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZipkinServerApplication.class, args);
    }

}

  zipkin-client

  每个业务模块都应属于客户端,在我们的demo例子中,service-a、service-b1/service-b2、service-c模块pom都引入

        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-zipkinartifactId>
        dependency>

  新增配置文件zipkin.properties

spring.zipkin.base-url=http://127.0.0.1:10000
spring.sleuth.sampler.probability=1.0

  然后在自定义MyEnvironmentPostProcessor中,将配置文件加载到Environment环境中

   这样便完成一个zipkin-client的配置

  效果演示

  不必启动所以服务,将测试涉及到的服务启动即可(记得启动redis、mysql服务)

   通过zuul网关调用service-a的ribbon接口,进行测试

   访问zipkin-server服务:http://localhost:10000,跳转可视化页面,点击查询查看追踪日志

 

   如果我们关闭service-b服务

   还可以查看请求中的服务依赖关系

 

 

  后记

  分布式链路追踪暂时先记录到这,后续再进行补充

  代码开源

  代码已经开源、托管到我的GitHub、码云:

  GitHub:https://github.com/huanzi-qch/springCloud

  码云:https://gitee.com/huanzi-qch/springCloud