(1)每一个需要被追踪踪迹的微服务工程都引入依赖坐标
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-sleuthartifactId>
- dependency>
(2)每一个微服务都修改application.yml配置文件,添加日志级别
- #分布式链路追踪
- logging:
- level:
- org.springframework.web.servlet.DispatcherServlet: debug
- org.springframework.cloud.sleuth: debug
请求到来时,我们在控制台可以观察到 Sleuth 输出的日志(全局 TraceId、SpanId等)。
这样的日志首先不容易阅读观察,另外日志分散在各个微服务服务器上,接下来我们使用zipkin统一聚合轨迹日志并进行存储展示。
(3)结合 Zipkin 展示追踪数据
Zipkin 包括Zipkin Server和 Zipkin Client两部分,Zipkin Server是一个单独的服务,Zipkin Client就是具体的微服务
Zipkin Server 构建
-
- <dependency>
- <groupId>io.zipkin.javagroupId>
- <artifactId>zipkin-serverartifactId>
- <version>2.12.3version>
- <exclusions>
-
- <exclusion>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-log4j2artifactId>
- exclusion>
- exclusions>
- dependency>
-
-
- <dependency>
- <groupId>io.zipkin.javagroupId>
- <artifactId>zipkin-autoconfigure-uiartifactId>
- <version>2.12.3version>
- dependency>
- 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);
- }
-
- }
- server:
- port: 9411
- management:
- metrics:
- web:
- server:
- auto-time-requests: false # 关闭自动检测
Zipkin Client 构建(在具体微服务中修改)
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-zipkinartifactId>
- dependency>
- 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中)
- --
- -- 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;
- "1.0" encoding="UTF-8"?>
- <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">
- <parent>
- <artifactId>lagou-parentartifactId>
- <groupId>com.lagou.edugroupId>
- <version>1.0-SNAPSHOTversion>
- parent>
- <modelVersion>4.0.0modelVersion>
-
- <artifactId>lagou-cloud-zipkin-server-9411artifactId>
-
-
- <dependencies>
-
- <dependency>
- <groupId>io.zipkin.javagroupId>
- <artifactId>zipkin-serverartifactId>
- <version>2.12.3version>
- <exclusions>
-
- <exclusion>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-log4j2artifactId>
- exclusion>
- exclusions>
- dependency>
-
-
- <dependency>
- <groupId>io.zipkin.javagroupId>
- <artifactId>zipkin-autoconfigure-uiartifactId>
- <version>2.12.3version>
- dependency>
-
-
-
- <dependency>
- <groupId>io.zipkin.javagroupId>
- <artifactId>zipkin-autoconfigure-storage-mysqlartifactId>
- <version>2.12.3version>
- dependency>
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- dependency>
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>druid-spring-boot-starterartifactId>
- <version>1.1.10version>
- dependency>
-
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-txartifactId>
- dependency>
- <dependency>
- <groupId>org.springframeworkgroupId>
- <artifactId>spring-jdbcartifactId>
- dependency>
- dependencies>
- project>
- 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);
- }
- }