什么是Sentinel:
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel功能简介:
备注:本次介绍sentinel版本为1.5.2;
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
以下为1.5.2版本中的规则:
1.实时监控
Sentinel 提供对所有资源的实时监控。
2.簇点链路
显示资源路径的调用情况,并可对指定资源名进行流控,授权,降级,热点等规则进行操作。
3.流控规则
流量控制,是监控应用流量的QPS或并发线程数等指标,当达到指定的阈值时对流量进行控制,以免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
4.授权规则
有些场景下,我们需要根据调用方来限制资源是否通过,这时候可以使用Sentinel的黑白名单控制的功能,黑白名单根据资源的请求IP限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才能通过;若配置黑名单则请求来源于黑名单时不通过,其余的请求通过。
5.热点规则
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
6.降级规则
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException
)。
7.系统规则
Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、总体平均 RT、入口 QPS 和线程数等几个维度的监控指标,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
8.机器列表
显示所有连接并注册在sentinel-dashboard上的网关实例信息(机器名,IP地址,端口号,心跳发送时间等)及健康状态,可手动移除健康状标记为失联的网关实例。
源码阅读
在入口CommonFilter中,所有的请求会经过这个类,如下图,获取资源路径和来源应用
在ContextUtil中的trueEnter方法中,将资源路径和origin进行存储
返回进入SphU.entry(target, EntryType.IN)方法中,然后进入ProcessorSlot<T>类中
进入各种规则校验的方法。
各个规则中的源码下次分享,从入口进入后到进行规则中逻辑判断的源码分享。
github地址:https://github.com/alibaba/Sentinel