基于sleuth和zipkin的Spring-Cloud链路跟踪

基于sleuth和zipkin的Spring-Cloud链路跟踪

文章目录

  • 基于sleuth和zipkin的Spring-Cloud链路跟踪
    • Sleuth
    • Zipkin
    • Zipkin-Server
    • Zipkin-Client
    • Zipkin-Ui

Sleuth

  • sleuth借鉴了google dapper的思路,所以sleuth的原理和dapper几乎一样。

  • google dapper原文档:Dapper, a Large-Scale Distributed Systems Tracing Infrastructure,需科学上网。

  • google dapper文档翻译:Dapper,大规模分布式系统的跟踪系统。

  • sleuthspring cloud中体现为Spring Cloud Sleuth(spring-cloud-starter-sleuth)。

  • sleuth会默认收集很多组件的Span信息,可以在这里 Integrations 查看有哪些组件的Span信息会被采集,当然可以在配置里关闭。

  • 如果想要自定义Span,比如想把一个完全不在默认集成列表里的组件添加到监控中,可以看这里 Managing Spans with Annotations 自定义Span

Zipkin

  • zipkin同样是基于google dapper paper实现的,也是一个分布式链路跟踪系统。

  • zipkin可以分析Sleuth收集的Span信息,做一个链路、错误和依赖关系的可视化。

  • 除了zipkin以外,还可以自己通过其他日志采集和分析系统自定义处理方式,比如logback+Logstash+Kibana

slueth默认通过HTTPSpan信息发送到zipkin,可以依赖KafkarabbitMQ等消息中间件自动化配置,达到通过消息中间件发送到zipkin的目的,以减少链路跟踪系统对业务服务的压力。

  • sleuth默认配置中,一个Span被发送到Zipkin的几率只有10%(0.1),这个配置可以修改。

Zipkin-Server

eureka-server类似,每个客户端服务必须把自己的Span信息主动发送到Zipkin,因此第一步先搭建一个zipkin-server提供给希望被采集Span的服务使用。

  • pom.xml

    	
     
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0modelVersion>
     
        <groupId>com.enmo.dbaasgroupId>
        <artifactId>dbaas-zipkin-serverartifactId>
        <version>1.0-SNAPSHOTversion>
     
        <name>dbaas-zipkin-servername>
        <url>http://www.example.comurl>
     
        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>1.5.10.RELEASEversion>
            <relativePath/> 
        parent>
     
        <properties>
            <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
            <maven.compiler.source>1.8maven.compiler.source>
            <maven.compiler.target>1.8maven.compiler.target>
            <spring-cloud.version>Dalston.SR1spring-cloud.version>
        properties>
     
        <dependencies>
            <dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>4.11version>
                <scope>testscope>
            dependency>
     
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-zipkinartifactId>
            dependency>
     
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-eurekaartifactId>
            dependency>
     
            <dependency>
                <groupId>io.zipkin.javagroupId>
                <artifactId>zipkin-autoconfigure-uiartifactId>
            dependency>
     
            <dependency>
                <groupId>io.zipkin.javagroupId>
                <artifactId>zipkin-serverartifactId>
            dependency>
        dependencies>
     
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloudgroupId>
                    <artifactId>spring-cloud-dependenciesartifactId>
                    <version>${spring-cloud.version}version>
                    <type>pomtype>
                    <scope>importscope>
                dependency>
            dependencies>
        dependencyManagement>
     
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                plugin>
            plugins>
        build>
    project>
    
  • application.properties:

    server.port=9411
     
    spring.application.name=dbaas-zipkin-server
    eureka.client.service-url.defaultZone=http://192.168.20.61:8761/eureka/
    eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${server.port}
    eureka.instance.prefer-ip-address=true
     
    # zipkin 本身并不发送span
    spring.zipkin.enabled=false
    
  • ZipkinServerApplication.java

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

配置完毕后即可启动zipkin-server。

Zipkin-Client

eureka-client类似,希望发送spanzipkin的各个业务服务需要引用sleuth收集span信息,引用zipkin自动配置默认通过HTTP方式,才可以将span信息发送到zipkin-server

  • pom.xml
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-zipkinartifactId>
    dependency>
     
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-sleuthartifactId>
    dependency>
    
  • application.properties:
    # zipkin
    # 打开zipkin discovery
    spring.zipkin.locator.discovery.enabled=true
    # 指定zipkin-server 地址
    spring.zipkin.baseUrl=http://192.168.20.62:9411/
    # 指定span采集概率
    spring.sleuth.sampler.percentage=1.0
    # 指定不采集的路径正则
    #spring.sleuth.web.skipPattern=(^cleanup.*)
    

所有服务配置完毕并成功启动就会自动加入zipkin链路跟踪。

Zipkin-Ui

打开zipkin-server的web页面(192.168.20.62:9411):
基于sleuth和zipkin的Spring-Cloud链路跟踪_第1张图片
页面上的筛选和排序点点就会了,哪个Annotation Query可以点击某一个trace后再点击一个span查看有哪些元数据,然后根据这些元数据查询:
基于sleuth和zipkin的Spring-Cloud链路跟踪_第2张图片
基于sleuth和zipkin的Spring-Cloud链路跟踪_第3张图片
基于sleuth和zipkin的Spring-Cloud链路跟踪_第4张图片
基于sleuth和zipkin的Spring-Cloud链路跟踪_第5张图片
依赖关系非常清楚:
基于sleuth和zipkin的Spring-Cloud链路跟踪_第6张图片

你可能感兴趣的:(Java,spring,cloud)