Alibaba Sentinel

2020-06-29  本文已影响0人  c80bbe47f715
sentinel-logo

Sentinel 是什么

Sentinel 是面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护等多个维度来帮助您保障微服务的稳定性。

2012年起步,主要功能是入口流量控制,在阿里内部覆盖了所有核心场景。2018年开源,发展至今已经可以提供各种维度、各种角度的风骚的流量控制功能。

Sentinel流量整形实际效果

在本地环境使用 ab 对喜茶 GO 小程序菜单接口进行30线程并发压测
整形前
ab-test
整形后
ab-test2

对比流量整形前后,在服务提供同样QPS处理能力的情况下,平均RT从整形前的493-1730ms稳定到了468-599ms,cpu从80%降至50%,削峰填谷效果明显。

先回顾下Hystrix

Hystrix的核心功能:

两种资源隔离策略:

线程池(默认)

通过HystrixCommand为调用依赖的api分配定制化的线程池,请求与调用线程分离,既异步调用

信号量

通过HystrixCommand为调用依赖的api分配信号量,请求与调用使用相同线程,既同步调用

3.png 4.png 5.png 6.png

Sentinel与Hystrix的差异

Hystrix 的关注点在于以隔离和熔断为主的容错机制,超时或被熔断的调用将会快速失败,并可以提供 fallback 机制。

而 Sentinel

7.png

他的侧重点在于:

在熔断策略上,Hystrix的两种资源隔离策略无法同时满足:低开销+灵活的超时控制,而Sentinel可以同时配置并发线程数控制+响应时间超时熔断

8.png

Sentinel 的核心概念

使用 Sentinel 来进行资源保护,主要分为几个步骤:

  1. 定义资源
  2. 定义规则
  3. 检验规则是否生效

资源

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

规则

围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则,或是自定义规则。所有规则可以动态实时调整。

流量控制规则(FlowRule)

两种统计类型
9.png

该方式的作用如下图所示:

10.png

使用Sentinel的这种策略, 简单点说, 就是使用一个时间段(比如20s的时间)处理某一瞬时产生的大量请求, 起到一个削峰填谷的作用, 从而充分利用系统的处理能力, 下图能很形象的展示这种场景: X轴代表时间, Y轴代表系统处理的请求.

11.png

三种流控模式

熔断降级规则 (DegradeRule)

系统保护规则 (SystemRule)

Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

访问控制规则 (AuthorityRule)

很多时候,我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的访问控制(黑白名单)的功能。黑白名单根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

热点规则 (ParamFlowRule)

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

定制自己的持久化规则

提供了开放的接口,您可以通过实现 DataSource 接口的方式,来自定义规则的存储数据源。通常我们的建议有:

Sentinel工作原理概览

在 Sentinel 里面,所有的资源都对应一个资源名称(resourceName),每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 SphU API 显式创建。Entry 创建的时候,同时也会创建一系列功能插槽(slot chain),这些插槽有不同的职责,例如:

总体的框架如下:

12.jpeg

Sentinel 将 ProcessorSlot 作为 SPI 接口进行扩展(1.7.2 版本以前 SlotChainBuilder 作为 SPI),使得 Slot Chain 具备了扩展的能力。您可以自行加入自定义的 slot 并编排 slot 间的顺序,从而可以给 Sentinel 添加自定义的功能。

13.png

如何使用Sentinel

wiki:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
Quick Start https://github.com/alibaba/Sentinel/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97#%E6%9C%AC%E5%9C%B0-demo
Sentinel Demo集锦:https://github.com/alibaba/Sentinel/tree/master/sentinel-demo
Spring Cloud Alibaba Sentinel:https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel

参考:https://github.com/alibaba/Sentinel/wiki

上一篇 下一篇

猜你喜欢

热点阅读