链路追踪
分布式计算八大误区
- 网络可靠
- 延迟为零
- 带宽无限
- 网络绝对安全
- 网络拓扑不会改变
- 必须有一名管理员
- 传输成本为零
- 网络同质化(操作系统,协议)
链路追踪的必要性
如果能跟踪每个请求,中间请求经过哪些微服务,请求耗时,网络延迟,业务逻辑耗时
我们就能更好地分析系统瓶颈、解决系统问题,因此链路跟踪很重要
我们自己思考解决方案:在调用前后加时间戳,捕获异常
链路追踪目的
解决错综复杂的服务调用中链路的查看,排查慢服务
市面上链路追踪产品,大部分基于google的Dapper论文
- zipkin,twitter开源的,是严格按照谷歌的Dapper论文来的。
- pinpoint 韩国的 Naver公司的。
- Cat 美团点评的
- EagleEye 淘宝的
链路追踪要考虑的几个问题
- 探针的性能消耗,尽量不影响 服务本尊
- 易用,开发可以很快接入,别浪费太多精力
- 数据分析,要实时分析,维度足够
Sleuth简介
Sleuth是Spring cloud的分布式跟踪解决方案
span(跨度),基本工作单元,一次链路调用,创建一个span
span用一个64位id唯一标识
包括
- id
- 描述
- 时间戳事件
- spanId,span父id
span被启动和停止时,记录了时间信息,初始化span叫:root span,它的span id和trace id相等
trace(跟踪)
- 一组共享“root span”的span组成的树状结构称为trace,trace也有一个64位ID,trace中所有span共享一个trace id
- 类似于一颗span树
annotation(标签),annotation用来记录事件的存在
其中,核心annotation用来定义请求的开始和结束
- CS(Client Send客户端发起请求),客户端发起请求描述了span开始。
- SR(Server Received服务端接到请求),服务端获得请求并准备处理它
- SR-CS=网络延迟
- SS(Server Send服务器端处理完成,并将结果发送给客户端),表示服务器完成请求处理,响应客户端时
- SS-SR=服务器处理请求的时间。
- CR(Client Received 客户端接受服务端信息),span结束的标识,客户端接收到服务器的响应
- CR-CS=客户端发出请求到服务器响应的总时间
其实数据结构是一颗树,从root span开始
Sleuth单独使用
每个需要监控的系统
<!-- 引入sleuth依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
示例日志
- [api-driver,1a409c98e7a3cdbf,1a409c98e7a3cdbf,true]
- [服务名称,traceId(一条请求调用链中 唯一ID),spanID(基本的工作单元,获取数据等),是否让zipkin收集和展示此信息]
看下游
- [service-sms,1a409c98e7a3cdbf,b3d93470b5cf8434,true]
- traceId, 是一样的
zipkin
zipkin是twitter开源的分布式跟踪系统。
原理收集系统的时序数据,从而追踪微服务架构中系统延时等问题,还有一个友好的界面
由4个部分组成:
Collector、Storage、Restful API、Web UI组成
采集器,存储器,接口,UI
原理
- sleuth收集跟踪信息通过http请求发送给zipkin server
- zipkin将跟踪信息存储,以及提供RESTful API接口,zipkin ui通过调用api进行数据展示
- 默认内存存储,可以用mysql,ES等存储
官方地址:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-zipkin
添加依赖
<!-- zipkin --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
每个需要监听的服务的pom中添加
每个需要监听的服务yml中
spring:
#zipkin
zipkin:
base-url: http://localhost:9411/
#采样比例1
sleuth:
sampler:
rate: 1
启动zipkin
jar包下载
curl -sSL https://zipkin.io/quickstart.sh | bash -s
启动
java -jar zipkin.jar
或者docker
docker run -d -p 9411:9411 openzipkin/zipkin
测试点:
访问zipkin:http://localhost:9411/zipkin/
启动eureka,制造一次熔断,看看zipkin,停止路由,访问,会看到变红
zipkin:最好和rabbitmq,mysql配合使用
健康检查
官方地址
admin服务:https://mvnrepository.com/artifact/de.codecentric/spring-boot-admin-starter-server
admin界面:https://mvnrepository.com/artifact/de.codecentric/spring-boot-admin-server-ui
添加依赖
<!-- Admin 服务 --> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-starter-server</artifactId> </dependency> <!-- Admin 界面 --> <dependency> <groupId>de.codecentric</groupId> <artifactId>spring-boot-admin-server-ui</artifactId> </dependency>
每个需要监控的服务都添加
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
yml
management:
endpoints:
web:
exposure:
#yml加双引号,properties不用加
include: "*"
health:
##默认是never
show-details: ALWAYS
enabled: true
访问server
http://localhost:6010/
邮件监控 ,在admin组件中
官方地址:https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail
添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
yml
spring:
application:
name: cloud-admin
security:
user:
name: root
password: root
# 邮件设置
mail:
host: smtp.qq.com
username: 单纯QQ号
password: xxxxxxx授权码
properties:
mail:
smpt:
auth: true
starttls:
enable: true
required: true
#收件邮箱
spring.boot.admin.notify.mail.to: ******@qq.com
# 发件邮箱
spring.boot.admin.notify.mail.from: xxxxxxx@qq.com
下线一个服务,查看邮箱