Sentinel 学习笔记

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

基本概念

资源

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

规则

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

Sentinel的组件由两个部分组成

核心库(客户端)

不依赖任何框架/库,能够运行于所有的Java环境,同时对Dubbo/SpringCloud等框架也有较好的支持。

控制台(Dashboard)

基于SpringBoot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。

流控规则

  • 资源名:唯一名称,默认请求路径。
  • 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认为default(不区分来源)。
  • 阈值类型/单机阈值:
    • QPS(每秒的请求数量):当调用该API的QPS达到阈值的时候,进行限流。
    • 线程数:当调用该API的线程数达到阈值的时候,进行限流。
  • 是否集群:不需要集群
  • 流控模式:
    • 直接:API达到限流条件的时候,直接限流。
    • 关联:当关联的资源达到阈值的时候,就限流自己。
    • 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【API级别的针对来源】。
  • 流控效果:
    • 快速失败:直接失败,抛异常。
    • Warm Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长。大达到设置的QPS阈值。
    • 排队等候:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效。

降级规则

  • RT(平均响应时间,秒级):平均响应时间超出阈值且在时间窗口内通过的请求>=5,两个条件同时满足后触发降级。窗口期过后关闭断路器,RT最大4900(更大的需要通过-Dcsp.sentinel.statistic.max.rt=xxxx 才能生效)。
  • 异常比例(秒级):QPS>=5异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级。
  • 异常数(分钟级):异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级。

Sentinel熔断降级会在调用链路中的某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为时抛出DegradeException)。Sentinel的断路器是没有半开状态的。

半开状态即系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器。