目錄
什麼是鍊路追蹤?
鍊路追蹤的作用
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>
啟動微服務項目,随便請求一個接口,我們可以看到 控制台 輸出的 日志帶了上鍊路資訊,如下圖
參數說明:
[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
-
啟動 Zipkin 服務
注意:啟動 Zipkin 需要 JDK 版本為 1.8 及以上版本
java -jar zipkin-server-2.23.19-exec.jar
Zipkin 預設端口 9411
通路位址:http://ip:9411/zipkin
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 可視化頁面
點進去一個鍊路,可以看到請求的鍊路耗時,以及調用的類、接口、方法、服務ip端口、叢集節點等資訊
以及檢視依賴鍊路
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 資料庫,把腳本執行生成 三張表
- 持久化啟動 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
- 測試 持久化是否成功
随便請求一個接口,檢視資料庫中是否有資料了
完成。