sleuth 英[sluːθ]/思路思
https://cloud.spring.io/spring-cloud-static/spring-cloud-sleuth/2.1.3.RELEASE/single/spring-cloud-sleuth.html
https://docs.spring.io/spring-cloud-sleuth/docs/2.2.6.RELEASE/reference/html/
我们已经接触过几种微服务的监控方式,比如:Spring Boot Actuator监控微服务,Spring Boot Admin也是监控微服务,他是把Actuator的数据用可视化的方式呈现出来,Hystrix Dashboard监控Hystrix服务,Hystrix Turbine聚合多个Hystrix服务的监控信息等,接下来我们要讨论的是微服务的“跟踪"。
对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:
Spring Cloud Sleuth为Spring Cloud提供了分布式跟踪的解决方案,它大量借用了Google Dapper、Twitter Zipkin和Apache HTrace的设计,帮我们解决像上面提到的问题。Spring Cloud Sleuth可以追踪10种类型的组件:async、Hystrix,messaging,WebSocket,rxjava,scheduling,Web(Spring MVC Controller,Servlet),WebClient(Spring RestTemplate)、Feign/OpenFegin、Zuul;
Spring Cloud Sleuth对于分布式链路的跟踪仅仅是生成一些数据,这些数据不便于人类阅读,所以我们一般把这种跟踪数据上传给Zipkin Server,由Zipkin通过UI页面统一进行数据的展示。
zipkin 英式读音:['zɪp kɪn]
https://zipkin.io/
Zipkin是Twitter开源的分布式实时数据跟踪系统(Distributed Tracking System),基于Google Dapper的论文设计而成,Google开源了 Dapper链路追踪组件,并在2010年发表了论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,这篇文章是业内实现链路追踪的标杆和理论基础,具有非常大的参考价值。
Zipkin它的主要功能是收集系统的时序数据,从而追踪微服务架构的系统延时等问题,从而达到链路调用监控跟踪作用,另外Zipkin还提供了一个非常友好的UI界面,来帮助分析追踪数据。除此之外,Zipkin提供了可插拔数据存储方式:In-Memory、MySql、Cassandra以及Elasticsearch。
Sleuth 和 Zipkin 都是用来做分布式链路跟踪的,Zipkin 包含了 sleuth (指的 spring-cloud-starter-zipkin 包含 spring-cloud-starter-sleuth),Zipkin 分为服务端和客户端,服务端提供了一个 UI 监控界面,客户端指的每个服务
Zipkin分为两端,一个是Zipkin服务端,一个是Zipkin客户端,客户端也就是微服务的应用。客户端会配置服务端的URL地址,一旦发生服务间的调用的时候,会被配置在微服务里面的Sleuth的监听器监听,并生成相应的Trace和Span信息发送给服务端。发送的方式主要有两种,一种是HTTP报文的方式,还有一种是消息总线的方式如:RabbitMQ。
最终我们可以总结出来,Sleuth和Zipkin的关系就好比Spring Boot Actuator和Spring Boot Admin之间的关系,一个用于产生数据,一个用于展示数据。
微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位。主要体现在,一个请求可能需要调用很多个服务,而内部服务的调用复杂性,决定了问题难以定位。所以微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题,很快定位。
链路追踪组件有 Google 的 Dapper,Twitter 的 Zipkin,以及阿里的 Eagleeye (鹰眼)等,它们都是非常优秀的链路追踪开源组件。
简单说:假如服务 A -> B -> C -> D 调用顺序,如果 A 服务调用失败,排查失败原因时不能很快明确到底是哪个服务发生错误,使用分布式链路追踪可以很快明确哪个服务发生错误以及错误原因
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-sleuthartifactId>
dependency>
#开启debug日志
logging.level.org.springframework.cloud.openfeign=debug
logging.level.org.springframework.cloud.sleuth=debug
DEBUG [user-service,541450f08573fff5,541450f08573fff5,false]
通过 Sleuth 产生的调用链监控信息,可以得知微服务之间的调用链路,但监控信息只输出到控制台不方便查看。我们需要一个图形化的工具-zipkin。Zipkin 是 Twitter 开源的分布式跟踪系统,主要用来收集系统的时序数据,从而追踪系统的调用问题。
zipkin 官网地址如下:https://zipkin.io/
docker安装zipkin服务器
docker run -d -p 9411:9411 openzipkin/zipkin
启动zipkin
doceker start angry_nightingale
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zipkinartifactId>
dependency>
zipkin 依赖也同时包含了 sleuth,可以省略 sleuth 的引用
为每一个微服务都加上服务追踪配置
#zipkin的访问地址
spring.zipkin.base-url=http://你服务器的ip:9411
#关闭自己的服务发现功能
spring.zipkin.discovery-client-enabled=false
#设置使用 http 的方式传输数据
spring.zipkin.sender.type=web
#配置sleuth的采样器
spring.sleuth.sampler.probability=1
1)Zipkin 数据持久化相关的官方文档地址如下:https://github.com/openzipkin/zipkin#storage-component
2)Zipkin 默认是将监控数据存储在内存的,如果 Zipkin 挂掉或重启的话,那么监控数据就会丢失。所以如果想要搭建生产可用的 Zipkin,就需要实现监控数据的持久化。而想要实现数据持久化,自然就是得将数据存储至数据库。好在 Zipkin 支持将数据存储至:
3)Zipkin 支持的这几种存储方式中,内存显然是不适用于生产的,这一点开始也说了。而使用MySQL 的话,当数据量大时,查询较为缓慢,也不建议使用。Twitter 官方使用的是 Cassandra作为 Zipkin 的存储数据库,但国内大规模用 Cassandra 的公司较少,而且 Cassandra 相关文档也不多。
综上,故采用 Elasticsearch 是个比较好的选择,关于使用 Elasticsearch 作为 Zipkin 的存储数据库的官方文档如下:
https://github.com/openzipkin/zipkin/tree/master/zipkin-server#elasticsearch-storage
https://github.com/openzipkin/zipkin/tree/master/zipkin-storage/elasticsearch
通过 docker 的方式
docker run --env STORAGE_TYPE=elasticsearch --env ES_HOSTS=192.168.56.10:9200 openzipkin/zipkin-dependencies
使用 es 时 Zipkin Dependencies 支持的环境变量