1:在微服务架构中,众多的微服务之间互相调用,如何清晰地记录服务的调用链路是一个需要解决的问题。同时,由于各种原因,跨进程的服务调用失败时,我们门希望能够通过查看日志和查看服务之间的调用关系来定位问题,而Spring cloud sleuth组件正是为了解决微服务跟踪的组件当然 还有很多其他产品。
2:简单了解了sleuth干嘛用的之后我们开始对项目进行整合。
2.1 修改pom文件在里面添加

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

启动项目访问一下看一下日志打印:

springcloud如何调用友的接口获取数据_链路


简单说明一下这个文件格式

其中最前面是TraceId,后面跟着的是SpanId,依次调用有一个全局的TraceId,将调用链路串起来。

此时我们已经可以正常使用sleuth来做链路追踪,但是这样的日志显然不太友好,阅读性太差。

2.2 所以我们要结合另一个组件 zipkin来看,zipkin给我们提供了友好的界面管理来阅读日志。

首先去下载一个zikkin的jar包(springboot2.0以后不在允许我们自定zipkin直接使用官方提供好的jar)直接java -jar xxx.jar 启动 默认端口9411

https://zipkin.io/pages/quickstart.html

2.3 配置项目在pom加入

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

在.yml文件加入配置在spring下级目录

zipkin:
       base-url: http://localhost:9411/ # zipkin的地址 
       discovery-client-enabled: false  #让注册中心把它当成url  而不要当成服务
sleuth:
   sampler:
     probability: 1.0 #标识全部采集取值{0-1}

将所有配置统一修改到其他项目。

我们通过网关项目访问一下会出现入下界面:

http://localhost:9540/study-consumer-service/test_consumer/get_test?token=123456&sign=123456

springcloud如何调用友的接口获取数据_链路_02


同时我们可以点进去查看更详细的链路调用信息。

3: 我们重启 zipkin就会发现zipkin控制台之前采集到的信息全部丢失了。其实zipkin也给我提供了持久化方法,可以在持久化到es,mysql等。

我们将zipkin的数据持久化到mysql。

我到官网找到了mysql的初始化建表语句,直接新建数据库,运行下面的语句即可:(需要注意一下1位置的备注)(https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.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,
  `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',
/* 1:这一行官网给出来的没有 你也可以不加*/
`remote_service_name` varchar(255) DEFAULT NULL 
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations';
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(`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';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces';
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,
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);

运行完以后出现一下3个表

springcloud如何调用友的接口获取数据_spring_03


修改zipkin的启动命令在启动命令后追加数据源信息即可。

java -jar zipkin.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=123456

注:是不是按照以上的步骤 在数据库中也看到链路信息了但是zipkin上面去确查不到信息。这时我们打开zipkin的启动窗口可以看到如下错误

springcloud如何调用友的接口获取数据_spring_04

是不是很神奇他告诉少了个字段,什么鬼sql是他们自己提供的竟然还是少个字段。我们手动的加上这个字段即可。在次重启刷新链路信息依然还在。

本项目地址:https://gitee.com/hylgj/spring-cloud-alibaba-study.git