zoukankan      html  css  js  c++  java
  • Spring Cloud Alibaba(15)---Sleuth+Zipkin

    SpringCloudAlibaba整合Sleuth+Zipkin

    有关Sleuth之前有写过两篇文章

    Spring Cloud Alibaba(13)---Sleuth概述

    Spring Cloud Alibaba(14)---SpringCloudAlibaba整合Sleuth

    上篇文章我们通过打印日志的方式,看到一个请求的完整链路。但是当微服务越来越多日志文件也会越来越多,查询工作会变得越来越麻烦,所以这篇我们通过 Zipkin 进行

    链路跟踪。Zipkin 可以将日志聚合,并进行可视化展示和全文检索

    一、Zipkin客户端搭建

    1、快速开始

    Zipkin是通过jar的方式运行的,所以我们去官方下载相应的jar包

    https://github.com/openzipkin/zipkin
    

    Quick-start 下面的链接直接下载官方提供的jar包,当前的版本是 zipkin-server-2.23.2-exec.jar,通过java命令运行。

    java -jar zipkin-server-2.23.2-exec.jar
    

    启动之后访问zipkin地址

    http://127.0.0.1:9411/zipkin/
    

    可以看出,Zipkin的客户端已经搭建好了。

    接下来我们在我们项目中添加相关zipkin配置。


    二、SpringCloudAlibaba整合Zipkin

    注意 这篇也是在上篇SpringCloudAlibaba已经整合Sleuth的基础上在整合Zipkin,所以这里也不把所有代码都复制在这里,完整项目代码会放到github上。

    1、pom.xml

    在需要进行链路追踪的项目中(服务网关商品服务订单服务)添加 spring-cloud-starter-zipkin 依赖。

          <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-zipkin</artifactId>
          </dependency>
    

    2、application.yml

    spring:
      zipkin:
        base-url: http://127.0.0.1:9411/ #zipkin地址
        discovery-client-enabled: false  #不用开启服务发现
      sleuth:
        sampler:
          probability: 1.0 #采样百分比
    
    

    这里采样百分比说下: 如果服务的流量很大,全部采集对传输、存储压力比较大。这个时候可以设置采样率(如配置为1.0,则采样率为100%,采集服务的全部追踪数据),

    若不配置默认采样率是0.1(即10%)。这里为了等下演示更明显,所以设置100%抽取。

    3、测试

    这里整个请求链路如下图:

    这里一个完整的链路是 一个请求通过网关服务,然后转发到 订单微服务,然后订单微服务中会去调商品服务

    访问地址如下:

    #通过网关访问订单服务
    http://localhost:8001/mall-order/api/v1/goods_order/getGoodsByFeign?goodsId=1
    

    请求已经成功,接下来我们来看zipkin客户端

    发现客户端已经有一条链路,而且顺序是 mall-gateway (3) -> mall-order (2) -> mall-goods (1) 跟我们实际请求的顺序吻合。

    同时我们还可以看具体每个微服务的执行时间

    从这个图可以看出整个请求链路总共花多少时间,每个微服务的执行花费时间。这样在实际生产场景中如果当前请求响应很慢,那我们可以通过zipkin客户端就就可以看出哪个服务

    执行时间较慢,进而优化。


    三、 Zipkin+Mysql持久化

    Zipkin Server 默认存储追踪数据至内存中,这种方式并不适合生产环境,一旦 Server 关闭重启或者服务崩溃,就会导致历史数据消失。Zipkin 支持修改存储策略使用其他

    存储组件,支持 MySQL,Elasticsearch 等。

    1、Mysql数据库脚本

    打开 MySQL 数据库,创建 zipkin 库,执行以下 SQL 脚本。

    官网地址:https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql
    

    所有sql如下

    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;
    

    2、部署Zipkin

    上面是我们是通过直接 java -jar zipkin-server-2.23.2-exec.jar 启动的,这里我们在启动的时候去指定Mysql配置信息

    java -jar zipkin-server-2.23.2-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=localhost --MYSQL_TCP_PORT=3306 --MYSQL_USER=root --MYSQL_PASS=root --MYSQL_DB=zipkin
    

    启动之后我们再访问上面的接口

    #通过网关访问订单服务
    http://localhost:8001/mall-order/api/v1/goods_order/getGoodsByFeign?goodsId=1
    

    请求成功后,我们在来看数据库

    很明显数据库已经把数据固化下来了,这样的话就算我们重启zipkin,数据都不会丢失,客户端一直可以查询到。

    总结 Spring Cloud Alibaba 系列文章到这里先告一段落了,后期在开发中遇到实际生产问题,在来总结。


    github地址 nacos-feign-sentinel-gatway-sleuth



    少说多做,句句都会得到别人的重视;多说少做,句句都会受到别人的忽视。(15)
    
  • 相关阅读:
    Qt 学习之路:元素布局
    Qt 学习之路 2(80):定位器
    Qt 学习之路 2(79):QML 组件
    Qt 学习之路:QML 组件
    Qt 学习之路:QML 基本元素
    qt 学习之路 :QML 语法
    Qt 学习之路:QML 和 QtQuick 2
    Qt 学习之路:线程总结
    Qt 学习之路:线程和 QObject
    五步教你实现使用Nginx+uWSGI+Django方法部署Django程序
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/14791843.html
Copyright © 2011-2022 走看看