随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位服务故障点,以对症下药。于是就有了分布式系统调用跟踪的诞生。
在SpringCloud中常用的组件有Spring Cloud Sleuth
、ZipKin
。
Spring Cloud Sleuth
Spring Cloud Sleuth为服务之间调用提供链路追踪。通过Sleuth可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长。从而让我们可以很方便的理清各微服务间的调用关系。此外Sleuth可以帮助我们:
- 耗时分析: 通过Sleuth可以很方便的了解到每个采样请求的耗时,从而分析出哪些服务调用比较耗时;
- 可视化错误: 对于程序未捕捉的异常,可以通过集成Zipkin服务界面上看到;
- 链路优化: 对于调用比较频繁的服务,可以针对这些服务实施一些优化措施。
spring cloud sleuth可以结合zipkin,将信息发送到zipkin,利用zipkin的存储来存储信息,利用zipkin ui来展示数据。
ZipKin
Zipkin 是一个开放源代码分布式的跟踪系统,由Twitter公司开源,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。
每个服务向zipkin报告计时数据,zipkin会根据调用关系通过Zipkin UI生成依赖关系图,显示了多少跟踪请求通过每个服务,该系统让开发者可通过一个 Web 前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈。
Zipkin提供了可插拔数据存储方式:In-Memory、MySql、Cassandra以及Elasticsearch。接下来的测试为方便直接采用In-Memory方式进行存储,生产推荐Elasticsearch。
创建项目
启动zipkin
jar方式
官方推荐我们使用zipkin的jar来启动一个zipkin的ui或者使用docker启动
curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar
或者下载latest release[https://search.maven.org/remote_content?g=io.zipkin&a=zipkin-server&v=LATEST&c=exec]
docker启动
docker run -d -p 9411:9411 openzipkin/zipkin
下载源码并启动
# get the latest source
git clone https://github.com/openzipkin/zipkin
cd zipkin
# Build the server and also make its dependencies
./mvnw -DskipTests --also-make -pl zipkin-server clean install
# Run the server
java -jar ./zipkin-server/target/zipkin-server-*exec.jar
引入zipkin的stater
本案例使用Spring-Cloud Hoxton.SR5 版本
在之前的服务提供者、网关中加入以下依赖、配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
配置zipkin
spring:
sleuth:
sampler:
probability: 100 #采集所有的信息
zipkin:
base-url: http://127.0.0.1:9411/
测试服务
将Eureka、网关、提供者等依次启动,调用http://localhost:8888/producer/hello?name=neo
几次。然后再访问zipkin
的管理台http://localhost:9411/zipkin/
,就能看到刚才的几次访问记录。
点击记录进去页面,可以看到每一个服务所耗费的时间和顺序。
点击依赖分析,可以看到项目之间的调用关系。
下一篇:
文章参考
纯洁的微笑:[使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪](http://www.ityouknow.com/springcloud/2018/02/02/spring-cloud-sleuth-zipkin.html)
zipkin:Zipkin-quickstart