吴就业
吴就业,《实战Alibaba Sentinel》图书作者,基础架构高级研发工程师。个人网站:www.wujiuye.com。
展开
-
开篇词:一次服务雪崩问题排查经历
笔者想跟大家分享笔者经历的一次服务雪崩事故,分析导致此次服务雪崩事故的原因。或许大多数读者都有过这样的经历,这是项目给我们上的一次非常宝贵的实战课程。什么是服务雪崩?雪崩一词指的是山地积雪由于底部溶解等原因而突然大块塌落的现象,具有很强的破坏力,在微服务项目中指由于突发流量导致某个服务不可用,从而导致上游服务不可用,并产生级联效应,最终导致整个系统不可用,使用雪崩这个词来形容这一现象最合适不过...原创 2020-09-22 12:05:13 · 646 阅读 · 0 评论 -
为什么需要服务降级以及常见的几种降级方式
为什么需要服务降级,常见的降级方式有哪些?上一篇笔者跟大家分享了一个真实的服务雪崩的故事,也分析了造成服务雪崩的真正原因,那么,如何才能避免服务雪崩的出现呢?我知道你会说:增加硬件,没有什么是钱解决不了的。注意,是避免,在有限的硬件条件下,避免流量突增导致服务雪崩。最好方案应该就是服务降级,处理不过来就不处理了呗。当服务 B 业务线程池全部用满的状态时,应该拒绝服务 A 的请求(这一点 Dub...原创 2020-09-22 12:05:11 · 1954 阅读 · 1 评论 -
为什么选择 Sentinel,Sentinel 与 Hystrix 的对比
为什么选择 Sentinel?选择 Sentinel 与 Hystrix 通常第一步都是通过对比两者优缺点,Sentinel 与 Hystrix 的对比结果是作为我们选择 Sentinel 还是 Hystrix 的直观参考,不过使用 Sentinel 能做什么,是否满足实际需求才是我们最终决定是否使用 Sentinel 的最关键因素,否则尽管一个框架再好,不适合也不会选择。以下 Sentine...原创 2020-09-22 12:05:10 · 3345 阅读 · 1 评论 -
Sentinel 基于滑动窗口的实时指标数据统计
Sentinel 是基于滑动窗口实现的实时指标数据统计,要深入理解 Sentinel 的限流实现原理,首先我们得要了解其指标数据统计的实现,例如如何统计 QPS。为了简单,我们不直接分析 Sentinel 的源码,而是分析笔者从 Sentinel 中摘抄的,且经过改造后的“qps-helper”工具包的代码。总体上是一样的,笔者去掉了一些不需要的指标统计,以及将 Sentinel 一些自定义的类...原创 2020-09-22 12:05:08 · 612 阅读 · 1 评论 -
Sentinel 的一些概念与核心类介绍
了解 Sentinel 的一些概念资源:资源是 Sentinel 的关键概念。资源,可以是一个方法、一段代码、由应用提供的接口,或者由应用调用其它应用的接口。规则:围绕资源的实时状态设定的规则,包括流量控制规则、熔断降级规则以及系统保护规则、自定义规则。降级:在流量剧增的情况下,为保证系统能够正常运行,根据资源的实时状态、访问流量以及系统负载有策略的拒绝掉一部分流量。Sentinel ...原创 2020-09-22 12:05:06 · 1399 阅读 · 1 评论 -
Sentinel 中的责任链模式与 Sentinel 的整体工作流程
上一篇我们简单了解了 ProcessorSlot,并且将 Sentinel 提供的所有 ProcessorSlot 分成两类,一类是辅助完成资源指标数据统计的 ProcessorSlot,一类是实现降级功能的 ProcessorSlot。Sentinel 的整体工具流程就是使用责任链模式将所有的 ProcessorSlot 按照一定的顺序串成一个单向链表。辅助完成资源指标数据统计的 Proces...原创 2020-09-22 12:05:05 · 351 阅读 · 1 评论 -
Java SPI 及 SPI 在 Sentinel 中的应用
SPI 全称是 Service Provider Interface,直译就是服务提供者接口,是一种服务发现机制,是 Java 的一个内置标准,允许不同的开发者去实现某个特定的服务。SPI 的本质是将接口实现类的全限定名配置在文件中,由服务加载器读取配置文件,加载实现类,实现在运行时动态替换接口的实现类。使用 SPI 机制能够实现按配置加载接口的实现类,SPI 机制在阿里开源的项目中被广泛使用,...原创 2020-09-22 12:05:03 · 573 阅读 · 1 评论 -
资源指标数据统计的实现全解析(上)
节点选择器:NodeSelectorSlotNodeSelectorSlot 负责为资源的首次访问创建 DefaultNode,以及维护 Context.curNode 和调用树。NodeSelectorSlot 被放在 ProcessorSlotChain 链表的第一个位置,这是因为后续的 ProcessorSlot 都需要依赖这个 ProcessorSlot。NodeSelectorSlot...原创 2020-09-22 12:05:01 · 176 阅读 · 1 评论 -
资源指标数据统计的实现全解析(下)
资源指标数据统计:StatisticSlotStatisticSlot 才是实现资源各项指标数据统计的 ProcessorSlot,它与 NodeSelectorSlot、ClusterBuilderSlot 组成了资源指标数据统计流水线,分工明确。首先 NodeSelectorSlot 为资源创建 DefaultNode,将 DefaultNode 向下传递,ClusterBuilderSl...原创 2020-09-22 12:04:59 · 269 阅读 · 1 评论 -
限流降级与流量效果控制器(上)
从这篇开始,我们学习 Sentinel 提供的几个实现降级功能的 ProcessorSlot,这些 ProcessorSlot 检查实时指标数据是否达到规则所配置的阈值,当达到阈值时,或抛出 Block 异常或采取流量效果控制策略处理超阈值的流量。Sentinel 实现限流降级、熔断降级、黑白名单限流降级、系统自适应限流降级以及热点参数限流降级都是由 ProcessorSlot、Checker、...原创 2020-09-22 12:04:58 · 212 阅读 · 1 评论 -
限流降级与流量效果控制器(中)
经典限流算法计数器算法Sentinel 中默认实现的 QPS 限流算法和 THREADS 限流算法都属于计数器算法。QPS 限流的默认算法是通过判断当前时间窗口(1 秒)的 pass(被放行的请求数量)指标数据判断,如果 pass 总数已经大于等于限流的 QPS 阈值,则直接拒绝当前请求,每通过一个请求当前时间窗口的 pass 指标计数加 1。THREADS 限流的实现是通过判断当前资源并行占...原创 2020-09-22 12:04:56 · 155 阅读 · 1 评论 -
限流降级与流量效果控制器(下)
WarmUpControllerWarm Up,冷启动。在应用升级重启时,应用自身需要一个预热的过程,预热之后才能到达一个稳定的性能状态,比如说,接口预热阶段完成 JIT 即时编译、完成一些单例对象的创建、线程池的创建、各种连接池的初始化、或者执行首次需要加锁执行的代码块。冷启动并非只在应用重启时需要,在一段时间没有访问的情况下,连接池存在大量过期连接需要待下次使用才移除掉并创建新的连接、一些...原创 2020-09-22 12:04:54 · 255 阅读 · 0 评论 -
熔断降级与系统自适应限流
熔断降级限流需要我们根据不同的硬件条件做好压测,压测出一个接口或者一个服务在某种硬件配置下最大能承受的 QPS,根据这个结果配置限流规则,并且在后期需求的不断叠加,也需要对接口重新做压测,或者根据线上的实际表现不断调整限流的阈值。因此,限流可能很少使用,或者限流的阈值都会配置的比压测结果略大,这时就需要结合熔断降级做兜底。Sentinel 支持对同一个资源配置多个相同类型或不同类型的规则,在配...原创 2020-09-22 12:04:52 · 319 阅读 · 1 评论 -
黑白名单限流与热点参数限流
黑白名单限流黑白名单过滤是使用最为广泛的一种过滤规则,例如,用于实现接口安全的 IP 黑白名单规则过滤,用于防骚扰的短信、来电拦截黑白名单过滤。所以 Sentinel 中的黑白名单限流并不难理解,如果配置了黑名单,且请求来源存在黑名单中,则拦截(拒绝)请求,如果配置了白名单,且请求来源存在白名单中则放行。Sentinel 不支持一个黑白名单规则同时配置黑名单和白名单,因此不存优先级的问题。黑白...原创 2020-09-22 12:04:50 · 507 阅读 · 1 评论 -
自定义 ProcessorSlot 实现开关降级
开关降级在我们公司的电商项目中是每个微服务都必须支持的一项功能,主要用于活动期间、每日流量高峰期间、主播带货期间关闭一些无关紧要功能,降低数据库的压力。开关降级实现起来很简单,例如,我们可以使用 Spring AOP 或者动态代理模式拦截目标方法的执行,在方法执行之前,先根据 key 从 Redis 读取 value,如果 value 是 true,则不执行目标方法,直接响应服务降级。这种方式付...原创 2020-09-22 12:04:49 · 281 阅读 · 1 评论 -
Sentinel 动态数据源:规则动态配置
经过前面的学习,我们知道,为资源配置各种规则可使用 Sentinel 提供的各种规则对应的 loadRules API,但这种以编码的方式配置规则很难实现动态修改。但基于 Sentinel 提供的各种规则对应的 loadRules API,我们可以自己实现规则的动态更新,而这一功能几乎在每个需要使用 Sentinel 的微服务项目中都需要实现一遍。Sentinel 也考虑到了这点,所以提供了动态数...原创 2020-09-22 12:04:47 · 1289 阅读 · 1 评论 -
Sentinel 主流框架适配
使用 Sentinel 需要用 try-catch-finally 将需要保护的资源(方法或者代码块)包装起来,在目标方法或者代码块执行之前,调用 ContextUtil#enter 方法以及 SphU#entry 方法,在抛出异常时,如果非 BlockException 异常需要调用 Tracer#trace 记录异常,修改异常指标数据,在 finally 中需要调用 Entry#exit 方法...原创 2020-09-22 12:04:46 · 268 阅读 · 1 评论 -
Sentinel 集群限流的实现(上)
由于请求倾斜的存在,分发到集群中每个节点上的流量不可能均匀,所以单机限流无法实现精确的限制整个集群的整体流量,导致总流量没有到达阈值的情况下一些机器就开始限流。例如服务 A 部署了 3 个节点,规则配置限流阈值为 200qps,理想情况下集群的限流阈值为 600qps,而实际情况可能某个节点先到达 200qps,开始限流,而其它节点还只有 100qps,此时集群的 QPS 为 400qps。Se...原创 2020-09-22 12:04:44 · 1373 阅读 · 1 评论 -
Sentinel 集群限流的实现(下)
集群限流源码分析集群限流,我们可以结合令牌桶算法去思考,服务端负责生产令牌,客户端向服务端申请令牌,客户端只有申请到令牌时才能将请求放行,否则拒绝请求。集群限流也支持热点参数限流,而实现原理大致相同,所以关于热点参数的集群限流将留给大家自己去研究。核心类介绍sentinel-core 模块的 cluster 包下定义了实现集群限流功能的相关接口:TokenService:定义客户端向服...原创 2020-09-22 12:04:42 · 601 阅读 · 1 评论 -
结束语:Sentinel 对应用的性能影响如何?
“引入 Sentinel 带来的性能损耗非常小,只有在业务单机量级超过 25W QPS 的时候才会有一些显著的影响(5%~10% 左右),单机 QPS 不太大的时候损耗几乎可以忽略不计。”这是官方文档写的一段话,那么性能到底如何呢?本篇我们回顾 Sentinel 的源码,看看 Sentinel 在性能方面所做出的努力,最后使用 JMH 做个简单的基准测试,看看 Sentinel 表现如何,在此之...原创 2020-09-22 12:04:40 · 1236 阅读 · 1 评论 -
番外篇:Sentinel 1.8.0 熔断降级新特性解读
在本专栏写作完成之际,笔者看到阿里官方推出了 Sentinel 1.8.0 版本,该版本发布时间为 2020/08/20。与此同时,官方文档也更新了关于熔断降级的介绍。从官方文档来看,该版本的最大亮点是对熔断降级功能进行了重构。旧版本的熔断降级功能对慢调用并不友好,而新版本改善了这个问题。在微服务项目中,一个微服务常常需要调用内部其它服务的接口,即便是单体架构项目,也免不了会调用一些第三...原创 2020-09-22 12:04:39 · 941 阅读 · 1 评论