本书分为14章,涵盖的知识主要包括:限流与熔断等基础概念、Sentinel的特性与性能压测,Sentinel概念、核心类与数据结构,Sentinel整体工作流程,资源指标数据统计,限流与流量效果控制,熔断降级与熔断器,授权与系统自适应功能,扩展Sentinel实现开关降级,Sentinel动态数据源,Sentinel适配主流框架的实现原理,热点参数限流,集群限流,异步调用链的支持,资源指标数据的收集与持久化。本书内容丰富,概念通俗易懂,让读者不仅能够深入理解Sentinel的实现原理,还能够从Sentinel中学习到一些技术,如Java SPI的应用、责任链设计模式的应用、高并发性能优化、滑动窗口的实现、匀速限流与冷启动算法、信号量隔离的目的与实现等。
前言
Sentinel的使用前景
随着微服务的发展及DDD领域驱动设计的兴起,越来越多的企业开始使用微服务架构。无论是项目重构,还是新项目的开发,即使项目初期没有多大的流量,但从长远考虑,企业也基本会优先使用微服务架构。但“鱼和熊掌不可兼得”,项目微服务化在提升开发效率及降低后期维护成本的同时,也加大了服务部署运维及问题排查的难度,并且容易导致服务崩溃出现级联效应,也就是“服务雪崩”。
为了应对微服务化带来的难题,一批微服务组件与应用涌现出来,如辅助问题排查的分布式调用链追踪探针、简化部署运维的Kubernetes,以及本书介绍的熔断器组件等。
熔断器组件用于实现服务的自我保护,一般都具备限流、熔断功能。限流用于限制流量超过服务的临界点,避免突发流量导致服务崩溃;而熔断用于保护自身不受下游服务的影响,在感知到下游服务不稳定时自动断开请求,在下游服务恢复时再恢复请求。
并非流量大时才需要熔断器。一方面,微服务的调用错综复杂,若一个服务不可用,则有很大的概率影响到其周边服务,使其不可用,并且这种现象就像病毒一样具有扩散性,因此需要使用熔断器;另一方面,若项目对接一些第三方的接口,则在无法预估第三方接口的最大QPS及稳定性的情况下,添加熔断器能保证服务自身稳定运行。
Sentinel是熔断器的实现组件之一,具有扩展性强、对应用性能影响小、配置灵活,支持异步链路与响应式项目等特点,因此Sentinel很快在国内流行起来,成为国内众多开发者和架构师首选的熔断器组件。
笔者的使用体会
笔者有这样一个经历,即将一个项目从单体架构重构为微服务架构,并且担任该项目的主程序师,负责技术选型、微服务划分及框架搭建。在这个过程中,系统发生了一次服务雪崩,笔者至今记忆犹新,也是从那时起才认识到熔断器组件对于微服务的重要性。
Sentinel使用简单、配置灵活,可将Sentinel的动态数据源接口与配置中心结合使用,动态地改变流量规则。Sentinel提供的流量控制功能有限流、熔断、系统自适应、授权等。笔者当时使用了熔断和系统自适应功能应对突增流量导致服务雪崩的问题,同时使用限流功能并结合信号量隔离、匀速限流效果控制器,应对内部定时任务瞬时高并发调用某服务接口的问题。
在后续开发的项目中,笔者也经常使用Sentinel,如在某跨境电商项目的支付服务中使用Sentinel的熔断器功能;在其他微服务中扩展Sentinel实现开关降级,从而在促销活动开始前对不重要的接口进行降级处理,为大促销活动保驾护航。为了使用Kubernetes的ConfigMap资源存储限流规则,笔者还自行实现了Sentinel动态数据源,并基于Spring Cloud动态配置实现了限流规则的动态配置。
本书的特色
本书以“概念、核心类、整体工作流程、核心功能”为主脉络,系统、全面地对Sentinel的源码进行了分析,以图文结合的方式详细介绍了Sentinel的一些晦涩难懂的概念及数据结构,讲解了匀速限流算法、冷启动限流算法及Sentinel的代码实现,并分析了Sentinel中的一些代码为何如此编写,揣摩代码背后的设计思想。
本书读者对象
q 正在进行微服务项目的开发者或组织
q 对Sentinel工作原理尚未了解的开发者
q 在响应式编程项目中对Sentinel感到困惑的开发者
引言 笔者经历的一次服务雪崩
第1章 基础知识
1.1 服务降级、限流、熔断、流量效果控制
1.1.1 限流降级
1.1.2 熔断降级
1.1.3 开关降级
1.2 Sentinel的特性
1.3 Sentinel性能压测
1.3.1 JMH基准测试
1.3.2 使用JMH进行Sentinel压测
1.4 小结
第2章 了解概念与核心类
2.1 了解Sentinel的一些概念
2.1.1 资源、规则、资源指标数据
2.1.2 调用链与调用树
2.1.3 处理器插槽
2.2 资源指标数据统计相关类
2.2.1 ResourceWrapper
2.2.2 Node
2.3 调用链上下文与入口类
2.3.1 Context
2.3.2 Entry
2.3.3 调用树与ROOT节点
2.4 处理器插槽:ProcessorSlot
2.5 小结
第3章 了解整体工作流程
3.1 SPI在Sentinel中的应用
3.1.1 Java SPI实现原理与适用场景
3.1.2 Java SPI在Sentinel中的应用
3.1.3 自定义组装ProcessorSlotChain
3.2 责任链模式在Sentinel中的应用
3.3 Sentinel的整体工作流程分析
3.4 小结
第4章 资源指标数据统计
4.1 基于滑动窗口实现资源指标数据统计
4.1.1 Bucket
4.1.2 滑动窗口
4.1.3 WindowWrap
4.1.4 通过时间戳定位Bucket
4.1.5 获取当前时间戳的前一个Bucket
4.2 资源指标数据统计全解析
4.2.1 节点选择器插槽
4.2.2 ClusterNode构造器插槽
4.2.3 资源指标数据统计插槽
4.2.4 资源指标数据的收集过程
4.3 小结
第5章 限流
5.1 限流功能实现原理
5.1.1 限流规则
5.1.2 限流规则加载器
5.1.3 限流处理器插槽
5.1.4 限流规则检查器
5.2 流量效果控制
5.2.1 经典限流算法
5.2.2 流量效果控制器
5.2.3 快速失败流量效果控制器
5.2.4 匀速限流效果控制器
5.2.5 冷启动限流效果控制器
5.3 小结
第6章 熔断降级
6.1 旧版熔断降级
6.1.1 熔断降级规则
6.1.2 熔断降级的实现原理
6.2 新版熔断降级
6.2.1 旧版熔断降级的不足
6.2.2 新版本的改进
6.2.3 熔断器的实现原理
6.3 熔断器
6.3.1 抽象熔断器
6.3.2 异常熔断器
6.3.3 慢请求熔断器
6.4 小结
第7章 授权与系统自适应
7.1 授权功能的实现原理
7.1.1 授权规则
7.1.2 授权处理器插槽
7.1.3 授权规则检查器
7.2 系统自适应功能的实现原理
7.2.1 系统自适应限流规则
7.2.2 系统自适应限流判断流程
7.2.3 获取系统的平均负载和CPU使用率
7.2.4 checkBbr
7.3 小结
第8章 实现开关降级
8.1 使用AOP实现开关降级
8.2 扩展Sentinel实现开关降级
8.3 小结
第9章 动态数据源
9.1 实现规则动态配置的两种方式
9.2 使用Redis动态数据源
9.3 动态配置的实现原理
9.3.1 SentinelProperty
9.3.2 ReadableDataSource
9.4 基于Spring Cloud动态配置实现动态数据源
9.5 小结
第10章 适配主流框架
10.1 适配Spring MVC框架
10.1.1 使用步骤
10.1.2 适配原理
10.2 适配OpenFeign框架
10.2.1 使用步骤
10.2.2 Sentinel与OpenFeign整合的实现原理
10.3 适配Dubbo框架
10.3.1 使用步骤
10.3.2 适配原理
10.4 注解切面
10.4.1 @SentinelResource
10.4.2 SentinelResourceAspect
10.5 小结
第11章 热点参数限流
11.1 热点参数限流功能的实现
11.1.1 热点参数指标数据统计
11.1.2 热点参数限流的实现原理
11.2 流量效果控制
11.2.1 快速失败
11.2.2 匀速排队
11.3 小结
第12章 集群限流
12.1 本地限流与集群限流
12.2 集群限流的两种模式
12.2.1 嵌入式模式
12.2.2 独立应用模式
12.3 集群限流功能的实现
12.3.1 集群限流规则
12.3.2 集群限流规则的动态配置
12.3.3 集群限流客户端配置
12.3.4 集群限流服务端配置
12.3.5 动态配置为嵌入式模式提供支持
12.3.6 集群限流核心类介绍
12.3.7 集群限流客户端的实现
12.3.8 集群限流服务端的实现
12.3.9 集群限流指标数据统计的实现
12.4 小结
第13章 异步调用链的支持
13.1 Sentinel异步调用链的支持
13.2 适配Reactor框架的实现原理
13.2.1 Reactive Streams规范
13.2.2 Reactor发布-订阅流程
13.2.3 Reactor响应式流的构造原理
13.2.4 Reactor的Context传递过程
13.2.5 Sentinel适配Reactor框架的原理
13.3 适配WebFlux框架的实现原理
13.4 小结
第14章 Sentinel Dashboard
14.1 资源指标数据收集的实现原理
14.2 如何将资源指标数据输出到metrics日记文件中
14.3 如何持久化资源指标数据
14.4 小结
结束语