微服务篇-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")

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

相关推荐
工业甲酰苯胺33 分钟前
实现 json path 来评估函数式解析器的损耗
java·前端·json
老前端的功夫34 分钟前
Web应用的永生之术:PWA落地与实践深度指南
java·开发语言·前端·javascript·css·node.js
@forever@35 分钟前
【JAVA】LinkedList与链表
java·python·链表
LilySesy1 小时前
ABAP+WHERE字段长度不一致报错解决
java·前端·javascript·bug·sap·abap·alv
六件套是我1 小时前
redission实现延时队列
android·java·servlet
王元_SmallA2 小时前
Redis Desktop Manager(Redis可视化工具)安装
java·后端
ᐇ9592 小时前
Java HashMap深度解析:数据结构、原理与实战指南
java·开发语言·数据结构
好好研究2 小时前
Spring框架 - 开发方式
java·后端·spring
武子康2 小时前
Java-166 Neo4j 安装与最小闭环 | 10 分钟跑通 + 远程访问 Docker neo4j.conf
java·数据库·sql·docker·系统架构·nosql·neo4j
2301_796512523 小时前
Rust编程学习 - 为什么说Cow 代表的是Copy-On-Write, 即“写时复制技术”,它是一种高效的 资源管理手段
java·学习·rust