1、背景
上了 springboot 微服务框架后会有很多微服务,每次都到单个微服务自己的日志海洋里去找需要很大经理,
日志跟踪就会成为一个麻烦。我们尝试来寻找一个简化方案
2、了解 Sleuth
SpringCloud Sleuth主要功能就是在分布式系统中提供追踪解决方案。它大量借用了Google Dapper的设计, 先来了解一下Sleuth中的术语和相关概念。
官网:https://spring.io/projects/spring-cloud-sleuth
一些概念:
- Trace
由一组Trace Id相同的Span串联形成一个树状结构。为了实现请求跟踪,当请求到达分布式系统的入口端点时,只需要服务跟踪框架为该请求创建一个唯一的标识(即TraceId) - Span
代表了一组基本的工作单元。为了统计各处理单元的延迟,当请求到达各个服务组件的时候,也通过一个唯一标识(SpanId)来标记它的开始、具体过程和结束。 - Annotation
用它记录一段时间内的事件,内部使用的重要注释
如何使用
Sleuth 的使用及其简单,直接引入一个依赖即可。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
日志参数详解:
我们随便在一个服务里面打印日志,可以在控制台观察到sleuth的日志输出:
[product-service,d1e92e984eaec1ff,d1e92e984eaec1ff,true]
四个值分别表示:[ 服务名,Trace ID,spanID,是否输出 ]
- 服务名。即spring.application.name 的值
- Trace ID。d1e92e984eaec1ff,sleuth生成的一个ID,叫Trace ID,用来标识一条请求链路,一条请求链路中包含一个Trace ID,多个Span ID
- spanID 。d1e92e984eaec1ff、spanID 基本的工作单元,获取元数据,如发送一个http
- true,是否要将该信息输出到zipkin服务中来收集和展示。
然后,为了方便可视化展示和全文检索,可通过 Zipkin 将日志聚合展示。
3、了解 zipkin
Zipkin 是一个分布式追踪系统。它有助于收集解决服务架构中的延迟问题所需的时间数据。功能包括收集和查找此数据。
Zipkin 是 Twitter 的一个开源项目,它基于Google Dapper实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的 API 接口之外,它也提供了方便的UI组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。
Zipkin 提供了可插拔数据存储方式:In-Memory、MySql、Cassandra 以及 Elasticsearch。
它主要由 4 个核心组件构成:
Collector:收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为Zipkin内部处理的 Span 格式,以支持后续的存储、分析、展示等功能。
Storage:存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。
RESTful API:API 组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接系统访问以实现监控等。
Web UI:UI 组件, 基于API组件实现的上层应用。通过UI组件用户可以方便而有直观地查询和分析跟踪信息。
Zipkin分为两端,一个是 Zipkin服务端,一个是 Zipkin客户端,客户端也就是微服务的应用。 客户端会配置服务端的 URL 地址,一旦发生服务间的调用的时候,会被配置在微服务里面的 Sleuth 的监听器监听,并生成相应的 Trace 和 Span 信息发送给服务端。
java 获取并运行
curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar
docker运行
docker run -d -p 9411:9411 openzipkin/zipkin
打开 http://localhost:9411 访问。