在微服务的架构中一个简单的前端请求可能调用多次后端服务才能完成,那么当整个请求出现问题时,我们很难定位到底是哪个服务出现了问题导致的,这时就需要解决一个问题,如何快速定位服务故障点,因此,分布式链路追踪的技术就诞生了。
Zipkin是一款开源的分布式实时数据追踪系统(Distributed Tracking System),由Twitter公司开发和贡献。它可以帮助收集服务的时间数据,已解决微服务架构中的的延迟问题,包括数据的收集、存储、查找和展现。
每个服务向zipkin报告计时数据,zipkin会根据调用关系通过Zipkin UI生成依赖关系图,展示多少跟踪请求经过哪些服务,该系统可以让开发者通过一个web端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可非常方便的监测系统中存在的瓶颈。
Zipkin提供了可插拔数据存储方式:In-Memory、MySql、Cassandra以及Elasticsearch。我们可以根据需求选择不同的存储方式,生产环境一般都需要持久化。我们这里采用Elasticsearch作为Zipkin的数据存储器。
一般分布式服务追踪系统主要由3部分组成:数据收集、数据存储、数据展示
spring cloud sleuth为服务之间的调用提供链路追踪,通过sleuth可以很清楚的了解到一个服务请求经过哪些服务,每个服务花了多长时间,让我们可以很方便的理清楚各个微服务的调用关系,除此外sleuth还有以下优点:
1、耗时分析:通过sleuth可以很方便的了解到每个采样请求的耗时,从而分析出哪些服务调用比较耗时。
2、可视化错误:对于程序未捕捉的异常,可以通过集成ZipKin服务在界面上看到。
3、链路优化:对于调用比较频繁的服务,可以针对这些服务实施一些优化措施。
spring cloud sleuth可以结合ZipKin,将信息发送到ZipKin,利用ZipKin的存储来存储信息,利用ZipKin UI来展示数据
从SpringCloud2.0 以后,官方已经不支持自建Zipkin Server了,改成提供编译好的jar包供用户使用。
自建的方式请到百度自行查询,我们这里使用Docker方式部署ZipKin服务,并采用Elasticsearch作为ZipKin的数据存储。
下载镜像
在此之前我们需要安装好Docker环境,使用以下命令分别拉取zipkin和elasticsearch镜像。
安装Docker教程:https://www.runoob.com/docker/windows-docker-install.html
docker pull openzipkin/zipkin:2.21
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.1.0
启动文件
在本地创建如下文件夹结构, data目录用来存放elasticsearch存储的数据。
dockerfile
|- elasticsearch
| |- data
|- docker-compose.yml
编写docker-compose文件,主要作用是批量启动容器,避免在使用多个容器的时候逐个启动的繁琐。
docker-compose.yml
version: "3"
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.1.0
container_name: elasticsearch
restart: always
ports:
- 9200:9200
healthcheck:
test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- TZ=Asia/Shanghai
ulimits:
memlock:
soft: -1
hard: -1
zipkin:
image: openzipkin/zipkin:2.21
container_name: zipkin
depends_on:
- elasticsearch
links:
- elasticsearch
restart: always
ports:
- 9411:9411
environment:
- TZ=Asia/Shanghai
- STORAGE_TYPE=elasticsearch
- ES_HOSTS=elasticsearch:9200
命令模式进入dockerfile目录,执行启动命令如下。
docker-compose up -d
执行完成之后,通过 docker ps 命令查看状态
到这里,zipkin服务端就搭建起来了,访问 http://localhost:9411
搜索的时候没有数据,是因为我们没有配置客户端。
注意:
这里我们采用了elasticsearch作为存储方式,如果想简单通过内存方式启动,无须安装elasticsearch,直接启动一个zipkin容器即可。
docker run -d -p 9411:9411 openzipkin/zipkin
zipkin服务端已经搭建完成了,接下来我们来实现客户端。
修改 mango-consumer 项目Maven配置,添加zipkin依赖。
pom.xml
org.springframework.cloud
spring-cloud-starter-zipkin
修改配置文件,添加如下zipkin配置。
spring:
zipkin:
base-url: http://localhost:9411/
sleuth:
sampler:
probability: 1 #样本采集量,默认为0.1,为了测试这里修改为1,正式环境一般使用默认值。
application.yml
server:
port: 8005
spring:
application:
name: mango-consumer
cloud:
consul:
host: localhost
port: 8500
discovery:
serviceName: ${spring.application.name} # 注册到consul的服务名称
boot:
admin:
client:
url: "http://localhost:8000"
zipkin:
base-url: http://localhost:9411/
sleuth:
sampler:
probability: 1 #样本采集量,默认为0.1,为了测试这里修改为1,正式环境一般使用默认值。
# 开放健康检查接口
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
#开启熔断器
feign:
hystrix:
enabled: true
先后启动注册中心、服务监控、服务提供者、服务消费者。
反复访问几次 http://localhost:8005/feign/call,产生zipkin数据。
点进去可以看到详细的请求过程。
说明:如果我们docker配置完zipkin 和 elasticsearch ,在控制台启动后
看到下面结果并不一定启动成功。
我们要看docker的启动日志,打开我们的docker双击对应的名称就可以看到对应的交易日志,只有这里面的日志不报错,才能算是成功了
如果这里面报错,那估计就是docker-compose.yml文件配置有问题,而且版本不对应也会有问题。
好啦,链路跟踪我们就学到这。
看完记得点赞哦!