服务链路追踪

一、服务追踪说明

微服务架构是通过业务来划分服务的,使⽤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. 【理论积累】Python中的Pandas库【一】

    Pandas库介绍 Pandas 是一个用于数据分析的 Python 第三方库,能够处理和分析不同格式的数据,例如:CSV.Excel.SQL 数据库等.Pandas 提供了两种数据结构,分别为 Se ...

  2. selenium-wire简介

    一.简介 以下来自chatGPT回答: selenium-wire是一个基于selenium的Python库,它扩展了selenium的功能,使得我们可以在自动化测试中直接访问和修改浏览器的网络请求和 ...

  3. 混沌演练状态下,如何降低应用的 MTTR(平均恢复时间)

    在企业业务领域,锦礼是针对福利.营销.激励等员工采购场景的一站式解决方案,包含面向员工.会员等弹性激励SAAS平台.由于其直接面向公司全体员工,其服务的高可用尤其重要,本文将介绍锦礼商城大促前夕,通过 ...

  4. 对象存储?CRUD Boy实现对文件的增删改查

    大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教. 以下是正文! 对象存储是什么? 对象存储是一种数据 ...

  5. Redis的设计与实现(4)-跳跃表

    跳跃表 (skiplist) 是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的. 跳跃表支持平均 O(log N) 最坏 O(N) 复杂度的节点查找, ...

  6. linux内核编译体验篇(一)

    文章目录 一. 准备环境 二. 获取内核源码 三. 交叉编译工具链的配置 1. 博友们常用安装方法链接 2. 公司常用的交叉工具链使用方法 四. 内核解压以及如何打补丁 五. 内核基本配置 1. 编译 ...

  7. Anaconda 使用时,conda activate 失败

    今天使用一台电脑上新安装的 anaconda 时,运行 conda activate, 出现如下报错: 错误提示中,说要把 . C:\ProgramData\Anaconda3\etc\profile ...

  8. 2021-7-8 VUE的简易表单提交

    <!DOCTYPE html> <html> <head> <title> </title> <style type="te ...

  9. git: 解决每次操作git时都要输入账户、密码

    解决方案 $ git config --global credential.helper store 使用该命令即可解决问题

  10. 如何配置Linux的互信

    如何配置Linux的互信? 这里针对的是root用户的,普通用户家目录/home/test/.ssh. 1.在客户端生成公钥私钥对 [root@auto1 ~]# ssh-keygen -t rsa ...