天天看點

SpringCloud Alibaba系列 Sleuth Zipkin(五)什麼是鍊路追蹤?鍊路追蹤的作用SpringCloud 整合 Sleuth Zipkin 鍊路追蹤可視化工具SpringCloud 整合 ZipkinZipkin 持久化到 mysql

目錄

什麼是鍊路追蹤?

鍊路追蹤的作用

SpringCloud 整合 Sleuth 

Zipkin 鍊路追蹤可視化工具

部署 zipkin 服務端

從 Github 上下載下傳 Zipkin

啟動 Zipkin 服務

SpringCloud 整合 Zipkin

Zipkin 持久化到 mysql

Sleuth 官網:https://cloud.spring.io/spring-cloud-sleuth/reference/html

Zipkin 官網:https://zipkin.io

什麼是鍊路追蹤?

即調用鍊監控,特點是通過記錄多個在請求間跨服務完成的邏輯請求資訊,幫助開發人員優化性能和進行問題追蹤。鍊路追蹤可以捕獲每個請求遇到的異常和錯誤,以及即時資訊和有價值的資料。

鍊路追蹤的作用

随着微服務應用數量的極速增加,服務與服務鍊路之間的調用關系也變得錯綜複雜。此時,我們也會碰到各種難題。
  • 系統出現問題後,由于服務鍊路過長或過于複雜,無法快速準确定位問題。用戶端(如浏覽器)或者移動端應用報出異常或者錯誤,也無法确定是哪個服務抛出的異常。
  • 某個業務請求非常慢,且總是逾時,無法确定系統哪個環節存在性能的問題。
  • 如何快速發現問題?可以通過調用鍊結合業務日志快速定位錯誤資訊。
  • 如何判斷故障影響範圍?各個階段鍊路耗時、服務依賴關系可以通過可視化界面展現出來,進而直覺地審視故障的影響範圍。

SpringCloud 整合 Sleuth 

pom.xml 中添加依賴

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

啟動微服務項目,随便請求一個接口,我們可以看到 控制台 輸出的 日志帶了上鍊路資訊,如下圖

SpringCloud Alibaba系列 Sleuth Zipkin(五)什麼是鍊路追蹤?鍊路追蹤的作用SpringCloud 整合 Sleuth Zipkin 鍊路追蹤可視化工具SpringCloud 整合 ZipkinZipkin 持久化到 mysql

參數說明:

[order-service,ed01c90c22d328fe,775eef639523a898]
  • 參數一:order-service 表示微服務名稱,spring.application.name 的值
  • 參數二:ed01c90c22d328fe 表示 本次請求的鍊路追蹤 id(Trace ID),本次請求涉及多個下遊服務,鍊路追蹤 id 相同,表示這些都是同一次追蹤
  • 參數三:775eef639523a898 表示 目前服務本次鍊路追蹤的 id(Span ID),本次請求涉及多個下遊服務,每個微服務的 Span ID 都不相同,代表不同的服務。

Zipkin 鍊路追蹤可視化工具

上面可以看到整合Sleuth後有日志列印出來,但是沒有頁面讓我們看到具體的鍊路追蹤資訊。Sleuth 結合 Zipkin 就可以把 鍊路追蹤資訊通過網頁可視化的方式直覺的展現 

部署 zipkin 服務端

  • 從 Github 上下載下傳 Zipkin

https://github.com/openzipkin/zipkin

SpringCloud Alibaba系列 Sleuth Zipkin(五)什麼是鍊路追蹤?鍊路追蹤的作用SpringCloud 整合 Sleuth Zipkin 鍊路追蹤可視化工具SpringCloud 整合 ZipkinZipkin 持久化到 mysql
  • 啟動 Zipkin 服務

注意:啟動 Zipkin 需要 JDK 版本為 1.8 及以上版本

java -jar zipkin-server-2.23.19-exec.jar

Zipkin 預設端口 9411

通路位址:http://ip:9411/zipkin

SpringCloud Alibaba系列 Sleuth Zipkin(五)什麼是鍊路追蹤?鍊路追蹤的作用SpringCloud 整合 Sleuth Zipkin 鍊路追蹤可視化工具SpringCloud 整合 ZipkinZipkin 持久化到 mysql

SpringCloud 整合 Zipkin

pom.xml 中添加依賴

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-zipkin</artifactId>
    <version>2.2.8.RELEASE</version>	<!--zipkin 是第三方的,版本和 spring cloud 不同步,是以要指定版本-->
</dependency>
           

application.yml 檔案配置 zipkin

spring:
  zipkin:
    # 配置 zipkin 服務所在位址
    base-url: http://localhost:9411
    # 不開啟服務發現
    discovery-client-enabled: false
  
  sleuth:
    sampler:
      # 配置 sleuth 鍊路追蹤采樣 百分比,1:百分百,0.1:百分之十。采樣比例過高影響性能
      probability: 0.1
           

配置好後重新開機所有的微服務,然後随便請求一個接口,檢視 Zipkin 可視化頁面

SpringCloud Alibaba系列 Sleuth Zipkin(五)什麼是鍊路追蹤?鍊路追蹤的作用SpringCloud 整合 Sleuth Zipkin 鍊路追蹤可視化工具SpringCloud 整合 ZipkinZipkin 持久化到 mysql

點進去一個鍊路,可以看到請求的鍊路耗時,以及調用的類、接口、方法、服務ip端口、叢集節點等資訊

SpringCloud Alibaba系列 Sleuth Zipkin(五)什麼是鍊路追蹤?鍊路追蹤的作用SpringCloud 整合 Sleuth Zipkin 鍊路追蹤可視化工具SpringCloud 整合 ZipkinZipkin 持久化到 mysql

以及檢視依賴鍊路

SpringCloud Alibaba系列 Sleuth Zipkin(五)什麼是鍊路追蹤?鍊路追蹤的作用SpringCloud 整合 Sleuth Zipkin 鍊路追蹤可視化工具SpringCloud 整合 ZipkinZipkin 持久化到 mysql

Zipkin 持久化到 mysql

  • 資料庫中建立 zipkin 資料腳本

腳本下載下傳位址在 github zipkin項目裡的 zipkin-storage/mysql-v1/src/main/resounce 目錄下 https://github.com/openzipkin/zipkin/tree/master/zipkin-storage/mysql-v1/src/main/resources

或者直接拷貝

--
-- 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;
           

建立一個 zipkin 資料庫,把腳本執行生成 三張表

SpringCloud Alibaba系列 Sleuth Zipkin(五)什麼是鍊路追蹤?鍊路追蹤的作用SpringCloud 整合 Sleuth Zipkin 鍊路追蹤可視化工具SpringCloud 整合 ZipkinZipkin 持久化到 mysql
  • 持久化啟動 zipkin

使用如下指令

// java -jar zipkin-server-2.23.19-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=IP位址 --MYSQL_TCP_PORT=端口 --MYSQL_DB=資料庫名稱 --MYSQL_USER=登入賬号 --MYSQL_PASS=登入密碼

java -jar zipkin-server-2.23.19-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=123456
           
  • 測試 持久化是否成功

随便請求一個接口,檢視資料庫中是否有資料了

SpringCloud Alibaba系列 Sleuth Zipkin(五)什麼是鍊路追蹤?鍊路追蹤的作用SpringCloud 整合 Sleuth Zipkin 鍊路追蹤可視化工具SpringCloud 整合 ZipkinZipkin 持久化到 mysql

完成。