原创作者:田超凡(程序员田宝宝)
版权所有,引用请注明原作者,严禁复制转载
Part 1 理论部分
1 服务链路监控和追踪产生的背景?
在微服务系统中,随着业务的发展,系统规模会变得越来越大,那么各个服务之间的调用关系也就变得越来越复杂,一个HTTP请求会调用多个不同的微服务来处理,然后返回最后的响应结果,在这个调用过程中,可能会因为某个服务出现网络延迟过高或发送错误导致请求失败,这个时候,对请求调用的监控就显得尤为重要了,SpringCloud Sleuth提供了服务链路监控和追踪的解决方案。
2 Sleuth的组成部分?
Sleuth的组成部分包括traceId,spanId,Trace.
traceId:发起方调用接口的时候会创建一个全局唯一的id,即traceId,作为全局追踪id。
spanId:每次RPC调用接口的时候都会创建一个新的spanId,用来存储当前RPC请求的信息。
Trace:类似于树结构的span集合,表示一个完整的调用链路,调用链路的唯一标识是traceId,通过traceId全局追踪id,spanId请求追踪id,parentId上一个请求追踪id,将收集到的span汇聚成一个tree,再提供一个request的整体流程。
3 什么是Zipkin?
Zipkin是Twitter的一个开源项目,它是基于Google Dapper实现的,我们可以使用它来收集各个服务器上请求链路的追踪数据,并通过它提供的REST API接口来辅助查询追踪数据以实现对微服务系统中服务调用链路的监控,从而及时发现系统中出现的延迟过高的问题,除了面向开发的API接口之外,它还提供了方便的UI组件来帮助我们直观地搜索追踪信息和分析请求链路调用明细,比如可以查询某段时间内各用户请求的处理时间等。
Zipkin和Config的结构类似,分为服务器端Server和客户端Client,这里的客户端Client指的就是各个微服务应用。
4 Sleuth+Zipkin实现服务链路追踪的原理?
1 发起方调用接口的时候会创建一个全局唯一的id,即traceId,作为全局追踪id,并存放到请求中。
2 Sleuth会在每次RPC调用接口的时候都会创建一个新的spanId,用来存储当前RPC请求的信息。
3 Sleuth和Zipkin整合可以实现图形化界面管理接口的请求链路调用信息。
Part 2 实践部分
Zipkin环境搭建
在 Spring Boot 2.0 版本之后,官方已不推荐自己搭建Zipkin服务端了,而是直接提供了编译好的 jar 包。详情可以查看官网:Quickstart · OpenZipkin
注意:zipkin官网已经提供定制了,使用官方jar运行即可。
默认端口号启动zipkin服务
java --jar zipkin.jar 默认端口号; 9411
指定端口号启动9411
java -jar zipkin.jar --server.port=8080
ZipkinClient集成
Maven依赖
|----------------------------------------------------------------------------------------------------------------------------------------------|
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-++zipkin++</artifactId> </dependency> |
application.yml
|-------------------------------------------------------------------------------------------------------------------------------------|
| spring: application: name: app-ittcf-member zipkin: base-url: http://192.168.18.211:9411/ ###全部采集 sleuth: sampler: probability: 1.0 |
ZipkinClient集成RabbitMQ
|------------------------------------------------------------------------------------------------------------------------------------------------|
| <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-rabbit</artifactId> </dependency> |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| spring: application: name: app-ittcf-order zipkin: base-url: http://192.168.18.211:9411/ ### 默认可以不用写 rabbitmq: ####连接地址 host: 127.0.0.1 ####端口号 port: 5672 ####账号 username: guest ####密码 password: guest ###全部采集 sleuth: sampler: probability: 1.0 |
request.getHeader("X-B3-TraceId");
request.getHeader("X-B3-TraceId")+",spanid:"+ request.getHeader("X-B3-SpanId")
本文部分素材转载自蚂蚁课堂