1/ sleuth 入門
(1)修改微服務(wù)工程引入Sleuth依賴
<!--sleuth鏈路追蹤-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-starter-sleuth</artifactId>
? ? ? ? </dependency>
(2)?修改配置文件?
修改application.yml添加日志級(jí)別
logging:
? level:
? ? root: info
? ? org.springframework.web.servlet.DispatcherServlet: DEBUG
? ? org.springframework.cloud.sleuth: DEBUG
從網(wǎng)關(guān)到每個(gè)微服務(wù)都需要添加如上的配置撬呢。啟動(dòng)微服務(wù)无宿,調(diào)用之后懂拾,我們可以在控制臺(tái)觀察到sleuth的日志輸 出。
其中 ff8ff8b803a3b558 是TraceId(我理解的是從網(wǎng)關(guān)開(kāi)始創(chuàng)建的一個(gè)總id)低滩,后面跟著的是SpanId(每條日志都要記錄調(diào)用鏈上一個(gè)微服務(wù)的spanid)佛点,依次調(diào)用有一個(gè)全局的TraceId灼捂,將調(diào)用鏈 路串起來(lái)。仔細(xì)分析每個(gè)微服務(wù)的日志佩谣,不難看出請(qǐng)求的具體過(guò)程。
查看日志文件并不是一個(gè)很好的方法实蓬,當(dāng)微服務(wù)越來(lái)越多日志文件也會(huì)越來(lái)越多茸俭,通過(guò)Zipkin可以將日 志聚合,并進(jìn)行可視化展示和全文檢索安皱。
2调鬓、加入zipkin
Zipkin 提供了可插拔數(shù)據(jù)存儲(chǔ)方式:InMemory、MySql酌伊、Cassandra 以及 Elasticsearch腾窝。
Zipkin 分為兩端,一個(gè)是 Zipkin 服務(wù)端居砖,一個(gè)是 Zipkin 客戶端虹脯,客戶端也就是微服務(wù)的應(yīng)用。 客戶端會(huì)配置服務(wù)端的 URL 地址奏候,一旦發(fā)生服務(wù)間的調(diào)用的時(shí)候循集,會(huì)被配置在微服務(wù)里面的 Sleuth 的 監(jiān)聽(tīng)器監(jiān)聽(tīng),并生成相應(yīng)的 Trace 和 Span 信息發(fā)送給服務(wù)端蔗草。 發(fā)送的方式主要有兩種暇榴,一種是 HTTP 報(bào)文的方式厚棵,還有一種是消息總線的方式如 RabbitMQ。
不論哪種方式蔼紧,我們都需要:
一個(gè) Eureka 服務(wù)注冊(cè)中心婆硬,這里我們就用之前的 eureka 項(xiàng)目來(lái)當(dāng)注冊(cè)中心。 一個(gè) Zipkin 服務(wù)端奸例。 多個(gè)微服務(wù)彬犯,這些微服務(wù)中配置Zipkin 客戶端。
(1) Zipkin Server下載查吊,可以從以下鏈接下載 https://repo1.maven.org/maven2/io/zipkin/java/zipkin-server/谐区,我們這里下載的是 zipkin-server-2.12.9-exec.jar
(2) 啟動(dòng) 在命令行輸入 java -jar zipkin-server-2.12.9-exec.jar 啟動(dòng) Zipkin Server
默認(rèn)Zipkin Server的請(qǐng)求端口為 9411?
Zipkin Server的啟動(dòng)參數(shù)可以通過(guò)官方提供的yml配置文件查找https://github.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/resources/zipkin-server-shared.yml
?在瀏覽器輸入 http://127.0.0.1:9411即可進(jìn)入到Zipkin Server的管理后
?客戶端Zipkin+Sleuth整合?
(1)客戶端添加依賴
客戶端指的是需要被追蹤的微服務(wù)
<!--sleuth鏈路追蹤-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-starter-sleuth</artifactId>
? ? ? ? </dependency>
? ? ? ? <!--zipkin依賴-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-starter-zipkin</artifactId>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-sleuth-zipkin</artifactId>
? ? ? ? </dependency>
(2)修改客戶端配置文件
指定了zipkin server的地址,下面制定需采樣的百分比逻卖,默認(rèn)為0.1宋列,即10%,這里配置1评也,是記錄全部 的sleuth信息炼杖,是為了收集到更多的數(shù)據(jù)(僅供測(cè)試用)。在分布式系統(tǒng)中盗迟,過(guò)于頻繁的采樣會(huì)影響系 統(tǒng)性能坤邪,所以這里配置需要采用一個(gè)合適的值
(3) 測(cè)試
啟動(dòng)每個(gè)微服務(wù),啟動(dòng)Zipkin Service罚缕。通過(guò)瀏覽器發(fā)送一次微服務(wù)請(qǐng)求艇纺。打開(kāi) Zipkin Service 控制臺(tái)http://127.0.0.1:9411,我們可以根據(jù)條件追蹤每次請(qǐng)求調(diào)用過(guò)程
基于消息中間件日志收集數(shù)據(jù)邮弹,舉例RabbitMq
(1) rabbitmq 安裝和啟動(dòng)先準(zhǔn)備好黔衡。
(2)zipkin 服務(wù)端啟動(dòng)
java -jar zipkin-server-2.12.9-exec.jar --RABBIT_ADDRESSES=127.0.0.1:5672
?--RABBIT_USER:guest? --RABBIT_PASSWORD=guest
RABBIT_ADDRESSES : 指定RabbitMQ地址
RABBIT_USER: 用戶名(默認(rèn)guest)
RABBIT_PASSWORD : 密碼(默認(rèn)guest
(3)微服務(wù)中的配置
【3.1】引入依賴:
<!--sleuth鏈路追蹤-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-starter-sleuth</artifactId>
? ? ? ? </dependency>
? ? ? ? <!--zipkin依賴-->
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-starter-zipkin</artifactId>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? ? ? <artifactId>spring-cloud-sleuth-zipkin</artifactId>
? ? ? ? </dependency>
? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.springframework.amqp</groupId>
? ? ? ? ? ? <artifactId>spring-rabbit</artifactId>
? ? ? ? </dependency>
【3.2】yml配置文件中的更改
【3.3】測(cè)試
關(guān)閉Zipkin Server,并隨意請(qǐng)求連接腌乡。打開(kāi)rabbitmq管理后臺(tái)可以看到员帮,消息已經(jīng)推送到rabbitmq。 當(dāng)Zipkin Server啟動(dòng)時(shí)导饲,會(huì)自動(dòng)的從rabbitmq獲取消息并消費(fèi)捞高,展示追蹤數(shù)據(jù)
可以看到如下效果:
請(qǐng)求的耗時(shí)時(shí)間不會(huì)出現(xiàn)突然耗時(shí)特長(zhǎng)的情況 當(dāng)ZipkinServer不可用時(shí)(比如關(guān)閉、網(wǎng)絡(luò)不通等)渣锦,追蹤信息不會(huì)丟失硝岗,因?yàn)檫@些信息會(huì)保存在 Rabbitmq服務(wù)器上,直到Zipkin服務(wù)器可用時(shí)袋毙,再?gòu)腞abbitmq中取出這段時(shí)間的信息
存儲(chǔ)跟蹤數(shù)據(jù)到mysql
Zipkin Server默認(rèn)時(shí)間追蹤數(shù)據(jù)信息保存到內(nèi)存型檀,這種方式不適合生產(chǎn)環(huán)境。Zipkin支持將追蹤數(shù)據(jù)持久化到mysql數(shù)據(jù)庫(kù)或者存儲(chǔ)到 elasticsearch中听盖。這里已mysql為例胀溺。
1裂七、準(zhǔn)備數(shù)據(jù)庫(kù)
可以從官網(wǎng)找到Zipkin Server持久mysql的數(shù)據(jù)庫(kù)腳本
/*
SQLyog Ultimate v11.33 (64 bit)
MySQL - 5.5.58 : Database - zipkin
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;
/*!40101 SET SQL_MODE=''*/;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/`zipkin` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `zipkin`;
/*Table structure for table `zipkin_annotations` */
DROP TABLE IF EXISTS `zipkin_annotations`;
CREATE TABLE `zipkin_annotations` (
? `trace_id_high` bigint(20) NOT NULL DEFAULT '0' COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
? `trace_id` bigint(20) NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
? `span_id` bigint(20) 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(11) NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
? `a_timestamp` bigint(20) DEFAULT NULL COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
? `endpoint_ipv4` int(11) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null',
? `endpoint_ipv6` binary(16) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
? `endpoint_port` smallint(6) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null',
? `endpoint_service_name` varchar(255) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null',
? UNIQUE KEY `trace_id_high` (`trace_id_high`,`trace_id`,`span_id`,`a_key`,`a_timestamp`) COMMENT 'Ignore insert on duplicate',
? KEY `trace_id_high_2` (`trace_id_high`,`trace_id`,`span_id`) COMMENT 'for joining with zipkin_spans',
? KEY `trace_id_high_3` (`trace_id_high`,`trace_id`) COMMENT 'for getTraces/ByIds',
? KEY `endpoint_service_name` (`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames',
? KEY `a_type` (`a_type`) COMMENT 'for getTraces',
? KEY `a_key` (`a_key`) COMMENT 'for getTraces',
? KEY `trace_id` (`trace_id`,`span_id`,`a_key`) COMMENT 'for dependencies job'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;
/*Data for the table `zipkin_annotations` */
/*Table structure for table `zipkin_dependencies` */
DROP TABLE IF EXISTS `zipkin_dependencies`;
CREATE TABLE `zipkin_dependencies` (
? `day` date NOT NULL,
? `parent` varchar(255) NOT NULL,
? `child` varchar(255) NOT NULL,
? `call_count` bigint(20) DEFAULT NULL,
? UNIQUE KEY `day` (`day`,`parent`,`child`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;
/*Data for the table `zipkin_dependencies` */
/*Table structure for table `zipkin_spans` */
DROP TABLE IF EXISTS `zipkin_spans`;
CREATE TABLE `zipkin_spans` (
? `trace_id_high` bigint(20) NOT NULL DEFAULT '0' COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
? `trace_id` bigint(20) NOT NULL,
? `id` bigint(20) NOT NULL,
? `name` varchar(255) NOT NULL,
? `parent_id` bigint(20) DEFAULT NULL,
? `debug` bit(1) DEFAULT NULL,
? `start_ts` bigint(20) DEFAULT NULL COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
? `duration` bigint(20) DEFAULT NULL COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',
? UNIQUE KEY `trace_id_high` (`trace_id_high`,`trace_id`,`id`) COMMENT 'ignore insert on duplicate',
? KEY `trace_id_high_2` (`trace_id_high`,`trace_id`,`id`) COMMENT 'for joining with zipkin_annotations',
? KEY `trace_id_high_3` (`trace_id_high`,`trace_id`) COMMENT 'for getTracesByIds',
? KEY `name` (`name`) COMMENT 'for getTraces and getSpanNames',
? KEY `start_ts` (`start_ts`) COMMENT 'for getTraces ordering and range'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;
/*Data for the table `zipkin_spans` */
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
2/ 配置啟動(dòng)服務(wù)端
存到mysql 與默認(rèn)內(nèi)存方式比較,只是數(shù)據(jù)庫(kù)里增加了表仓坞,zipkin服務(wù)端啟動(dòng)增加了mysql 參數(shù)背零,微服務(wù)里添加mysql 驅(qū)動(dòng), 配置文件加入 mysql 數(shù)據(jù)源配置无埃。
可以同時(shí)配置rabbitmq 和mysql 啟動(dòng)參數(shù)徙瓶。