跟我学Spring Cloud(Finchley版)-24-Spring Cloud Sleuth入门
经过前文讲述,我们的微服务架构日趋完善,已可使用Spring Cloud构建一个非常健壮的系统!
但假设,你的项目一旦出现问题,如何才能快速定位出来呢?一般项目上要求我们快速定位两种问题:
- 调用发生失败,快速定位出是哪个环节出了问题。是微服务问题,还是网络?
- 调用慢,如何快速找到性能瓶颈?
这正是调用链监控要做的事情。Spring Cloud提供Sleuth来实现调用链监控。
简介
Spring Cloud Sleuth为Spring Cloud提供了分布式跟踪的解决方案,它大量借用了Google Dapper、Twitter Zipkin和Apache HTrace的设计。
TIPS
- Spring Cloud Sleuth的GitHub:https://github.com/spring-cloud/spring-cloud-sleuth
- Dapper论文:https://research.google.com/pubs/pub36356.html
基本概念
(1) Span(跨度):
基本工作单元。span用一个64位的id唯一标识。除ID外,span还包含其他数据,例如描述、时间戳事件、键值对的注解(标签),span ID、span父ID等。
span被启动和停止时,记录了时间信息。初始化span被称为“root span”,该span的id和trace的id相等。
(2) Trace(跟踪):
一组共享“root span”的span组成的树状结构称为trace。trace也用一个64位的ID唯一标识,trace中的所有span都共享该trace的ID。
(3) Annotation(标注):
annotation用来记录事件的存在,其中,核心annotation用来定义请求的开始和结束。
(1) cs(Client Sent 客户端发送):客户端发起一个请求,该annotation描述了span的开始。
(2) sr(Server Received 服务器端接收):服务器端获得请求并准备处理它。如果用sr减去cs时间戳,就能得到网络延迟。
(3) ss(Server Sent 服务器端发送):该annotation表明完成请求处理(当响应发回客户端时)。如果用ss减去sr时间戳,就能得到服务器端处理请求所需的时间。
(4) cr(Client Received 客户端接收):span结束的标识。客户端成功接收到服务器端的响应。如果cr减去cs时间戳,就能得到从客户端发送请求到服务器响应的所需的时间。
快速入门
1 加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId></dependency>
2 加配置:
logging: level: root: INFO org.springframework.cloud.sleuth: DEBUG
其中,配置不是必选的,这里加上日志,只是为了看到更多Sleuth相关的日志。
是不是非常简单!
测试
1 启动 microservice-provider-user-sleuth
2 访问 http://localhost:8000/users/1
,可看到类似如下的日志:
2019-03-13 23:32:46.913 INFO [microservice-provider-user,,,] 14759 --- [nio-8000-exec-1] o.apache.tomcat.util.http.parser.Cookie : A cookie header was received [1551574921,1551708812,1552142696] that contained an invalid cookie. That cookie will be ignored.Note: further occurrences of this error will be logged at DEBUG level.Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=?2019-03-13 23:32:46.975 TRACE [microservice-provider-user,e22f74e62c06104b,e22f74e62c06104b,false] 14759 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1]2019-03-13 23:32:46.981 TRACE [microservice-provider-user,e22f74e62c06104b,e22f74e62c06104b,false] 14759 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([age2_0_0_] : [INTEGER]) - [20]2019-03-13 23:32:46.982 TRACE [microservice-provider-user,e22f74e62c06104b,e22f74e62c06104b,false] 14759 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00]2019-03-13 23:32:46.982 TRACE [microservice-provider-user,e22f74e62c06104b,e22f74e62c06104b,false] 14759 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([name4_0_0_] : [VARCHAR]) - [张三]2019-03-13 23:32:46.982 TRACE [microservice-provider-user,e22f74e62c06104b,e22f74e62c06104b,false] 14759 --- [nio-8000-exec-1] o.h.type.descriptor.sql.BasicExtractor : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]
从日志可以发现,此时日志多出来类似 [microservice-provider-user,e22f74e62c06104b,e22f74e62c06104b,false]
的内容。
经过数据分析,就能实现本文开始提出的两个诉求啦!如何分析呢?且听下回分解。
TIPS
本文的例子本身意义不大,主要是让大家了解下Sleuth的基本概念以及如何整合。实现分布式应用的监控才有意义;另外完善的监控工具一般都会配备一个良好的界面,便于大家才能迅速了解系统的运行情况。这些都是下一节要探索的问题。
配套代码
- GitHub:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-provider-user-sleuth
- Gitee:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-provider-user-sleuth
- ERC20 协议 Token 钱包浅谈
- 小姐姐教你做CTF逆向题:利用符号执行技术和约束求解器
- 「开篇」区块链技术指北
- 如何将CDH从企业版降级为免费版
- 文件上传漏洞的一些总结
- 任意文件下载引发的思考
- LSTM入门详解
- 如何将CDH集群JAVA升级至JDK8
- 如何将Kerberos环境下CDH集群JAVA升级至JDK8
- 干货|如何做准确率达98%的交通标志识别系统?
- 用57行代码搞定花8000万美元采购车牌识别项目
- Cloudera Manager Server服务在RedHat7状态显示异常分析
- 开源 | 基于Python的人脸识别:识别准确率高达99.38%!
- 转录组数据的基因表达变化情况探索
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- python遍历文件夹os.path与pathlib
- python中的yield和return
- python 类
- python 调用c语言详解
- Spring Boot 整合TkMybatis
- 数据可视化|二维统计直方图和三维统计分布图
- zetadiv: 计算zeta多样性
- Springboot笔记~filter
- 【Kubernetes】10分钟部署一套K8S集群(kubeadm)
- 【Kubernetes】给K8S部署一套UI界面
- Flutter图片添加水印功能,Flutter保存Widget为图片
- Qt音视频开发3-vlc录像存储
- 被我用烂的DEBUG调试技巧,专治各种搜索不到的问题!
- 如何用R绘制双y轴柱状图
- CyclicBarrier类在性能测试中应用