SpringCloud微服务小白也能搭(Hoxton.SR8)(八)Sleuth|服务链路跟踪

简单上手,直接照搬,就可搭建微服务(Hoxton.SR8) 2020.8.28发布,SpringCloud搭建的文章正在整理,干货不要错过哦

摘要

Spring Cloud Sleuth 是分布式系统中跟踪服务间调用的工具,它可以直观地展示出一次请求的调用过程。随着我们的系统越来越庞大,各个服务间的调用关系也变得越来越复杂。当客户端发起一个请求时,这个请求经过多个服务后,最终返回了结果,经过的每一个服务都有可能发生延迟或错误,从而导致请求失败。这时候我们就需要请求链路跟踪工具来帮助我们,理清请求调用的服务链路,解决问题。

Sleuth配置了您入门所需的一切。这包括将跟踪数据(跨度)报告到的位置,要保留(跟踪)多少个跟踪,是否发送了远程字段(行李)以及要跟踪哪些库。Sleuth配置了这些应用程序,以便将这些请求的时间记录到分布式跟踪系统Zipkin中。跟踪UI可视化延迟,例如一项服务中的时间与等待其他服务的时间。

1.添加链路跟踪支持

1.1参与服务:user-service,feign-service,ribbon-service

我们在以上三个服务里添加依赖

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

1.2 yml 添加zipkin-server访问地址

spring:
  application:
    name: feign-service
  zipkin:
    base-url: http://localhost:9411
    sender:
      type: web
    #设置Sleuth的抽样收集概率,1=100%,因为我们目前是测试环境所以用1
    sleuth:
      sampler:
        probability: 1

2. 搭建链路追踪服务中心(zipkin-server)

zipkin文档

2.1 搭建方式

  1. docker
  2. java -jar
  3. github源码构建
  4. 自行springboot添加依赖搭建(官方不推荐)

我们选择java的方式来进行构建,docker的搭建方式也很快,但因为Windows电脑上没有装docker,所以就先用java -jar 的方式展示功能吧。我当前下的最新版本是2.21.7
下载链接: https://repo1.maven.org/maven2/io/zipkin/zipkin-server/2.21.7/zipkin-server-2.21.7-exec.jar
或者前去官方获取最新版

2.2 启动zipkin

2.2.1打开cmd执行启动命令

java -jar zipkin-server-2.21.7-exec.jar

 2.2.2 成功启动

访问浏览器:http://127.0.0.1:9411

3. 服务测试调用

通过feign-service或者ribbon-service调用user-service,然后刷新zipkin的服务页面

 

4. zipkin 数据持久化

我们想将链路信息保存下来的时候,这样zipkin重启链路数据也不会消失,方便后期查询或者定位问题。

4.1 mysql

当数据量非常庞大的时候,比如上几千万条数据,会产生查询的效率问题,官方不推荐,可用于过渡,后面可使用Elasticsearch

4.1.1 下载sql文件

sql文件:https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql

4.1.2新建数据库

4.1.3 运行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;

4.1.4 重新启动zipkin

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

4.1.5 重新进行接口调用测试

  

4.2 Elasticsearch

4.2.1 下载

版本链接:https://www.elastic.co/cn/downloads/past-releases#elasticsearch

下载链接:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-9-2

下载完后解压出来D:\elasticsearch-7.9.2\bin
进入bin目录双击红圈标识的程序

4.2.2 启动elasticsearch

.\elasticsearch.bat

测试启动:http://localhost:9200/?pretty

4.2.3 管理页面

这边就没做安装了,后面会加更elk的博文

4.2.4 zipkin 重启

java -jar zipkin-server-2.21.7-exec.jar --STORAGE_TYPE=elasticsearch --ES_HOSTS=localhost:9200

5.更多配置

https://github.com/openzipkin/zipkin/tree/master/zipkin-server#elasticsearch-storage

猜你喜欢

转载自blog.csdn.net/itjavaee/article/details/109214961