二、SpringBoot 2.X整合Sleuth+Zipkin
在微服务系统中,各个服务之间的调用关系比较复杂。一个 HTTP 请求可能会调用多个不同的微服务来处理,在调用过程中可能因为某个服务异常(网络延迟过高或发送错误)导致请求失败,所有需要有服务追踪来监控,方便快速定位问题点。Spring Cloud Sleuth 提供了分布式服务链路监控的解决方案。
1、简介
Zipkin(是Twitter 的一个开源项目基于GoogleDapper实现) ,可以使用Zipkin来收集各个服务器请求链路的跟踪数据,并将收集的数据提供的REST API 接口来辅助查询,通过跟踪数据来实现分布式系统的监控,除了面向开发的 API 接口之外,它还提供了方便的 UI 组件来帮助我们直观地搜索跟踪信息和分析请求链路明细。Zipkin分为服务端 Server,客户端 Client,客户端是指各个微服务应用。
2、搭建Zipkin服务端
SpringBoot 2.0 版本之后,官方已不推荐自己搭建定制,而是直接提供了编译好的 jar包
JAR方式:下载最新JAR直接部署,参考地址 https://github.com/openzipkin/zipkin
Linux
curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar
Windocs
https://zipkin.io/pages/quickstart.html官网下载zipkin-server-2.12.0-exec.jar包
java -jar zipkin-server-2.12.0-exec.jar
Docker: 使用Docker部署,参考地址 https://github.com/openzipkin/docker-zipkin
docker run -d -p 9411:9411 openzipkin/zipkin
通过java -jar zipkin-server-2.12.0-exec.jar启动,访问http://127.0.0.1:9411
3、搭建Zipkin客户端(微服务应用)
引入依赖pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
配置文件application.yml
server:
###Base服务端口号
port: 8201
spring:
application:
###服务别名--服务注册到注册中心名称
name: its-spb-base-servers
###zipkin服务追踪
zipkin:
base-url: http://127.0.0.1:9411/
###采样比例默认的为 0.1可设置介于 0到 1之间,1则表示全部采集
sleuth:
sampler:
probability: 1.0
验证依次启动its-spb-eureka(注册中心)/its-spb-base-servers(微服务应用)/its-spb-order-servers(微服务应用)/its-spb-zipkin(服务追踪)
第一个值:service1,它记录了应用的名称
第二个值:f2241d02f2308555,是 Spring Cloud Sleuth 生成的一个 ID,称为 Trace ID,它用来标识一条请求链路。一条请求链路中包含一个 Trace ID,多个 Span ID。
第三个值:f2241d02f2308555,是 Spring Cloud Sleuth 生成的另外一个 ID,称为 Span ID,它表示一个基本的工作单元,比如发送一个 HTTP 请求。
第四个值:true,它表示是否要将该信息输出到 Zipkin Server 中来收集和展示。
如果服务名下并没有看到我们的应用,这是因为 Spring CloudSleuth采用了抽样收集的方式来为跟踪信息打上收集标记,也就是上面看到的第四个值。为什么要使用抽样收集呢?理论上应该是收集的跟踪信息越多越好,
可以更好的反映出系统的实际运行情况,但是在高并发的分布式系统运行时,大量请求调用会产生海量的跟踪日志信息,如果过多的收集,会对系统性能造成一定的影响,所以 Spring Cloud Sleuth 采用了抽样收集的方式。
既然如此,那么我们就需要把上面第四个值改为 true,开发过程中,我们一般都是收集全部信息。
Sleuth默认采样算法的实现是Reservoir sampling(实现类是PercentageBasedSampler)默认的采样比例为: 0.1即10%
可以通过 spring.sleuth.sampler.probability 来设置,所设置的值介于0到1之间(1则表示全部采集)