分布式链路追踪技术 Sleuth +Zipkin

(1)每一个需要被追踪踪迹的微服务工程都引入依赖坐标



    org.springframework.cloud
    spring-cloud-starter-sleuth

(2)每一个微服务都修改application.yml配置文件,添加日志级别

#分布式链路追踪
logging:
    level:
        org.springframework.web.servlet.DispatcherServlet: debug
        org.springframework.cloud.sleuth: debug

请求到来时,我们在控制台可以观察到 Sleuth 输出的日志(全局 TraceId、SpanId等)。

        这样的日志首先不容易阅读观察,另外日志分散在各个微服务服务器上,接下来我们使用zipkin统一聚合轨迹日志并进行存储展示。 

(3)结合 Zipkin 展示追踪数据

        Zipkin 包括Zipkin ServerZipkin Client两部分,Zipkin Server是一个单独的服务,Zipkin Client就是具体的微服务

Zipkin Server 构建

  • pom.xml
      
            
                io.zipkin.java
                zipkin-server
                2.12.3
                
                    
                    
                        org.springframework.boot
                        spring-boot-starter-log4j2
                    
                
            
    
            
            
                io.zipkin.java
                zipkin-autoconfigure-ui
                2.12.3
            
  •  入口启动类
    package com.lagou.edu;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import zipkin2.server.internal.EnableZipkinServer;
    
    import javax.sql.DataSource;
    
    @SpringBootApplication
    @EnableZipkinServer // 开启Zipkin 服务器功能
    public class ZipkinServerApplication9411 {
    
        public static void main(String[] args) {
            SpringApplication.run(ZipkinServerApplication9411.class,args);
        }
    
    }
    
  • application.yml
    server:
      port: 9411
    management:
      metrics:
        web:
          server:
            auto-time-requests: false # 关闭自动检测

Zipkin Client 构建(在具体微服务中修改)

  • pom中添加 zipkin 依赖
    
        org.springframework.cloud
        spring-cloud-starter-zipkin
    
  • application.yml 中添加对zipkin server的引用
    spring:
      zipkin:
        base-url: http://127.0.0.1:9411 # zipkin server的请求地址
        sender:
          # web 客户端将踪迹日志数据通过网络请求的方式传送到服务端,另外还有配置
          # kafka/rabbit 客户端将踪迹日志数据传递到mq进行中转
          type: web
        sleuth:
          sampler:
            # 采样率 1 代表100%全部采集 ,默认0.1 代表10% 的请求踪迹数据会被采集
            # 生产环境下,请求量非常大,没有必要所有请求的踪迹数据都采集分析,对于网络包括server端压力都是比较大的,可以配置采样率采集一定比例的请求的踪迹数据进行分析即可
            probability: 1

    另外,对于log日志,依然保持开启debug状态

(4)启动服务器访问,就能看到zipkin页面

        Zipkin server 页面方便我们查看服务调用依赖关系及一些性能指标和异常信息。

(5)追踪数据Zipkin持久化到mysql(这些改动是在zipkinServer中)

  • mysql中创建名称为zipkin的数据库,并执行如下sql语句(官方提供)
    --
    -- Copyright 2015-2019 The OpenZipkin Authors
    --
    -- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
    -- in compliance with the License. You may obtain a copy of the License at
    --
    -- http://www.apache.org/licenses/LICENSE-2.0
    --
    -- Unless required by applicable law or agreed to in writing, software distributed under the License
    -- is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
    -- or implied. See the License for the specific language governing permissions and limitations under
    -- the License.
    --
    CREATE TABLE
    IF
    	NOT EXISTS zipkin_spans (
    		`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
    		`trace_id` BIGINT NOT NULL,
    		`id` BIGINT NOT NULL,
    		`name` VARCHAR ( 255 ) NOT NULL,
    		`remote_service_name` VARCHAR ( 255 ),
    		`parent_id` BIGINT,
    		`debug` BIT ( 1 ),
    		`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
    		`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',
    		PRIMARY KEY ( `trace_id_high`, `trace_id`, `id` ) 
    	) ENGINE = INNODB ROW_FORMAT = COMPRESSED CHARACTER 
    	SET = utf8 COLLATE utf8_general_ci;
    ALTER TABLE zipkin_spans ADD INDEX ( `trace_id_high`, `trace_id` ) COMMENT 'for getTracesByIds';
    ALTER TABLE zipkin_spans ADD INDEX ( `name` ) COMMENT 'for getTraces and getSpanNames';
    ALTER TABLE zipkin_spans ADD INDEX ( `remote_service_name` ) COMMENT 'for getTraces and getRemoteServiceNames';
    ALTER TABLE zipkin_spans ADD INDEX ( `start_ts` ) COMMENT 'for getTraces ordering and range';
    CREATE TABLE
    IF
    	NOT EXISTS zipkin_annotations (
    		`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
    		`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
    		`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
    		`a_key` VARCHAR ( 255 ) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
    		`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
    		`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
    		`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
    	`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
    	`endpoint_ipv6` BINARY ( 16 ) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
    	`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
    	`endpoint_service_name` VARCHAR ( 255 ) COMMENT 'Null when Binary/Annotation.endpoint is null' 
    ) ENGINE = INNODB ROW_FORMAT = COMPRESSED CHARACTER 
    SET = utf8 COLLATE utf8_general_ci;
    ALTER TABLE zipkin_annotations ADD UNIQUE KEY ( `trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp` ) COMMENT 'Ignore insert on duplicate';
    ALTER TABLE zipkin_annotations ADD INDEX ( `trace_id_high`, `trace_id`, `span_id` ) COMMENT 'for joining with zipkin_spans';
    ALTER TABLE zipkin_annotations ADD INDEX ( `trace_id_high`, `trace_id` ) COMMENT 'for getTraces/ByIds';
    ALTER TABLE zipkin_annotations ADD INDEX ( `endpoint_service_name` ) COMMENT 'for getTraces and getServiceNames';
    ALTER TABLE zipkin_annotations ADD INDEX ( `a_type` ) COMMENT 'for getTraces and autocomplete values';
    ALTER TABLE zipkin_annotations ADD INDEX ( `a_key` ) COMMENT 'for getTraces and autocomplete values';
    ALTER TABLE zipkin_annotations ADD INDEX ( `trace_id`, `span_id`, `a_key` ) COMMENT 'for dependencies job';
    CREATE TABLE
    IF
    	NOT EXISTS zipkin_dependencies (
    		`day` DATE NOT NULL,
    		`parent` VARCHAR ( 255 ) NOT NULL,
    		`child` VARCHAR ( 255 ) NOT NULL,
    		`call_count` BIGINT,
    		`error_count` BIGINT,
    		PRIMARY KEY ( `day`, `parent`, `child` ) 
    	) ENGINE = INNODB ROW_FORMAT = COMPRESSED CHARACTER 
    	SET = utf8 COLLATE utf8_general_ci;
  • pom文件引入相关依赖
    
    
        
            lagou-parent
            com.lagou.edu
            1.0-SNAPSHOT
        
        4.0.0
    
        lagou-cloud-zipkin-server-9411
    
    
        
            
            
                io.zipkin.java
                zipkin-server
                2.12.3
                
                    
                    
                        org.springframework.boot
                        spring-boot-starter-log4j2
                    
                
            
    
            
            
                io.zipkin.java
                zipkin-autoconfigure-ui
                2.12.3
            
    
    
            
            
                io.zipkin.java
                zipkin-autoconfigure-storage-mysql
                2.12.3
            
            
                mysql
                mysql-connector-java
            
            
                com.alibaba
                druid-spring-boot-starter
                1.1.10
            
            
            
                org.springframework
                spring-tx
            
            
                org.springframework
                spring-jdbc
            
        
    
  • 修改配置文件,添加如下内容
    server:
      port: 9411
    management:
      metrics:
        web:
          server:
            auto-time-requests: false # 关闭自动检测
    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/zipkin?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
        username: root
        password: 123456
        druid:
          initialSize: 10
          minIdle: 10
          maxActive: 30
          maxWait: 50000
    # 指定zipkin持久化介质为mysql
    zipkin:
      storage:
        type: mysql
  • 启动类中注入事务管理器
    package com.lagou.edu;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.transaction.PlatformTransactionManager;
    import zipkin2.server.internal.EnableZipkinServer;
    
    import javax.sql.DataSource;
    
    @SpringBootApplication
    @EnableZipkinServer // 开启Zipkin 服务器功能
    public class ZipkinServerApplication9411 {
    
        public static void main(String[] args) {
            SpringApplication.run(ZipkinServerApplication9411.class,args);
        }
    
        // 注入事务控制器
        @Bean
        public PlatformTransactionManager transactionManager(DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
    }
    

 

你可能感兴趣的:(SpringCloud,分布式,spring,cloud,链路追踪,Sleuth,zipkin)