You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

203 lines
8.4 KiB
Markdown

## SpringCloud Sleuth + Zipkin 概览
### 认识 SpringCloud sleuth
- SpringCloud Sleuth 实现的功能是:它会自动为当前应用构建起各通信通道的跟踪机制
- 通过诸如 RabbitMQ、Kafka(或者其他任何 SpringCloud Stream 绑定器实现的消息中间件)传递的请求
- 通过 Zuul、Gateway 代理传递的请求
- 通过 RestTemplate 发起的请求
> Service A -Rest[FLAG]-> ServiceB -Kafka[FLAG]-> Service D (服务与服务之间的时间消耗)</br>
> -Rest[FLAG]-> Service C
---
- SpringCloud Sleuth 跟踪实现原理
- 为了实现请求跟踪:当请求发送到分布式系统的入口端点时,只需要服务跟踪框架为该请求创建一个唯一的跟踪标识,Trace ID
- 为了统计各处理单元的时间延迟,当请求到达各个服务组件时,或是处理逻辑到达某个状态时,也通过一个唯一标识来标记它的开始、具体过程以及结束,Span ID
> Service A[traceld, spanldA] -> Service B[traceld, spanldA1] -> Service D[traceld, spanldA11]</br>
> -> Service C[traceld,spanldA2]
---
- Zipkin 的基础概念
- Zipkin 解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现
- Zipkin 有四大核心组件构成:
- Collector:收集器组件
- Storage:存储组件
- API: RESTFUAPI提供外部访问接口
- U:Web Ul,提供可视化査询页面
- ![Zipkin流程图.png](pic/Zipkin流程图.png)
---
- Zipkin Web UI 预览
- 链路追踪与服务依赖 Zipkin 展示预览
- ![ZipkinWebUI.png](pic/ZipkinWebUI.png)
## 集成 SpringCloud Sleuth 实现微服务通信跟踪
- 集成 SpringCloud Sleuth 的步骤
- 第一原则:保证你的微服务存在跨进程通信,否则,意义不大(完全可以通过更简单的方式实现)
- 在 pom.xml中添加依赖配置
- 注意日志中的输出变化
- 代码中调用方法的打印是 10 进制的, Sleuth 打印是 16进制的打印
- PS: 命令行退出 mysql \q
- echo 'ibase=10,obase=16;xxxxxxxxxxx' | bc
---
## 搭建 Zipkin Server 实现对跟踪信息的收集
- 搭建 Zipkin Server 的步骤
- Tips:SpringCloud Finchley 版本(包含)之后,官方不建议自己搭建 Zipkin-Server, 提供了已经打包好的jar 文件(SpringBoot工程),直接下载启动即可
- 下载地址:curl -sSL https://zipkin.io/quickstart.sh | bash -s
- 选择自己需要的版本,我的是 zipkin-server-2.21.7-exec.jar
- 选择 exec.jar 结尾的 jar
---
- 启动命令: nohup java -jar zipkin-server-2.21.7-exec.jar --server.port=8888 &
---
- 配置 Zipkin Server 实现对跟踪信息的收集
- 为什么需要对 Zipkin Server 做自定义配置 ?
- 默认情况下Zipkin Server 将跟踪信息存储在内存中(JVM ),重启会丢失
- Zipkin Server 默认使用 HTTP 方式上报跟踪数据,性能较差
- Zipkin Server 配置 MySQL 跟踪数据持久化
- MySQL 中添加数据表:
- https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysal-v1/src/main/resources/mysql.sql
- Zipkin Server 启动指定 MySQL 路径
---
- 启动命令
- java -jar zipkin-server-2.21.7-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSOL_USER=root --MYSQL_PASS=root --MYSQL_DB=by_zipkin
## SpringCloud Sleuth 整合 Zipkin 实现分布式链路跟踪、收集
- SpringCloud Sleuth 整合 Zipkin 的步骤
- 简单的两个步骤(Zipkin Server 使用 MySQL 实现跟踪数据持久化)
- pom 文件中添加依赖
```xml
<!-- zipkin = spring-cloud-starter-sleuth + spring-cloud-sleuth-zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
```
- bootstrap 中增加 Zipkin 的配置
```yaml
kafka:
bootstrap-servers: 127.0.0.1:9092
producer:
retries: 3
consumer:
auto-offset-reset: latest
sleuth:
sampler:
# ProbabilityBasedSampler 抽样策略
probability: 1.0 # 采样比例, 1.0 表示 100%, 默认是 0.1
# RateLimitingSampler 抽样策略, 设置了限速采集, spring.sleuth.sampler.probability 属性值无效
rate: 100 # 每秒间隔接受的 trace 量
zipkin:
sender:
type: kafka # 默认是 web
base-url: http://localhost:9411/
```
---
- 下载、安装 Kafka 配置跟踪数据传输
- 下载Kafka :https://kafka.apache.org/quickstart
- 一般采用
- 解压、启动 ZK和 Kafka Server 即可(使用默认配置)
- 启动内置 zk
```shell
Kafka_2.13-2.7.0 bin/zookeeper-server-start.sh config/zookeeper.properties
```
- 启动 kafka
```shell
kafka_2.13-2.7.0 bin/kafka-server-start.sh config/server.properties
```
- 启动 zipkin
```shell
zipkin java -DKAFKA_BOOTSTRAP_SERVERS=127.0.0.1:9092 -jar zipkin-server-2.21.7-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_USER=root --MYSQL_PASS=root --MYSQL_DB=imooc_zipkin
```
---
## SpringCloud Sleuth 设置采样率、抽样收集策略
- SpringCloud Sleuth 采样收集
- 收集跟踪信息是一把双刃剑,需要做好权衡
- 收集的跟踪信息越多,越能反映出系统的实际运行情况
- 高并发场景下,大量的请求调用会产生海量的跟踪日志信息,性能开销太大
- Sleuth --(Kafka[策略True])--> Zipkin
- 可以自由选择 Zipkin brave 自带的两个抽样策略
- ProbabilityBasedSampler 采样率策略
- 默认使用的策略, 以请求百分比的方式配置和收集跟踪信息: 它的默认值为 0.1,代表收集 10% 的请求跟踪信息
- spring.sleuth.samplerprobability=0.5
- RateLimitingSampler 抽样策略
- 限速采集,也就是说它可以用来限制每秒追踪请求的最大数量,优先级更高
- spring.sleuth.sampler.rate=10
- 开发环境下,配置尽可能高的采样率, 方便解决问题和性能瓶颈等的尽早发现
- 线上环境采样率不宜过高
---
```yaml
sleuth:
sampler:
# ProbabilityBasedSampler 抽样策略
probability: 1.0 # 采样比例, 1.0 表示 100%, 默认是 0.1
# RateLimitingSampler 抽样策略, 设置了限速采集, spring.sleuth.sampler.probability 属性值无效
rate: 100 # 每秒间隔接受的 trace 量
```
- 使用代码的方式 [SamplerConfig.java]
- PS: 代码和配置文件: 只使用一种方式即可
- PS: 采样策略也使用一个即可, 通常只使用限速采集
---
## SpringCloud Sleuth + Zipkin 分布式日志追踪总结
- SpringCloud sleuth + Zipkin 逻辑架构
- 跟踪、收集所涉及到的三个组件(模块) Sleuth、Zipkin、Brave
- 三个组件之间的关系
- Brave 是一个 tracer 库,提供的是 tracer 接囗
- Sleuth 采用了 Brave 作为 tracer库
- Sleuth可以不使用 Zipkin
- ![SpringCloudsleuthZipkin逻辑架构.png](pic/SpringCloudsleuthZipkin逻辑架构.png)
---
- Brave 解读
- Brave 的两个最基本、也是最核心的概念
- trace: 以看作是一个逻辑执行过程中的整个链条
- span:是 trace 跟踪的基本单位
```java
void order(){
GoodsService();
AccountService();
}
void Accountservice(){
DeductBalance();
}
```
```text
Span: Order _
/ \ |
Child Child |
/ \ |
Span: Goods Span: Account Trace
| |
Child |
| |
Span: Deduct -
```
---
- Brave 中常用的数据结构及其说明
- Tracing:工具类,用于生成 Tracer 类实例
- Tracer :也是工具类,用于生成 Span
- Span:实际记录每个功能块执行信息的类
- TraceContext :记录 trace 的执行过程中的元数据信息类
- Propagation :用于在分布式环境或者跨进程条件下的trace 跟踪时实现 TraceContext 传递的工具类
- ![Brave中常用的数据结构及其说明.png](pic/Brave中常用的数据结构及其说明.png)
---
- SpringCloud Sleuth 实现跨服务 Trace 追踪
- SpringCloud Sleuth 和 Brave 提供了很多不同的分布式框架的支持,例如 qRPC、Kafka、HTTP 等
- Brave 实现跨服务(或者跨线程)Trace追踪的核心是通过 TraceContext 中核心信息的传递来实现的
- 样例:Brave 针对 HTTP 服务进行Context 传递的标准流程
- ![实现跨服务Trace追踪.png](pic/实现跨服务Trace追踪.png)