前言
Sentinel的使用前景
随着微服务的发展及DDD领域驱动设计的兴起,越来越多的企业开始使用微服务架构。无论是项目重构,还是新项目的开发,即使项目初期没有多大的流量,但从长远考虑,企业也基本会优先使用微服务架构。但“鱼和熊掌不可兼得”,项目微服务化在提升开发效率及降低后期维护成本的同时,也加大了服务部署运维及问题排查的难度,并且容易导致服务崩溃出现级联效应,也就是“服务雪崩”。
为了应对微服务化带来的难题,一批微服务组件与应用涌现出来,如辅助问题排查的分布式调用链追踪探针、简化部署运维的Kubernetes,以及本书介绍的熔断器组件等。
熔断器组件用于实现服务的自我保护,一般都具备限流、熔断功能。限流用于限制流量超过服务的临界点,避免突发流量导致服务崩溃;而熔断用于保护自身不受下游服务的影响,在感知到下游服务不稳定时自动断开请求,在下游服务恢复时再恢复请求。
并非流量大时才需要熔断器。一方面,微服务的调用错综复杂,若一个服务不可用,则有很大的概率影响到其周边服务,使其不可用,并且这种现象就像病毒一样具有扩散性,因此需要使用熔断器;另一方面,若项目对接一些第三方的接口,则在无法预估第三方接口的最大QPS及稳定性的情况下,添加熔断器能保证服务自身稳定运行。
Sentinel是熔断器的实现组件之一,具有扩展性强、对应用性能影响小、配置灵活,支持异步链路与响应式项目等特点,因此Sentinel很快在国内流行起来,成为国内众多开发者和架构师首选的熔断器组件。
笔者的使用体会
笔者有这样一个经历,即将一个项目从单体架构重构为微服务架构,并且担任该项目的主程序师,负责技术选型、微服务划分及框架搭建。在这个过程中,系统发生了一次服务雪崩,笔者至今记忆犹新,也是从那时起才认识到熔断器组件对于微服务的重要性。
Sentinel使用简单、配置灵活,可将Sentinel的动态数据源接口与配置中心结合使用,动态地改变流量规则。Sentinel提供的流量控制功能有限流、熔断、系统自适应、授权等。笔者当时使用了熔断和系统自适应功能应对突增流量导致服务雪崩的问题,同时使用限流功能并结合信号量隔离、匀速限流效果控制器,应对内部定时任务瞬时高并发调用某服务接口的问题。
在后续开发的项目中,笔者也经常使用Sentinel,如在某跨境电商项目的支付服务中使用Sentinel的熔断器功能;在其他微服务中扩展Sentinel实现开关降级,从而在促销活动开始前对不重要的接口进行降级处理,为大促销活动保驾护航。为了使用Kubernetes的ConfigMap资源存储限流规则,笔者还自行实现了Sentinel动态数据源,并基于Spring Cloud动态配置实现了限流规则的动态配置。
本书的特色
本书以“概念、核心类、整体工作流程、核心功能”为主脉络,系统、全面地对Sentinel的源码进行了分析,以图文结合的方式详细介绍了Sentinel的一些晦涩难懂的概念及数据结构,讲解了匀速限流算法、冷启动限流算法及Sentinel的代码实现,并分析了Sentinel中的一些代码为何如此编写,揣摩代码背后的设计思想。
需要向读者说明的一点是,书中诸如ServiceLoader#load的形式,表示ServiceLoader类的load方法,以此类推。
本书的内容
本书读者对象
❑ 正在进行微服务项目的开发者或组织
❑ 对Sentinel工作原理尚未了解的开发者
❑ 在响应式编程项目中对Sentinel感到困惑的开发者