springCloud学习6(Spring Cloud Sleuth 分布式跟踪)
springcloud 总集:https://www.tapme.top/blog/detail/2019-02-28-11-33
前言
在第四篇和第五篇中提到一个叫关联 id的东西,用这个东西来将所有请求串起来,用来清晰的记录调用过程,以便以微服务的问题调试。
微服务虽然能够将单体软件系统分解为更小的、更易于管理的小系统。但是这种特性是需要付出代价的。其中之一就是----调试困难。所以需要有一种办法能够将所有服务产生的消息聚合起来,方便的获取某一次用户请求的全部日志信息。本篇只解决将请求串起来这个问题,日志聚合需要对应的日志平台配合,这里不做讨论(其实就是将日志全部手机放到一个地方(比如 es),再进行查询)。
(PS:写这篇的时候突然发现,前面那种实现关联 id 方法是错误的,学习《spring 微服务实战》过程中看到了不少错误,单大都不是很重要的,唯独关联 id 的那部分问题挺大。书上的实现是在每个服务中增加一个过滤器,提取入站请求中的关联 id,然后存到 ThreadLocal 中,然后给服务调用类 Ribbon 加一个过滤器:用于从 ThreadLocal 中提取出关联 id 然后加入到请求的 header 中。这里的问题是前面的过滤器所在的线程和后面服务调用的线程不是同一个线程,也就无法用 ThreadLocal 来进行数据保存。在 Feign 请求的过程中是获取不到保存的值的)
集成 Spring Cloud Sleuth
什么是 Spring Cloud Sleuth
简单来说 Spring Cloud Sleuth 就是为开发人员实现了前面关联 ID 尝试做的事情,而且做的更好。主要有一下几个功能:
- 透明地创建并注入一个关联 ID 到服务调用中(如果不存在关联 ID)
- 管理
关联ID
到出站服务的传播,将关联 iD 自动添加啊到出站调用中 - 将
关联信息
添加到 Spring 的 MDC 日志记录,以便生成的关联ID
由 Spring Boot 默认的 SL4J 和 Logback 实现自动记录
怎么用
用法很简单,只需在要用的服务中引入Spring Cloud Sleuth
依赖即可,代码如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
然后就会发现引入该依赖的服务日志打印语句中都会多一些数据,结构如下:
2019-02-28 11:03:02 [ERROR] [server Name,trace ID,span ID,isSendData]...
其中各项意义如下:
- server Name:默认情况下使用
spring.applicataion.name
。 - trace ID: 跟踪 ID,相当于关联 ID。整个微服务调用过程的唯一编号。
- span ID: 跨度 ID。表示某个服务过程中的唯一 ID,比如在服务 A 中打印的日志跨度 ID 都是一样的。
- isSendData: 是否发送数据给 Zipkin。可配置是否将数据发给 Zipkin,毕竟不是所有日志打印都是要收集的。
使用过于简单,因此不提供代码,自己引入依赖就能看到效果,无需任何配置。
尾声
微服务的分布式跟踪是一个很复杂的过程,上面所说的仅仅只是实现了给日志输入打上标记,让微服务调用能够串在一起。之后还有一个很重要的过程是日志收集和分析。后面如果有时间,可能会继续更新完成日志聚合。
2019,Fighting!
本篇原创发布于:FleyX 的个人博客
springCloud学习6(Spring Cloud Sleuth 分布式跟踪)的更多相关文章
- Spring Cloud Sleuth 服务跟踪 将跟踪信息存储到数据库
参见上一篇博客:Spring Cloud Sleuth 服务跟踪 参考:zipkin使用mysql保存数据 主要在跟踪服务上配置: 在数据库创建数据库表:(可不创建,在classpath中添加对应的s ...
- springcloud学习04- 断路器Spring Cloud Netflix Hystrix
依赖上个博客:https://www.cnblogs.com/wang-liang-blogs/p/12072423.html 1.断路器存在的原因 引用博客 https://blog.csdn.ne ...
- Spring Cloud Sleuth 服务跟踪
项目结构: 一跟踪服务中心,用于收集和展示跟踪情况. 一个服务提供者. 一个服务消费者. 服务跟踪中心: pom.xml添加如下依赖: <dependency> <groupId&g ...
- Spring Cloud 学习 (七) Spring Cloud Sleuth
微服务架构是一个分布式架构,微服务系统按业务划分服务单元,一个微服务系统往往有很多个服务单元.由于服务单元数量众多,业务的复杂性较高,如果出现了错误和异常,很难去定位.主要体现在一个请求可能需要调用很 ...
- Spring Cloud Sleuth服务跟踪
监控 使用zipkin(https://zipkin.io/) 监控服务构建: (普通的springBoot项目) <!--引入的zipkinServer依赖--> <depende ...
- Spring Cloud Alibaba学习笔记(23) - 调用链监控工具Spring Cloud Sleuth + Zipkin
随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求陷入性能瓶颈或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何 ...
- Spring Cloud Sleuth+ZipKin+ELK服务链路追踪(七)
序言 sleuth是spring cloud的分布式跟踪工具,主要记录链路调用数据,本身只支持内存存储,在业务量大的场景下,为拉提升系统性能也可通过http传输数据,也可换做rabbit或者kafka ...
- 当Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth会擦出怎样的火花
前言 今年主要会做一个比较完整的微服务项目开源出来.目前已经开始了,刚兴趣的先Star一个吧. 项目:https://github.com/yinjihuan/kitty-cloud 基础框架:htt ...
- 【SpringCloud构建微服务系列】分布式链路跟踪Spring Cloud Sleuth
一.背景 随着业务的发展,系统规模越来越大,各微服务直接的调用关系也变得越来越复杂.通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用协同产生最后的请求结果,几乎每一个前端请求都会形成一 ...
随机推荐
- Windows系统中CreateFileMapping实现的共享内存及用法
在32位的Windows系统中,每一个进程都有权访问他自己的4GB(232=4294967296)平面地址空间,没有段,没有选择符,没有near和far指针,没有near和far函数调用,也没有内存模 ...
- 工具系列 | 如何在阿里云负载均衡上启用WS/WSS支持
官方文档:https://help.aliyun.com/document_detail/63421.html?spm=5176.10695662.1996646101.searchclickresu ...
- Schema注册表客户端
Schema注册表客户端 与模式注册表服务器交互的客户端抽象是SchemaRegistryClient接口,具有以下结构: public interface SchemaRegistryClient ...
- 【Swoole】php7.1安装swoole扩展
参照:https://zixuephp.net/article-430.html 1.源码编译安装,PHP版本7.1.33 2.在已经编译好安装的php7.1中安装swoole扩展. 一.下载swoo ...
- [清华集训2015]灯泡(浙江大学ZOJ 3203 Light Bulb)
Time Limit: 1 Second Memory Limit: 32768 KB Compared to wildleopard's wealthiness, his brother ...
- kotlin基础 常见容器的取值范围
- 【转载】 TensorFlow函数:tf.Session()和tf.Session().as_default()的区别
原文地址: https://blog.csdn.net/Enchanted_ZhouH/article/details/77571939 ------------------------------- ...
- exe4j 打包jar包程序,inno setup complier打包所有
关于库: jar包中对于引用第三方库的话,需要再exe4j中引用. rxtx http://rxtx.qbang.org/wiki/index.php/Download
- CPU时序信号和分频
- mysql 8.0下的SELECT list is not in GROUP BY clause and contains nonaggregated column
mysql的版本 mysql> select version();+-----------+| version() |+-----------+| 8.0.12 |+-----------+ 在 ...