服务链路追踪

一、服务追踪说明

微服务架构是通过业务来划分服务的,使⽤REST调⽤。对外暴露的⼀个接⼝,可能需要
很多个服务协同才能完成这个接⼝功能,如果链路上任何⼀个服务出现问题或者⽹络超
时,都会形成导致接⼝调⽤失败。

随着业务的不断扩张,服务之间互相调⽤会越来越复杂,它们之间的调⽤关系也许如下:

随着服务的越来越多,对调⽤链的分析会越来越复杂。

二、Zipkin

1、ZipKin是⼀个开放源代码的分布式跟踪系统,由Twitter公司开源,它致⼒于收集服务的
定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。它
的理论模型来⾃于 Google Dapper 论⽂。
2、每个服务向 ZipKin 报告计时数据,ZipKin 会根据调⽤关系通过 ZipKin UI ⽣成依赖关系
图,显示了多少跟踪请求通过每个服务,该系统让开发者可通过⼀个 Web 前端轻松的收
集和分析数据,例如⽤户每次请求服务的处理时间等,可⽅便的监测系统中存在的瓶

三、搭建zipkin服务器

1、创建SpringBoot项⽬(版本2.1.x)

2、添加依赖

<dependency>
  <groupId>io.zipkin.java</groupId>
  <artifactId>zipkin-server</artifactId>
   <version>2.11.10</version>
</dependency>
<!--zipkin界⾯-->
<dependency>
  <groupId>io.zipkin.java</groupId>
  <artifactId>zipkin-autoconfigure-ui</artifactId>
  <version>2.11.10</version>
</dependency>

3、在启动类添加 @EnableZipkinServer 注解

@SpringBootApplication
@EnableZipkinServer
public class ZipkinApplication {
public static void main(String[] args) {
SpringApplication.run(ZipkinApplication.class, args);
}
}

4、配置yml

spring:
application:
name: zipkin
server:
port: 9411
management:
endpoints.web.exposure.include: '*'
metrics.web.server.auto-time-requests: false

四、服务中Sleuth配置

1、在服务应⽤中添加Sleuth依赖

<!-- spring-cloud-sleuth-zipkin -->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-sleuth-zipkin</artifactId>
  <version>2.0.2.RELEASE</version>
</dependency>

2、在服务应⽤中配置yml

spring:
application:
name: goods-provider
zipkin:
enabled: true
base-url: 'http://localhost:9411'
sleuth:
sampler:
probability: 0.1

五、zipkin服务数据存储

1、创建数据库数据表

CREATE TABLE IF NOT EXISTS zipkin_spans (
`trace_id` BIGINT NOT NULL,
`id` BIGINT NOT NULL,
`name` VARCHAR(255) NOT NULL,
`parent_id` BIGINT,
`debug` BIT(1),
`start_ts` BIGINT COMMENT & quot; Span.timestamp(): epoch micros used for endTs query
and to implement TTL & quot;,
`duration` BIGINT COMMENT & quot; Span.duration(): micros used for minDuration
and maxDuration query & quot;
) ENGINE = InnoDB ROW_FORMAT = COMPRESSED;
ALTER TABLE
zipkin_spans
ADD
UNIQUE KEY(`trace_id`, `id`) COMMENT & quot; ignore insert on duplicate & quot;;
ALTER TABLE
zipkin_spans
ADD
INDEX(`trace_id`, `id`) COMMENT & quot; for joining with zipkin_annotations & quot;;
ALTER TABLE
zipkin_spans
ADD
INDEX(`trace_id`) COMMENT & quot; for getTracesByIds & quot;;
ALTER TABLE
zipkin_spans
ADD
INDEX(`name`) COMMENT & quot; for getTraces
and getSpanNames & quot;;
ALTER TABLE
zipkin_spans
ADD
INDEX(`start_ts`) COMMENT & quot; for getTraces ordering
and range & quot;; CREATE TABLE IF NOT EXISTS zipkin_annotations (
`trace_id` BIGINT NOT NULL COMMENT & quot; coincides with zipkin_spans.trace_id & quot;,
`span_id` BIGINT NOT NULL COMMENT & quot; coincides with zipkin_spans.id & quot;,
`a_key` VARCHAR(255) NOT NULL COMMENT & quot; BinaryAnnotation.key
or Annotation.value if type == -1 & quot;,
`a_value` BLOB COMMENT & quot; BinaryAnnotation.value(),
which must be smaller than 64KB & quot;,
`a_type` INT NOT NULL COMMENT & quot; BinaryAnnotation.type()
or -1 if Annotation & quot;,
`a_timestamp` BIGINT COMMENT & quot; Used to implement TTL; Annotation.timestamp
or zipkin_spans.timestamp & quot;,
`endpoint_ipv4` INT COMMENT & quot; Null when Binary / Annotation.endpoint is null & quot;,
`endpoint_ipv6` BINARY(16) COMMENT & quot; Null when Binary / Annotation.endpoint is null,
or no IPv6 address & quot;,
`endpoint_port` SMALLINT COMMENT & quot; Null when Binary / Annotation.endpoint is null & quot;,
`endpoint_service_name` VARCHAR(255) COMMENT & quot; Null when Binary / Annotation.endpoint is null & quot;
) ENGINE = InnoDB ROW_FORMAT = COMPRESSED;
ALTER TABLE
zipkin_annotations
ADD
UNIQUE KEY(
`trace_id`, `span_id`, `a_key`, `a_timestamp`
) COMMENT & quot; Ignore insert on duplicate & quot;;
ALTER TABLE
zipkin_annotations
ADD
INDEX(`trace_id`, `span_id`) COMMENT & quot; for joining with zipkin_spans & quot;;
ALTER TABLE
zipkin_annotations
ADD
INDEX(`trace_id`) COMMENT & quot; for getTraces / ByIds & quot;;
ALTER TABLE
zipkin_annotations
ADD
INDEX(`endpoint_service_name`) COMMENT & quot; for getTraces
and getServiceNames & quot;;
ALTER TABLE
zipkin_annotations
ADD
INDEX(`a_type`) COMMENT & quot; for getTraces & quot;;
ALTER TABLE
zipkin_annotations
ADD
INDEX(`a_key`) COMMENT & quot; for getTraces & quot;; 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;
ALTER TABLE
zipkin_dependencies
ADD
UNIQUE KEY(`day`, `parent`, `child`);

2、pom依赖

<!-- zipkin-storage-mysql-v1 -->
<dependency>
<groupId>io.zipkin.zipkin2</groupId>
<artifactId>zipkin-storage-mysql-v1</artifactId>
<version>2.11.12</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>

3、配置yml

spring:
application:
name: zipkin
datasource:
username: root
password: admin123
driver-class-name: com.mysql.jdbc.Driver
url: 'jdbc:mysql://localhost:3306/zipkin'
zipkin:
storage:
type: mysql
 
 

SpringCloud-ZipKin搭建保姆级教程的更多相关文章

  1. 强大博客搭建全过程(1)-hexo博客搭建保姆级教程

    1. 前言 本人本来使用国内的开源项目solo搭建了博客,但感觉1核CPU2G内存的服务器,还是稍微有点重,包括服务器内还搭建了数据库.如果自己开发然后搭建,耗费时间又比较多,于是乎开始寻找轻量型的博 ...

  2. renren-fast-vue人人开源前端项目搭建保姆级教程

    1.从gitee上clone项目 git clone https://gitee.com/renrenio/renren-fast-vue.git 2.准备好python环境 需要有Python2以上 ...

  3. 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)

    写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...

  4. 自建本地服务器,自建Web服务器——保姆级教程!

    搭建本地服务器,Web服务器--保姆级教程! 本文首发于https://blog.chens.life/How-to-build-your-own-server.html. 先上图!大致思路就是如此. ...

  5. RocketMQ保姆级教程

    大家好,我是三友~~ 上周花了一点时间从头到尾.从无到有地搭建了一套RocketMQ的环境,觉得还挺easy的,所以就写篇文章分享给大家. 整篇文章可以大致分为三个部分,第一部分属于一些核心概念和工作 ...

  6. Eclipse for C/C++ 开发环境部署保姆级教程

    Eclipse for C/C++ 开发环境部署保姆级教程 工欲善其事,必先利其器. 对开发人员来说,顺手的开发工具必定事半功倍.自学编程的小白不知道该选择那个开发工具,Eclipse作为一个功能强大 ...

  7. 保姆级教程:用GPU云主机搭建AI大语言模型并用Flask封装成API,实现用户与模型对话

    导读 在当今的人工智能时代,大型AI模型已成为获得人工智能应用程序的关键.但是,这些巨大的模型需要庞大的计算资源和存储空间,因此搭建这些模型并对它们进行交互需要强大的计算能力,这通常需要使用云计算服务 ...

  8. 保姆级教程,带你认识大数据,从0到1搭建 Hadoop 集群

    大数据简介,概念部分 概念部分,建议之前没有任何大数据相关知识的朋友阅读 大数据概论 什么是大数据 大数据(Big Data)是指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需 ...

  9. vue-cli环境搭建 (超详细保姆级教程)

    一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...

  10. ElasticSearch入门篇(保姆级教程)

    本章将介绍:ElasticSearch的作用,搭建elasticsearch的环境(Windows/Linux),ElasticSearch集群的搭建,可视化客户端插件elasticsearch-he ...

随机推荐

  1. 7.1 套接字(socket)

    套接字(socket)是计算机之间进行通信的一种技术,它允许不同主机上的进程之间进行数据交换.在Python中,我们可以使用socket模块来创建和使用套接字. 首先,我们需要导入socket模块: ...

  2. 逍遥自在学C语言 | 指针的基础用法

    前言 在C语言中,指针是一项重要的概念,它允许我们直接访问和操作内存地址. 可以说,指针是C语言一大优势.用得好,你写程序如同赵子龙百万军中取上将首级:用得不好,则各种问题层出不穷,有种双拳难敌四手的 ...

  3. 1. Spring相关概念

    1. 初始 Spring ‍ 1.1 Spring 家族 ‍ 官网:​https://spring.io,从官网我们可以大概了解到: Spring 能做什么:用以开发 web.微服务以及分布式系统等, ...

  4. 构建 JavaScript ChatGPT 插件

    聊天插件系统是一种令人兴奋的新方式,可以扩展ChatGPT的功能,纳入您自己的业务数据,并为客户与您的业务互动增加另一个渠道.在这篇文章中,我将解释什么是聊天插件,它们能做什么,以及你如何用JavaS ...

  5. stream流根据集合中的元素的属性进行去重的方法

    public class StreamListTest { public static void main(String[] args) { List<Student> studentLi ...

  6. Vue 先初始化子组件再初始化父组件的方法(自定义父子组件mounted执行顺序)

    写在前面: 本篇内容内容主要讲述了,在使用 Konva 进行开发过程中遇到的一些问题.(既然是组件加载顺序,主要牵扯到的就是,父子组件的关系,父子组件的生命周期) 众所周知,Vue中父子组件生命周期的 ...

  7. Unity的OnOpenAsset:深入解析与实用案例

    Unity OnOpenAsset 在Unity中,OnOpenAsset是一个非常有用的回调函数,它可以在用户双击资源文件时自动打开一个编辑器窗口.这个回调函数可以用于自定义资源编辑,提高工作效率. ...

  8. docker ps --no-trunc 与 docker ps

    转载请注明出处: docker ps --no-trunc与docker ps之间的区别在于输出结果的格式. docker ps: 默认情况下,docker ps命令以截断的方式显示结果.这意味着容器 ...

  9. 使用Stable Diffusion制作AI数字人视频的简明教程

    基本方法 搞一张照片,搞一段语音,合成照片和语音,同时让照片中的人物动起来,特别是头.眼睛和嘴. 语音合成 语音合成的方法很多,也比较成熟了,大家可以选择自己方便的,直接录音也可以,只要能生成一个语音 ...

  10. pgrep:根据名称或其他属性查找进程(查找系统中running状态的进程)

    用法示例 # 根据名称过滤 dewan Work ~/code/shell% pgrep qemu 3570191 dewan Work ~/code/shell% pgrep qemu -l 357 ...