链路追踪
1 概念
分布式计算八大误区
网络可靠。
延迟为零。
带宽无限。
网络绝对安全。
网络拓扑不会改变。
必须有一名管理员。
传输成本为零。
网络同质化。(操作系统,协议)
链路追踪的必要性
如果能跟踪每个请求,中间请求经过哪些微服务,请求耗时,网络延迟,业务逻辑耗时等。我们就能更好地分析系统瓶颈、解决系统问题。因此链路跟踪很重要。
《链路追踪》看看微服务之熵。
我们自己思考解决方案:在调用前后加时间戳。捕获异常。
链路追踪目的:解决错综复杂的服务调用中链路的查看。排查慢服务。
市面上链路追踪产品,大部分基于google的Dapper论文。
1 | zipkin,twitter开源的。是严格按照谷歌的Dapper论文来的。 |
链路追踪要考虑的几个问题
- 探针的性能消耗。尽量不影响 服务本尊。
- 易用。开发可以很快接入,别浪费太多精力。
- 数据分析。要实时分析。维度足够。
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 开始。
《链路树演示》
2 使用
Sleuth单独
pom
每个需要监控的系统
1 | <!-- 引入sleuth依赖 --> |
测试点:
- 启动eureka 7900,service-sms 8002,api-driver 9002.
- 访问一次。看日志结果。
1 | [api-driver,1a409c98e7a3cdbf,1a409c98e7a3cdbf,true] |
zipkin
上面拍错看日志,很原始。刀耕火种,加入利器 zipkin。
zipkin是twitter开源的分布式跟踪系统。
原理收集系统的时序数据,从而追踪微服务架构中系统延时等问题。还有一个友好的界面。
由4个部分组成:
Collector、Storage、Restful API、Web UI组成
采集器,存储器,接口,UI。
原理:
sleuth收集跟踪信息通过http请求发送给zipkin server,zipkin将跟踪信息存储,以及提供RESTful API接口,zipkin ui通过调用api进行数据展示。
默认内存存储,可以用mysql,ES等存储。
操作步骤:
- 每个需要监听的服务的pom中添加。
1 | <!-- zipkin --> |
- 每个需要监听的服务yml中
1 | spring: |
- 启动zipkin。
1 | jar包下载:curl -sSL https://zipkin.io/quickstart.sh | bash -s |
测试点:
访问zipkin:http://localhost:9411/zipkin/
启动:eureka7900,service-sms 8002,api-driver 9002
发起一次 yapi ->api-driver->司机发送验证码。
观察zip界面,点查找,点依赖。
看查找下的时间。
再制造一次熔断,看看zipkin。停止service-sms,访问。会看到变红。
zipkin:最好和rabbitmq,mysql配合使用。
健康检查
使用
- admin 组件端 = 项目:(cloud-admin):pom
1 | server端: |
- 每个需要监控的服务,都加
1 | pom: |
- 访问server
1 | http://localhost:6010/ |
小插曲 正六边形算法。
邮件监控 ,在admin组件中。
pom
1
2
3
4<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23spring:
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: 2634982208@qq.com
# 发件邮箱
spring.boot.admin.notify.mail.from: xxxxxxx@qq.com下线一个服务。
去邮箱查看。