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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

## 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)