摘要:注本文首發于公眾號,可長按或掃描下面的小心心來訂閱擴展組件是在微服務調用鏈追蹤中心搭建一文中編寫的與通信的工具組件,利用其追蹤微服務調用鏈的,現在我們想追蹤數據庫調用鏈的話,可以擴展一下其功能。
在前面:微服務調用鏈追蹤中心搭建 一文中我們利用Zipkin搭建了一個微服務調用鏈的追蹤中心,并且模擬了微服務調用的實驗場景。利用Zipkin的庫Brave,我們可以收集一個客戶端請求從發出到被響應 經歷了哪些組件、哪些微服務、請求總時長、每個組件所花時長 等信息。
本文將講述如何利用Zipkin對Mysql數據庫的調用進行追蹤,這里同樣借助OpenZipkin庫Brave來完成。
注: 本文首發于 My 公眾號 CodeSheep ,可 長按 或 掃描 下面的 小心心 來訂閱 ↓ ↓ ↓
ZipkinTool是在《微服務調用鏈追蹤中心搭建》一文中編寫的與Zipkin通信的工具組件,利用其追蹤微服務調用鏈的,現在我們想追蹤Mysql數據庫調用鏈的話,可以擴展一下其功能。
pom.xml添加依賴:
io.zipkin.brave brave-mysql 4.0.6
在ZipkinConfiguration類中添加MySQLStatementInterceptorManagementBean
@Bean public MySQLStatementInterceptorManagementBean mySQLStatementInterceptorManagementBean() { return new MySQLStatementInterceptorManagementBean(brave().clientTracer()); }
依然繼承前文:《微服務調用鏈追蹤中心搭建》,我們改造一下文中的ServiceC這個微服務,在其中添加與Mysql數據庫的交互。
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服務所在IP:3307/test?useSSL=false &statementInterceptors=com.github.kristofa.brave.mysql.MySQLStatementInterceptor &zipkinServiceName=mysqlService spring.datasource.username=root spring.datasource.password=XXXXXX
Controller中添加JdbcTemplate訪問數據庫的代碼
@GetMapping("/mysqltest”) public String mysqlTest() { String name = jdbcTemplate.queryForObject( "SELECT name FROM user WHERE id = 1", String.class ); return "Welcome " + name; }
1. 啟動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. 再啟動一個Mysql容器,接入其中做一些設置
首先進入mysql命令行
docker run -it --rm --link mysql:mysql mysql mysql -hmysql -u root -p
接下來創建數據庫zipkin: 用于存放Zipkin所收集的數據
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`);
這里創建了三個數據表。
該Sql文件可以從以下鏈接獲得:https://github.com/openzipkin...
Sql腳本執行完成后,可以看到zipkin相關的三個表已經建成:
創建數據庫test:用作測試數據庫
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”)
這里插入了一條數據用于實驗。
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
在瀏覽器中輸入:localhost:8883/mysqltest,如果看到以下輸出,就可以證明數據庫調用操作已經成功了!
瀏覽器輸入:http://localhost:9411/zipkin/
打開Zipkin Web UI,點擊服務名下拉列表能看見已經成功識別了Mysql數據庫調用服務
選中mysqlservice后,點擊Find Traces
可以看到 首次查詢 Mysql的調用鏈追蹤信息,有很多
隨便點開某一個查看:
接下來瀏覽器中再次輸入:localhost:8883/mysqltest
目的是再次觸發Mysql的調用,然后再次Find Traces,可以看到追蹤數據類似下圖:包含兩次Mysql的query動作:
點開第一個query查看,其實際上是在 嘗試連接Mysql數據庫
點開第二個query查看,發現這里才是 實際查詢業務
從圖形化界面上可以清楚地知道每個階段的詳細步驟與耗時,因此可以用來分析哪個SQL語句執行相對較慢。
本文實驗所用源碼已經開源,需要的話請 自取。
作者更多的原創文章在此,歡迎觀賞
My Personal Blog
作者更多的SpringBt實踐文章在此:
Spring Boot應用監控實戰
SpringBoot應用部署于外置Tomcat容器
ElasticSearch搜索引擎在SpringBt中的實踐
初探Kotlin+SpringBoot聯合編程
Spring Boot日志框架實踐
SpringBoot優雅編碼之:Lombok加持
如果有興趣,也可以抽點時間看看作者一些關于容器化、微服務化方面的文章:
利用K8S技術棧打造個人私有云 連載文章
從一份配置清單詳解Nginx服務器配置
Docker容器可視化監控中心搭建
利用ELK搭建Docker容器化應用日志中心
RPC框架實踐之:Apache Thrift
RPC框架實踐之:Google gRPC
微服務調用鏈追蹤中心搭建
Docker容器跨主機通信
Docker Swarm集群初探
高效編寫Dockerfile的幾條準則
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27291.html
摘要:一個客戶端請求從發出到被響應經歷了哪些組件哪些微服務請求總時長每個組件所花時長等信息我們有必要了解和收集,以幫助我們定位性能瓶頸進行性能調優,因此監控整個微服務架構的調用鏈十分有必要,本文將闡述如何使用搭建微服務調用鏈追蹤中心。 showImg(https://segmentfault.com/img/remote/1460000014553707); 概述 一個完整的微服務系統包含...
摘要:分布式鏈路追蹤現狀分布式鏈路追蹤的技術有很多,有開源的也有閉源的。個推的實踐個推的微服務是基于和進行部署的,每個微服務對應于中的一組。整體的架構如下圖所示個推基于的分布式鏈路追蹤系統的整體架構其中,也容器化部署在集群中,簡化了的搭建和部署。 showImg(https://segmentfault.com/img/remote/1460000019343537);作者:個推應用平臺基礎...
摘要:主要問題由于新版本新版本實現鏈路追蹤的一些新特性,使得我在實現的過程上踩了不少坑。同樣一些場景下需要保存鏈路追蹤的數據,以備后面觀察對比,所以同樣需要一個來存儲數據。方法一,通過修改基配置文件后啟動。 主要問題 ???? 由于springboot新版本(2.1.0)、springcloud新版本(Greenwich.M1)實現鏈路追蹤sleuth+zipkin的一些新特性,使得我在實...
摘要:服務提供者提供一個接口,服務消費者通過消費服務。服務提供者服務提供者,對外提供一個,并向服務注冊中心注冊,這部分內容,不再講述,見源碼。 微服務架構是一個分布式架構,微服務系統按業務劃分服務單元,一個微服務系統往往有很多個服務單元。由于服務單元數量眾多,業務的復雜性較高,如果出現了錯誤和異常,很難去定位。主要體現在一個請求可能需要調用很多個服務,而內部服務的調用復雜性決定了問題難以定位...
閱讀 2568·2023-04-25 17:33
閱讀 648·2021-11-23 09:51
閱讀 2951·2021-07-30 15:32
閱讀 1395·2019-08-29 18:40
閱讀 1940·2019-08-28 18:19
閱讀 1465·2019-08-26 13:48
閱讀 2237·2019-08-23 16:48
閱讀 2275·2019-08-23 15:56