微服务篇-C 深入理解第一代微服务(SpringCloud)_X 深入理解Sleuth+Zipkin服务链路监控和追踪

原创作者:田超凡(程序员田宝宝)

版权所有,引用请注明原作者,严禁复制转载

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

http://192.168.18.211:9411

指定端口号启动9411

java -jar zipkin.jar --server.port=8080

http://192.168.18.211: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")

本文部分素材转载自蚂蚁课堂

相关推荐
Java中文社群20 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
每天进步一点_JL21 小时前
JVM 类加载:双亲委派机制
java·后端
用户298698530141 天前
Java HTML 转 Word 完整指南
java·后端
渣哥1 天前
原来公平锁和非公平锁差别这么大
java
渣哥1 天前
99% 的人没搞懂:Semaphore 到底是干啥的?
java
J2K1 天前
JDK都25了,你还没用过ZGC?那真得补补课了
java·jvm·后端
kfyty7251 天前
不依赖第三方,不销毁重建,loveqq 框架如何原生实现动态线程池?
java·架构
isysc11 天前
面了一个校招生,竟然说我是老古董
java·后端·面试
道可到1 天前
Java 反射现代实践速查表(JDK 11+/17+)
java
道可到1 天前
Java 反射现代实践指南(JDK 11+ / 17+ 适用)
java