sleuth主要功能是在分布式系统中提供追踪解决方案,并且兼容支持了zipkin(提供了链路追踪的可视化功能)

zipkin原理:在服务调用的请求和响应中加入ID,表明上下游请求的关系。

利用这些信息,可以可视化地分析服务调用链路和服务间的依赖关系。

sleuth是对zipkin的封装,对应Span,Trace等信息的生成、接入http request,以及向Zipkin server发送采集信息等全部自动化完成。

目前主流的链路追踪组件有:google的Dapper,Twitter的zipkin和阿里的Eagleeye(鹰眼)。

1. 搭建zipkin服务器

1.1 创建springboot项目,引入相应的jar依赖(其他依赖参考前面的教材)

io.zipkin.java

zipkin-server

io.zipkin.java

zipkin-autoconfigure-ui

1.2 添加配置文件

server:

port: 8769

spring:

application:

name: zipkin-server

eureka:

client:

serviceUrl:

defaultZone: http://localhost:8761/eureka/ #注册服务器地址

management:

security:

enabled: false #关闭验证

info: #/info请求的显示信息

app:

name: ${spring.application.name}

version: 1.0.0

build:

artifactId: @project.artifactId@

version: @project.version@

1.3 在启动类中声明为zipkin服务器

@SpringBootApplication

@EnableDiscoveryClient

@EnableZipkinServer//zipkin服务器 默认使用http进行通信

public classZipkinServerApp {public static voidmain(String[] args) {

SpringApplication.run(ZipkinServerApp.class, args);

}

}

1.4 启动查看效果

2  分别在cloud-consumer-ribbon和cloud-consumer-feign中引入zipkin

2.1 引入zipkin依赖

org.springframework.cloud

spring-cloud-starter-zipkin

org.springframework.cloud

spring-cloud-sleuth-zipkin

org.springframework.cloud

spring-cloud-starter-sleuth

2.2 在配置文件中声明zipkin服务器的地址

spring:

zipkin:

base-url: http://localhost:8769

2.3 在项目中调用需要的服务

@RequestMapping("hello")

public String helloConsumer() {

//使用restTemplate调用消费服务提供者的SERVICE-HI的info服务

//String response=restTemplate.getForObject("http://cloud-consumer-feign/hi", String.class);

String response=hiService.sayHello()+" ribbon";

logger.info(response);

return response;

}

2.4 启动项目查看

有时候可能在zipkin服务器中看不到数据,那是因为默认sleuth收集信息的比率是0.1 ,针对于这个问题有两种解决方法:

a 在配置文件中配置 spring.sleuth.sampler.percentage=1

b 在代码中声明

//100%的来采集日志,和在配置文件中配置spring.sleuth.sampler.percentage=1是一样的

@BeanpublicAlwaysSampler defaultSampler(){return newAlwaysSampler();

}

但这样每个请求都会向zipkin server发送http请求,通信效率低,造成网络延迟。

而且所用的追踪信息都在内存中保存,重启zipkin server后信息丢失

针对以上的问题的解决方法:

a 采用socket或高效率的通信方式

b 采用异步方式发送信息数据

c 在客户端和zipkin之间增加缓存类的中间件,如redis,mq等,即时zipkin server重启过程中,客户端依然可以将数据发送成功

3 将http通信改为mq异步通信方式

3.1 修改zipkin server

3.1.1 将原来的依赖io.zipkin.java:zipkin-server换成spring-cloud-sleuth-zipkin-stream和spring-cloud-starter-stream-rabbit

org.springframework.cloud

spring-cloud-sleuth-zipkin-stream

org.springframework.cloud

spring-cloud-starter-stream-rabbit

io.zipkin.java

zipkin-autoconfigure-ui

3.1.2 在配置文件中配置ribbitmq地址

spring:

application:

name: zipkin-server

rabbitmq: #配置mq消息队列

host: localhost

port: 5672

username: guest

password: guest

3.1.3 在启动类中使用@EnableZipkinStreamServer替换@EnableZipkinServer

@SpringBootApplication

@EnableDiscoveryClient//@EnableZipkinServer//zipkin服务器 默认使用http进行通信

@EnableZipkinStreamServer //采用stream方式启动zipkin server ,也支持http通信 包含了@EnableZipkinServer,同时创建了rabbit-mq消息队列监听器

public classZipkinServerApp {public static voidmain(String[] args) {

SpringApplication.run(ZipkinServerApp.class, args);

}

}

3.2 配置客户端(这里只配置一个客户端,其他的客户端配置一样配置即可)

3.2.1 将原来的spring-cloud-starter-zipkin依赖,使用以下依赖进行替换

org.springframework.cloud

spring-cloud-sleuth-zipkin-stream

org.springframework.cloud

spring-cloud-starter-stream-rabbit

org.springframework.cloud

spring-cloud-starter-sleuth

3.2.2 在配置文件中加入ribbitmq的配置

spring:

rabbitmq: #配置mq消息队列

host: localhost

port: 5672

username: guest

password: guest

3.3 现在启动其他项目,不启动zipkin server,进行项目访问,会把追踪信息放入到ribbitmq中,当zipkin server启动后会直接冲zipkin server中获取信息

4 将追踪信息保存到数据库(只需修改zipkin server即可)

4.1 引入mysql数据库依赖

mysql

mysql-connector-java

org.springframework.boot

spring-boot-starter-jdbc

4.2 在配置文件msql连接

spring:

sleuth:

enabled: false #表示当前程序不使用sleuth

datasource: #配置msyql 连接

schema[0]: classpath:/zipkin.sql #数据库创建脚本,可以到官网下载

url: jdbc:mysql://localhost:3306/zipkin?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false

username: root

password: root

driver-class-name: com.mysql.jdbc.Driver

initialize: true

continue-on-error: true

zipkin:

storage:

type: mysql #mysql存储zipkin追踪信息

4.3 创建数据库和表

CREATE TABLE IF NOT EXISTSzipkin_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 EXISTSzipkin_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 EXISTSzipkin_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`);

sleuth zipkin mysql_springCloud的使用08-----服务链路追踪(sleuth+zipkin)相关推荐

  1. 微服务链路追踪之zipkin搭建

    前言 微服务治理方案中,链路追踪是必修课,SpringCloud的组件其实使用很简单,生产环境中真正令人头疼的往往是软件维护,接口在微服务间的调用究竟哪个环节出现了问题,哪个环节耗时较长,这都是项目上 ...

  2. 「Java分享客栈」随时用随时翻:微服务链路追踪之zipkin搭建

    前言 微服务治理方案中,链路追踪是必修课,SpringCloud的组件其实使用很简单,生产环境中真正令人头疼的往往是软件维护,接口在微服务间的调用究竟哪个环节出现了问题,哪个环节耗时较长,这都是项目上 ...

  3. 07-搭建微服务-链路追踪Sleuth

    1.为什么使用链路追踪? 在微服务中,随着服务越来越多,对调用链的分析越来越复杂. 出现问题: 1.微服务之间的调用错综复杂,用户发送的请求经历哪些服务,调用链不清楚,没有一个自动化的工具类来维护调用 ...

  4. 服务链路追踪配置mysql_学习微服务的服务链路追踪——Spring Cloud Sleuth+zipkin

    spring cloud sleuth提供了服务链路追踪,并兼容了zipkin,Zipkin是一个链路跟踪工具,可以用来监控微服务集群中调用链路的通畅情况. 1.本来想新建一个有关zipkin-ser ...

  5. 谷粒商城二十五springCloud之Sleuth+Zipkin 服务链路追踪

    为什么用 分布式系统庞大而复杂,服务众多,调用关系网也非常复杂, 服务上线以后如果出现了某些错误,错误的异常就很难定位. 一个请求可能调用了非常多的链路,我们需要知道到底哪一块儿出现了错误. 最终希望 ...

  6. SpringCloud教程- 服务链路追踪(Spring Cloud Sleuth)(SpringCloud版本Greenwich.SR4)

    文章目录 一.Sleuth简介 二.为何使用Sleuth 三.构建工程 server-zipkin zipkin-serivce-hi zipkin-server-hello 四. 启动工程演示 代码 ...

  7. 《深入理解 Spring Cloud 与微服务构建》第十四章 服务链路追踪 Spring Cloud Sleuth

    <深入理解 Spring Cloud 与微服务构建>第十四章 服务链路追踪 Spring Cloud Sleuth 文章目录 <深入理解 Spring Cloud 与微服务构建> ...

  8. 还搭不出来服务链路追踪Spring Cloud Sleuth?

    Spring Cloud Sleuth 作为Spring Cloud 的一个组件,其主要作用是解决分布式系统当中提供服务链路追踪的. 为什么要使用链路追踪? 在微服务系统中,一个来自用户的请求,请求先 ...

  9. springcloud使用zipkin和rabbitmq进行服务链路追踪

    继上一篇 添加链接描述我们简单搭建了关于springcloud的服务链路追踪与分析,本篇我们在此基础上加入rabbitmq的整合,从而搭建一套简易的使用rabbitmq进行服务追踪的框架: 为什么加入 ...

  10. 微服务治理之分布式链路追踪--3.zipkin实战

    微服务治理之分布式链路追踪–3.zipkin实战 本节是基于zipkin分布式追踪系统搭建,因为对 scala 和 play framework 2 框架不熟悉,所以,没有采用opentelemetr ...

最新文章

  1. 我的Chrome常用快捷键
  2. 高级开发必须理解的Java中SPI机制
  3. Android中Handler消息传递机制应用之子线程不允许操作主线程的组件
  4. 低压电力采集平台DW710C与PC沟通
  5. linux7无法进入系统,记录一次断电导致centos7.4系统不能正常进入的解决方案
  6. activiti 常见问题总结
  7. 如何快速构建一个 Spring Boot 工程?
  8. Codeforces Round #360 (Div. 2) C. NP-Hard Problem 水题
  9. bootstrap多模态框
  10. [BZOJ1999][codevs1167][Noip2007]Core树网的核
  11. MusicXML 3.0 (31) - Tab
  12. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_19-页面静态化-模板管理-模板存储...
  13. 软件开发模型:瀑布模型,增量模型,原型模型,螺旋模型,喷泉模型,敏捷开发模型
  14. java docx4j 目录_使用Docx4j创建word文档
  15. 瞬变抑制二极管的选型
  16. python如何画三角形的外接圆_用python画三角形外接圆和内切圆
  17. 疯狂模渲大师链接永久是最新版|怎么安装客户端并激活素材库联系作者加载自营专属素材扩展包高效使用超一流辅助插件脚本工具的步骤教程?...
  18. 随机数 == 伪随机数?
  19. java代码借助插件生成组织架构图并实现导出功能
  20. 银行计算机专业面试,建设银行计算机专业面试问题汇总和精彩回答

热门文章

  1. 修改 tomcat 内存
  2. android中的MotionEvent 及其它事件处理
  3. 软件开发需求整理概要
  4. linux 去掉csv文件第一行,使用PowerShell删除文本文件的第一行
  5. python dash html.table_阅读 Python dash 代码的时候有个问题, 那个包的调用有问题?
  6. xampp错误: mysql 非正常关闭._mysql数据库DBA实用技巧--为你的数据库开启Innodb监控...
  7. 更新sdk_即构ZegoLiveRoom SDK版本更新,新增多项功能及自定义设置
  8. 函数的基本知识点总结(附实例)
  9. C# List与Array性能比较
  10. ORACLE修改表空间