成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

利用Zipkin追蹤Mysql數(shù)據(jù)庫(kù)調(diào)用鏈

姘存按 / 1966人閱讀

摘要:注本文首發(fā)于公眾號(hào),可長(zhǎng)按或掃描下面的小心心來(lái)訂閱擴(kuò)展組件是在微服務(wù)調(diào)用鏈追蹤中心搭建一文中編寫(xiě)的與通信的工具組件,利用其追蹤微服務(wù)調(diào)用鏈的,現(xiàn)在我們想追蹤數(shù)據(jù)庫(kù)調(diào)用鏈的話,可以擴(kuò)展一下其功能。


概述

在前面:微服務(wù)調(diào)用鏈追蹤中心搭建 一文中我們利用Zipkin搭建了一個(gè)微服務(wù)調(diào)用鏈的追蹤中心,并且模擬了微服務(wù)調(diào)用的實(shí)驗(yàn)場(chǎng)景。利用Zipkin的庫(kù)Brave,我們可以收集一個(gè)客戶端請(qǐng)求從發(fā)出到被響應(yīng) 經(jīng)歷了哪些組件、哪些微服務(wù)、請(qǐng)求總時(shí)長(zhǎng)、每個(gè)組件所花時(shí)長(zhǎng) 等信息。

本文將講述如何利用Zipkin對(duì)Mysql數(shù)據(jù)庫(kù)的調(diào)用進(jìn)行追蹤,這里同樣借助OpenZipkin庫(kù)Brave來(lái)完成。

注: 本文首發(fā)于 My 公眾號(hào) CodeSheep ,可 長(zhǎng)按掃描 下面的 小心心 來(lái)訂閱 ↓ ↓ ↓


擴(kuò)展ZipkinTool組件

ZipkinTool是在《微服務(wù)調(diào)用鏈追蹤中心搭建》一文中編寫(xiě)的與Zipkin通信的工具組件,利用其追蹤微服務(wù)調(diào)用鏈的,現(xiàn)在我們想追蹤Mysql數(shù)據(jù)庫(kù)調(diào)用鏈的話,可以擴(kuò)展一下其功能。

pom.xml添加依賴:


        io.zipkin.brave
        brave-mysql
        4.0.6

在ZipkinConfiguration類中添加MySQLStatementInterceptorManagementBean

    @Bean
    public MySQLStatementInterceptorManagementBean mySQLStatementInterceptorManagementBean() {
        return new MySQLStatementInterceptorManagementBean(brave().clientTracer());
    }

添加Mysql數(shù)據(jù)庫(kù)訪問(wèn)的微服務(wù)

依然繼承前文:《微服務(wù)調(diào)用鏈追蹤中心搭建》,我們改造一下文中的ServiceC這個(gè)微服務(wù),在其中添加與Mysql數(shù)據(jù)庫(kù)的交互。

pom.xml中添加JDBC和Mysql依賴

        
            org.springframework.boot
            spring-boot-starter-jdbc
        
        
            mysql
            mysql-connector-java
            runtime
        

application.properties中添加Mysql連接的配置

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://你的Mysql服務(wù)所在IP:3307/test?useSSL=false
  &statementInterceptors=com.github.kristofa.brave.mysql.MySQLStatementInterceptor
  &zipkinServiceName=mysqlService
spring.datasource.username=root
spring.datasource.password=XXXXXX

Controller中添加JdbcTemplate訪問(wèn)數(shù)據(jù)庫(kù)的代碼

    @GetMapping("/mysqltest”)
    public String mysqlTest() {
        String name = jdbcTemplate.queryForObject( "SELECT name FROM user WHERE id = 1", String.class );
        return "Welcome " + name;
    }

啟動(dòng)Mysql數(shù)據(jù)庫(kù)服務(wù)

1. 啟動(dòng)Mysql容器

docker run -d -p 3307:3306 
-v ~/mysql/data:/var/lib/mysql 
-v ~/mysql/conf:/etc/mysql/conf.d 
-e MYSQL_ROOT_PASSWORD=XXXXXX 
--name mysql mysql

2. 再啟動(dòng)一個(gè)Mysql容器,接入其中做一些設(shè)置

首先進(jìn)入mysql命令行

docker run -it --rm 
--link mysql:mysql mysql 
mysql -hmysql -u root -p

接下來(lái)創(chuàng)建數(shù)據(jù)庫(kù)zipkin: 用于存放Zipkin所收集的數(shù)據(jù)

CREATE DATABASE `zipkin`

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,
  `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’
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT "ignore insert on duplicate’;
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT "for joining with zipkin_annotations’;
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(`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’;
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT "for getTraces’;
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
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);

這里創(chuàng)建了三個(gè)數(shù)據(jù)表。

該Sql文件可以從以下鏈接獲得:https://github.com/openzipkin...

Sql腳本執(zhí)行完成后,可以看到zipkin相關(guān)的三個(gè)表已經(jīng)建成:

創(chuàng)建數(shù)據(jù)庫(kù)test:用作測(cè)試數(shù)據(jù)庫(kù)

CREATE DATABASE `test`
CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `name` varchar(100) DEFAULT NULL ,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET = utf8;

insert into user values (1,”hansonwang99”)

這里插入了一條數(shù)據(jù)用于實(shí)驗(yàn)。


啟動(dòng)zipkin服務(wù)
docker run -d -p 9411:9411 
--link mysql:mysql 
-e STORAGE_TYPE=mysql 
-e MYSQL_HOST=mysql 
-e MYSQL_TCP_PORT=3306 
-e MYSQL_DB=zipkin 
-e MYSQL_USER=root 
-e MYSQL_PASS=XXXXXX 
 --name zipkin openzipkin/zipkin

啟動(dòng)Mysql數(shù)據(jù)庫(kù)訪問(wèn)的微服務(wù)(即ServiceC)

在瀏覽器中輸入:localhost:8883/mysqltest,如果看到以下輸出,就可以證明數(shù)據(jù)庫(kù)調(diào)用操作已經(jīng)成功了!


Zipkin追蹤數(shù)據(jù)庫(kù)調(diào)用實(shí)際實(shí)驗(yàn)

瀏覽器輸入:http://localhost:9411/zipkin/

打開(kāi)Zipkin Web UI,點(diǎn)擊服務(wù)名下拉列表能看見(jiàn)已經(jīng)成功識(shí)別了Mysql數(shù)據(jù)庫(kù)調(diào)用服務(wù)

選中mysqlservice后,點(diǎn)擊Find Traces

可以看到 首次查詢 Mysql的調(diào)用鏈追蹤信息,有很多

隨便點(diǎn)開(kāi)某一個(gè)查看:

接下來(lái)瀏覽器中再次輸入:localhost:8883/mysqltest

目的是再次觸發(fā)Mysql的調(diào)用,然后再次Find Traces,可以看到追蹤數(shù)據(jù)類似下圖:包含兩次Mysql的query動(dòng)作:

點(diǎn)開(kāi)第一個(gè)query查看,其實(shí)際上是在 嘗試連接Mysql數(shù)據(jù)庫(kù)

點(diǎn)開(kāi)第二個(gè)query查看,發(fā)現(xiàn)這里才是 實(shí)際查詢業(yè)務(wù)

從圖形化界面上可以清楚地知道每個(gè)階段的詳細(xì)步驟與耗時(shí),因此可以用來(lái)分析哪個(gè)SQL語(yǔ)句執(zhí)行相對(duì)較慢。


后記

本文實(shí)驗(yàn)所用源碼已經(jīng)開(kāi)源,需要的話請(qǐng) 自取。

作者更多的原創(chuàng)文章在此,歡迎觀賞

My Personal Blog

作者更多的SpringBt實(shí)踐文章在此:

Spring Boot應(yīng)用監(jiān)控實(shí)戰(zhàn)

SpringBoot應(yīng)用部署于外置Tomcat容器

ElasticSearch搜索引擎在SpringBt中的實(shí)踐

初探Kotlin+SpringBoot聯(lián)合編程

Spring Boot日志框架實(shí)踐

SpringBoot優(yōu)雅編碼之:Lombok加持


如果有興趣,也可以抽點(diǎn)時(shí)間看看作者一些關(guān)于容器化、微服務(wù)化方面的文章:

利用K8S技術(shù)棧打造個(gè)人私有云 連載文章

從一份配置清單詳解Nginx服務(wù)器配置

Docker容器可視化監(jiān)控中心搭建

利用ELK搭建Docker容器化應(yīng)用日志中心

RPC框架實(shí)踐之:Apache Thrift

RPC框架實(shí)踐之:Google gRPC

微服務(wù)調(diào)用鏈追蹤中心搭建

Docker容器跨主機(jī)通信

Docker Swarm集群初探

高效編寫(xiě)Dockerfile的幾條準(zhǔn)則



文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/27291.html

相關(guān)文章

  • 微服務(wù)調(diào)用追蹤中心搭建

    摘要:一個(gè)客戶端請(qǐng)求從發(fā)出到被響應(yīng)經(jīng)歷了哪些組件哪些微服務(wù)請(qǐng)求總時(shí)長(zhǎng)每個(gè)組件所花時(shí)長(zhǎng)等信息我們有必要了解和收集,以幫助我們定位性能瓶頸進(jìn)行性能調(diào)優(yōu),因此監(jiān)控整個(gè)微服務(wù)架構(gòu)的調(diào)用鏈?zhǔn)钟斜匾?,本文將闡述如何使用搭建微服務(wù)調(diào)用鏈追蹤中心。 showImg(https://segmentfault.com/img/remote/1460000014553707); 概述 一個(gè)完整的微服務(wù)系統(tǒng)包含...

    Pines_Cheng 評(píng)論0 收藏0
  • 個(gè)推基于Zipkin的分布式追蹤實(shí)踐

    摘要:分布式鏈路追蹤現(xiàn)狀分布式鏈路追蹤的技術(shù)有很多,有開(kāi)源的也有閉源的。個(gè)推的實(shí)踐個(gè)推的微服務(wù)是基于和進(jìn)行部署的,每個(gè)微服務(wù)對(duì)應(yīng)于中的一組。整體的架構(gòu)如下圖所示個(gè)推基于的分布式鏈路追蹤系統(tǒng)的整體架構(gòu)其中,也容器化部署在集群中,簡(jiǎn)化了的搭建和部署。 showImg(https://segmentfault.com/img/remote/1460000019343537);作者:個(gè)推應(yīng)用平臺(tái)基礎(chǔ)...

    stormgens 評(píng)論0 收藏0
  • springboot(2.1.0)+springcloud(Greenwich.M1)實(shí)現(xiàn)追蹤

    摘要:主要問(wèn)題由于新版本新版本實(shí)現(xiàn)鏈路追蹤的一些新特性,使得我在實(shí)現(xiàn)的過(guò)程上踩了不少坑。同樣一些場(chǎng)景下需要保存鏈路追蹤的數(shù)據(jù),以備后面觀察對(duì)比,所以同樣需要一個(gè)來(lái)存儲(chǔ)數(shù)據(jù)。方法一,通過(guò)修改基配置文件后啟動(dòng)。 主要問(wèn)題 ???? 由于springboot新版本(2.1.0)、springcloud新版本(Greenwich.M1)實(shí)現(xiàn)鏈路追蹤sleuth+zipkin的一些新特性,使得我在實(shí)...

    Joonas 評(píng)論0 收藏0
  • Spring Cloud Sleuth 之Greenwich版本全攻略

    摘要:服務(wù)提供者提供一個(gè)接口,服務(wù)消費(fèi)者通過(guò)消費(fèi)服務(wù)。服務(wù)提供者服務(wù)提供者,對(duì)外提供一個(gè),并向服務(wù)注冊(cè)中心注冊(cè),這部分內(nèi)容,不再講述,見(jiàn)源碼。 微服務(wù)架構(gòu)是一個(gè)分布式架構(gòu),微服務(wù)系統(tǒng)按業(yè)務(wù)劃分服務(wù)單元,一個(gè)微服務(wù)系統(tǒng)往往有很多個(gè)服務(wù)單元。由于服務(wù)單元數(shù)量眾多,業(yè)務(wù)的復(fù)雜性較高,如果出現(xiàn)了錯(cuò)誤和異常,很難去定位。主要體現(xiàn)在一個(gè)請(qǐng)求可能需要調(diào)用很多個(gè)服務(wù),而內(nèi)部服務(wù)的調(diào)用復(fù)雜性決定了問(wèn)題難以定位...

    PascalXie 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<