博客
关于我
利用Zipkin追踪Mysql数据库调用链
阅读量:560 次
发布时间:2019-03-07

本文共 3081 字,大约阅读时间需要 10 分钟。

利用Zipkin追踪MySQL数据库调用

在前文中,我们已经通过Zipkin搭建了一个微服务调用链的追踪中心,并模拟了微服务调用的实验场景。利用Zipkin的库Brave,我们可以收集一个客户端请求从发出到被响应经历了哪些组件、哪些微服务、请求总时长、每个组件所花时长等信息。

本文将讲述如何利用Zipkin对MySQL数据库的调用进行追踪,这里同样借助OpenZipkin库Brave来完成。

扩展ZipkinTool组件

ZipkinTool是在前文中编写的与Zipkin通信的工具组件。为了追踪MySQL数据库调用链,可以对其进行扩展。具体步骤如下:

  • 添加依赖:在项目的pom.xml中添加Brave MySQL依赖。

    io.zipkin.brave
    brave-mysql
    4.0.6
  • 配置管理bean:在ZipkinConfiguration类中添加MySQLStatementInterceptor管理bean。

    @Beanpublic MySQLStatementInterceptorManagementBean mySQLStatementInterceptorManagementBean() {    return new MySQLStatementInterceptorManagementBean(brave().clientTracer());}
  • 添加MySQL数据库访问的微服务

    依然基于前文,我们需要改造ServiceC微服务,增加对MySQL数据库的交互。具体步骤如下:

  • 添加JDBC和MySQL依赖:在项目的pom.xml中添加JDBC和MySQL驱动。

    org.springframework.boot
    spring-boot-starter-jdbc
    mysql
    mysql-connector-java
    runtime
  • 配置MySQL连接:在application.properties中添加MySQL配置。

    spring.datasource.driver-class-name=com.mysql.jdbc.Driversspring.datasource.url=jdbc:mysql://你的Mysql服务所在IP:3307/test?useSSL=false&statementInterceptors=com.github.kristofa.brave.mysql.MySQLStatementInterceptor&zipkinServiceName=mysqlServicespring.datasource.username=rootspring.datasource.password=XXXXXX
  • 在Controller中添加数据库访问代码

    @GetMapping("/mysqltest")public String mysqlTest() {    String name = jdbcTemplate.queryForObject("SELECT name FROM user WHERE id = 1", String.class);    return "Welcome " + name;}
  • 启动MySQL数据库服务

  • 启动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
  • 启动另一个MySQL容器进行配置

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

    进入MySQL命令行后,执行以下命令创建数据库和表:

    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;
  • 启动Zipkin服务

    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

    启动MySQL数据库访问的微服务(ServiceC)

    在浏览器中输入:localhost:8883/mysqltest,如果能看到以下输出,说明数据库调用操作已经成功:

    Welcome hansonwang99

    Zipkin追踪数据库调用实际实验

  • 浏览器操作

    • 打开Zipkin Web UI,点击服务名下拉列表,可以看到已成功识别的MySQL数据库调用服务。
    • 选中mysqlservice,点击Find Traces,可以看到首次查询MySQL的调用链追踪信息。
    • 随便点开某一个查看,会看到详细的Trace信息,包括各阶段的步骤和耗时。
  • 实验验证

    • 再次输入localhost:8883/mysqltest,目的是触发MySQL的调用,然后再次Find Traces,可以看到两次MySQL的查询动作。
    • 点开第一个Query,发现这是尝试连接MySQL数据库的过程。
    • 点开第二个Query,发现这是实际查询业务的阶段。
  • 通过Zipkin的可视化界面,可以清晰地看到每个阶段的详细步骤和耗时,从而分析哪个SQL语句执行较慢。

    转载地址:http://swinz.baihongyu.com/

    你可能感兴趣的文章
    Nginx 中解决跨域问题
    查看>>
    nginx 代理解决跨域
    查看>>
    Nginx 动静分离与负载均衡的实现
    查看>>
    Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
    查看>>
    nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
    查看>>
    Nginx 反向代理解决跨域问题
    查看>>
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 多端口配置和访问异常问题的排查与优化
    查看>>
    Nginx 如何代理转发传递真实 ip 地址?
    查看>>
    Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    Nginx 学习(一):Nginx 下载和启动
    查看>>
    nginx 常用指令配置总结
    查看>>
    Nginx 常用配置清单
    查看>>
    nginx 常用配置记录
    查看>>
    nginx 开启ssl模块 [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx
    查看>>
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>