dubbo分布式系统链路追踪_zipkin

2023-10-29

基础知识储备

分布式跟踪的目标

一个分布式系统由若干分布式服务构成,每一个请求会经过多个业务系统并留下足迹,但是这些分散的数据对于问题排查,或是流程优化都很有限,要能做到追踪每个请求的完整链路调用,收集链路调用上每个服务的性能数据,计算性能数据和比对性能指标(SLA),甚至能够再反馈到服务治理中,那么这就是分布式跟踪的目标。

分布式跟踪的目的

zipkin分布式跟踪系统的目的:

  • zipkin为分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪;
  • zipkin通过采集跟踪数据可以帮助开发者深入了解在分布式系统中某一个特定的请求时如何执行的;
  • 假如我们现在有一个用户请求超时,我们就可以将这个超时的请求调用链展示在UI当中;我们可以很快度的定位到导致响应很慢的服务究竟是什么。如果对这个服务细节也很很清晰,那么我们还可以定位是服务中的哪个问题导致超时;
  • zipkin系统让开发者可通过一个Web前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈。

ZipKin介绍

  • Zipkin是一个致力于收集分布式服务的时间数据的分布式跟踪系统。
  • Zipkin 主要涉及四个组件:collector(数据采集),storage(数据存储),search(数据查询),UI(数据展示)。
  • Zipkin提供了可插拔数据存储方式:In-Memory,MySql, Cassandra, Elasticsearch

brave 介绍

Brave 是用来装备 Java 程序的类库,提供了面向标准Servlet、Spring MVC、Http Client、JAX RS、Jersey、Resteasy 和 MySQL 等接口的装备能力,可以通过编写简单的配置和代码,让基于这些框架构建的应用可以向 Zipkin 报告数据。同时 Brave 也提供了非常简单且标准化的接口,在以上封装无法满足要求的时候可以方便扩展与定制。

本文主要介绍springmvc+dubbo下的brave使用。

dubbo项目下快速搭建zipkin、brave追踪系统

1、zipkin安装使用

此处主要介绍linux下的安装使用,zipkin官网地址 http://zipkin.io/pages/quickstart.html

 wget  -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec'

说明:zipkin是springboot项目,该jar包可直接通过java -jar zipkin.jar启动。启动完成后可访问 http://ip:9411查看。

2、zipkin存储与启动

详情参考官网: https://github.com/openzipkin/zipkin/tree/master/zipkin-server

(1)In-Memory方式

 nohup java -jar zipkin.jar  &

注意:内存存储,zipkin重启后数据会丢失,建议测试环境使用

(2)MySql方式

目前只与MySQL的5.6-7。它的设计是易于理解,使用简单。但是,当数据量大时,查询很慢。性能不是很好。

  • 创建数据库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
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

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

  • 启动zipkin命令

$ STORAGE_TYPE=mysql MYSQL_HOST=IP MYSQL_TCP_PORT=3306 MYSQL_DB=zipkin MYSQL_USER=username MYSQL_PASS=password nohup java -jar zipkin.jar &

(3)Elasticsearch方式

本文建议使用此方法。

$ STORAGE_TYPE=elasticsearch ES_HOSTS=http://IP:9200 nohup java -jar zipkin.jar &

3、dubbo项目快速接入

(1)、项目pom中添加brave-dubbo.jar的依赖,brave-dubbo简化dubbo项目接入zipkin的步骤。

     <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-dubbo</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>

(2)、在spring-application.xml中配置brave


        <bean id="brave" class="com.github.kristofa.brave.dubbo.BraveFactoryBean" p:serviceName="serviceName" p:zipkinHost="http://zipkin-server-ip:9411/" p:rate="1.0" />

说明:

  • zipkin-server-ip 是zipkin服务器ip地址。
  • p:serviceName 项目名称。
  • 只要是dubbo项目,无论是普通服务,还是web项目,都需要添加此包,并配置brave Bean。

4、大功告成

此时,你可以看到如下效果。

Paste_Image.png

各个服务之间的调用关系及响应时间

Paste_Image.png


作者:jackcooper
链接:https://www.jianshu.com/p/85f23233345e
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dubbo分布式系统链路追踪_zipkin 的相关文章

  • PCL 1.13.0——中文显示乱码解决办法

    目录 一 问题概述 二 解决方法 一 问题概述 PCL1 13 0中使用的是VTK9 2进行点云的可视化 在使用中发现PCL1 13 0中的setWindowName 进行中文名称显示的时候会出现乱码现象 如下所示 可视化投影结果 boos
  • 特殊矩阵的压缩存储(对称矩阵,三角矩阵和三对角矩阵)

    目录 1 对阵矩阵 2 三角矩阵 3 三对角矩阵 带状矩阵 均假设数组的下标从0开始 1 对阵矩阵 定义 若对一个n阶矩阵A中的任意一个元素 a 都有a a 1 i j n 则称其为对称矩阵 存储策略 只存储主对角线 下三角区 或主对角线
  • shardingsphere的坑。。。

    前面有说到defaultDataSource设置不生效 手动修改后 此项还勉强能用 如今又遇到一个奇葩的问题 本地调试时一切正常 丢到服务器后就一直报错 重点是 只是说空指针 就是不说具体哪里有毛病 报错信息如下 Creating a ne
  • 数据库连接用法

    1 内联接 典型的联接运算 使用像 或 lt gt 之类的比较运算符 包括相等联接和自然联接 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行 例如 检索 students和courses表中学生标识号相同的所有行 2 外联接 外

随机推荐

  • Java编程工具哪种好?

    Java强大的功能需要依托在软件工具上实现 所以Java编程开发需要用到编程工具 市面上有哪些Java编程工具呢 那种编程工具好呢 该怎么选择呢 接下来罗列了一系列的Java编程开发工具 一 idea 这是jetbrains公司的产品 也是
  • 从0实现基于Linux socket聊天室-多线程服务器模型-1

    前言 Socket在实际系统程序开发当中 应用非常广泛 也非常重要 实际应用中服务器经常需要支持多个客户端连接 实现高并发服务器模型显得尤为重要 高并发服务器从简单的循环服务器模型处理少量网络并发请求 演进到解决C10K C10M问题的高并
  • linux下gcc/g++编译器使用

    linux编译器gcc g 使用 1 gcc 编译器编译c语言程序 gcc 文件名 默认生成a out 可执行程序程序 我们执行a out由两种方法 相对路径 绝对路径 进行程序的翻译 1 预处理 进行宏替换 头文件展开 去注释 条件编译
  • kettle开发篇-流查询-Day25

    前言 昨天我们讲了数据库相关操作 数据库连接来实现两个库的跨库查询 对应复杂的跨库查询通过数据库连接整合到一块后 就像是在一个数据库里面操作 今天我们来学习流查询 流查询主要用于在查询前把数据加载到内存中 并且只能进行等值查询 一 流查询
  • 51单片机波特率计算c语言,51单片机波特率怎么算?51单片机波特率计算公式

    51单片机波特率怎么算 51单片机波特率计算公式 方式0 方式0的波特率固定为主振频率的1 12 方式2 方式2的波特率由PCON中的选择位SMOD来决定 可由下式表示 波特率 2的SMOD次方除以64再乘一个fosc 也就是当SMOD 1
  • Spring三大核心思想详解

    spring核心思想分三大类 控制反转 IOC 依赖注入 DI 和面向切面 AOP 控制反转 通俗讲 控制权由应用代码中转到了外部容器 控制权的转移 是所谓反转 也就是说 正常我们都是新建对象 才可以调用对象 现在不需要了 交给容器来管理
  • 数据结构与算法(29):KMP算法(核心思想分析)及其相关应用实例(与暴力字符串匹配代码实现)

    应用场景 字符串匹配问题 字符串匹配问题 有一个字符串 str1 陈骁聪 陈骁聪你陈骁 陈骁聪你陈骁聪你陈骁你好 和一个子串 str2 陈骁聪你陈骁你 现在要判断 str1 是否含有 str2 如果存在 就返回第一次出现的位置 如果没有 则
  • 如何引入elementUI

    elementUI的引入 完整引入 按需引入 完整引入 在 main js 中写入以下内容 import Vue from vue import ElementUI from element ui import element ui lib
  • vue移动端拖拽悬浮按钮

    vue移动端拖拽悬浮按钮 功能介绍 大致需求 整体思路 简单效果展示 具体实现 一 position fixed布局 二 touch事件绑定 三 页面引入 功能介绍 在移动端开发中 实现悬浮按钮在侧边显示 为不遮挡页面内容 允许手指拖拽换位
  • 发起HTTP请求--Curl

    curl 是常用的命令行工具 用来请求 Web 服务器 它的名字就是客户端 client 的 URL 工具的意思 它的功能非常强大 命令行参数多达几十种 如果熟练的话 完全可以取代 Postman 这一类的图形界面工具 我们可以使用cURL
  • CTFshow(web21-web28)

    web21 考点tomcat 认证爆破之custom iterator使用 https www cnblogs com 007NBqaq p 13220297 html 下载密码字典抓包 通过burpsuite暴力破解 Payload se
  • 原生JS实现ajax 发送post请求

    1 代码 原生JS实现ajax 发送post请求
  • fluxion 无法连接虚假AP热点,DHCP服务启动失败

    记录一个使用fluxion时 无法连接至虚假AP的DHCP问题 编辑 fluxion attacks Captive Portal attack sh gedit fluxion attacks Captive Portal attack
  • 基于Spring-AOP写的切面和注解,解决一些跟业务逻辑无关的公共问题处理方法

    技术点 Spring Aop 反射 背景 目前在做一个项目 做数据库设计的时候对一些表进行了埋点 比如跟我业务相关的每个表 都有create time create user id create user name update time
  • 训练正常&异常的GAN损失函数loss变化应该是怎么样的

    这里以个人用到的一个网络为例 仅供参考 不代表所有情形 用tensorboard记录loss曲线的走向 横轴为迭代次数 iter 纵轴为损失 loss 值 正常的 判别器loss loss在2 6到3 4之间来回上下波动 注意 在tenso
  • WIN10手动添加开机启动项,自己测试可用

    方法 开机启动文件夹 1 我们打开文件夹 C Users 用户 Administrator 当前用户名 AppData Roaming Microsoft Windows Start Menu Programs 开始 菜单 Programs
  • Git Tag 打标签

    晚来天欲雪 能饮一杯无 这位大侠 硬套路在此 接招 提交标签 git add git commit m fixed some bugs git tag a 0 1 3 m Release version 0 1 3 可以给指定commit打
  • element基础详情页-文本描述组件

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 分享一个使用比较久的 最新版本element ui 已支持详情描述组件 直接使用即可 前言 对于常做topB系统的小伙伴们 基础信息详情页是最常见不过的 使用 只是
  • android打开sdcard读写文件、访问网络权限

    去工程的AndroidManifest xml 添加
  • dubbo分布式系统链路追踪_zipkin

    基础知识储备 分布式跟踪的目标 一个分布式系统由若干分布式服务构成 每一个请求会经过多个业务系统并留下足迹 但是这些分散的数据对于问题排查 或是流程优化都很有限 要能做到追踪每个请求的完整链路调用 收集链路调用上每个服务的性能数据 计算性能