天天看點

Spring Cloud Alibaba(15)---Sleuth+Zipkin

SpringCloudAlibaba整合Sleuth+Zipkin

有關Sleuth之前有寫過兩篇文章

Spring Cloud Alibaba(13)---Sleuth概述

Spring Cloud Alibaba(14)---SpringCloudAlibaba整合Sleuth

上篇文章我們通過列印日志的方式,看到一個請求的完整鍊路。但是當微服務越來越多日志檔案也會越來越多,查詢工作會變得越來越麻煩,是以這篇我們通過 Zipkin 進行

鍊路跟蹤。Zipkin 可以将日志聚合,并進行可視化展示和全文檢索。

一、Zipkin用戶端搭建

1、快速開始

Zipkin是通過jar的方式運作的,是以我們去官方下載下傳相應的jar包

https://github.com/openzipkin/zipkin
           

在 Quick-start 下面的連結直接下載下傳官方提供的jar包,目前的版本是 zipkin-server-2.23.2-exec.jar,通過java指令運作。

java -jar zipkin-server-2.23.2-exec.jar
           

啟動之後通路zipkin位址

http://127.0.0.1:9411/zipkin/
           

可以看出,Zipkin的用戶端已經搭建好了。

Spring Cloud Alibaba(15)---Sleuth+Zipkin

接下來我們在我們項目中添加相關zipkin配置。

二、SpringCloudAlibaba整合Zipkin

注意

這篇也是在上篇SpringCloudAlibaba已經整合Sleuth的基礎上在整合Zipkin,是以這裡也不把所有代碼都複制在這裡,完整項目代碼會放到github上。

1、pom.xml

在需要進行鍊路追蹤的項目中(服務網關、商品服務、訂單服務)添加 spring-cloud-starter-zipkin 依賴。

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

2、application.yml

spring:
  zipkin:
    base-url: http://127.0.0.1:9411/ #zipkin位址
    discovery-client-enabled: false  #不用開啟服務發現
  sleuth:
    sampler:
      probability: 1.0 #采樣百分比

           

這裡采樣百分比說下: 如果服務的流量很大,全部采集對傳輸、存儲壓力比較大。這個時候可以設定采樣率(如配置為1.0,則采樣率為100%,采集服務的全部追蹤資料),

若不配置預設采樣率是0.1(即10%)。這裡為了等下示範更明顯,是以設定100%抽取。

3、測試

這裡整個請求鍊路如下圖:

Spring Cloud Alibaba(15)---Sleuth+Zipkin

這裡一個完整的鍊路是 一個請求通過

網關服務

,然後轉發到

訂單微服務

,然後訂單微服務中會去調

商品服務

通路位址如下:

#通過網關通路訂單服務
http://localhost:8001/mall-order/api/v1/goods_order/getGoodsByFeign?goodsId=1
           
Spring Cloud Alibaba(15)---Sleuth+Zipkin

請求已經成功,接下來我們來看zipkin用戶端

Spring Cloud Alibaba(15)---Sleuth+Zipkin

發現用戶端已經有一條鍊路,而且順序是 mall-gateway (3) -> mall-order (2) -> mall-goods (1) 跟我們實際請求的順序吻合。

同時我們還可以看具體每個微服務的執行時間

Spring Cloud Alibaba(15)---Sleuth+Zipkin

從這個圖可以看出整個請求鍊路總共花多少時間,每個微服務的執行花費時間。這樣在實際生産場景中如果目前請求響應很慢,那我們可以通過zipkin用戶端就就可以看出哪個服務

執行時間較慢,進而優化。

三、 Zipkin+Mysql持久化

Zipkin Server 預設存儲追蹤資料至記憶體中

,這種方式并不适合生産環境,一旦 Server 關閉重新開機或者服務崩潰,就會導緻曆史資料消失。Zipkin 支援修改存儲政策使用其他

存儲元件,支援 MySQL,Elasticsearch 等。

1、Mysql資料庫腳本

打開 MySQL 資料庫,建立

zipkin

庫,執行以下 SQL 腳本。

官網位址:https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql
           

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

2、部署Zipkin

上面是我們是通過直接 java -jar zipkin-server-2.23.2-exec.jar 啟動的,這裡我們在啟動的時候去指定Mysql配置資訊

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

啟動之後我們再通路上面的接口

#通過網關通路訂單服務
http://localhost:8001/mall-order/api/v1/goods_order/getGoodsByFeign?goodsId=1
           

請求成功後,我們在來看資料庫

Spring Cloud Alibaba(15)---Sleuth+Zipkin

很明顯資料庫已經把資料固化下來了,這樣的話就算我們重新開機zipkin,資料都不會丢失,用戶端一直可以查詢到。

總結

Spring Cloud Alibaba 系列文章到這裡先告一段落了,後期在開發中遇到實際生産問題,在來總結。

github位址

nacos-feign-sentinel-gatway-sleuth

少說多做,句句都會得到别人的重視;多說少做,句句都會受到别人的忽視。(15)