SpringCloudAlibabaSentinel到底能干嘛
官方解释: 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性
Sentinel = ribbon + openFeign + fallback
Sentinel 具有以下特征:
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
下载使用
下载jar包 java -jar 启动可访问 http://127.0.0.1:8080/#/dashboard/home
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
启动服务注册到Nacos和Sentinel中
spring:
application:
name: name
cloud:
#向nacos中心注册服务
nacos:
discovery:
server-addr: localhost:8848
#向sentinel控制台注册服务
sentinel:
transport:
dashboard: localhost:8080
#取消控制台懒加载
eager: true
management:
endpoints:
web:
exposure:
include: '*'
feign:
sentinel:
enabled: true # 激活Sentinel对Feign的支持
server:
port: 1111
流控规则
资源名:唯一名称,默认请求路径
针对来源:Sentinel可以根据调用者进行限流,填写微服务名,默认default(不区分来源)
阈值类型/单击阈值:
QPS(每秒请求数量):当调用该api的QPS达到阈值时,进行限流
线程数:当调用该api的线程数达到阈值时,进行限流
是否集群:勾选则是集群
流控模式
直接:达到限流条件直接限流
管理:关联资源达到阈值,限流自己
链路:指定链路上的流量达到阈值,进行限流
流控效果(仅QPS)
快速失败:直接失败,抛异常
Warn Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值
排队等待:匀速排队,让请求匀速通过
降级规则
资源名:唯一名称,默认请求路径
降级策略:
RT(平均响应时间,秒级):平均响应时间超出阈值(以 ms 为单位),那么在接下的时间窗口(以 s 为单位)之内,对这个方法的调用都会自动地熔断
异常比例(秒级):当资源的每秒请求量 >= N(可配置),并且每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态,即在接下的时间窗口(以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%
异常数(分钟级):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。,若 时间窗口小于 60s,则结束熔断状态后仍可能再进入熔断状态
热点规则
资源名:唯一名称,默认请求路径
限流模式:QPS模式
参数索引:对应url参数索引位置
单机阈值:当调用该api的QPS达到阈值时,进行限流
统计窗口时长:统计窗口时间长度(单位为秒),1.6.0 版本开始支持
参数例外项(可以针对指定的参数值单独设置限流阈值,不受前面阈值的限制)
参数类型:仅支持基本类型和字符串类型
参数值:指定任意满足参数类型的参数值
限流阈值:针对指定的参数值的QPS达到阈值时,进行限流
系统规则(不建议)
LOAD(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是 CPU cores * 2.5
RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒
线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护
入口QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护
CPU使用率:当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏
持久化规则
重启应用,Sentinel规则会消失,生产环境需要将配置规则进行持久
1.依赖
<!-- 持久化进nacos -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
2.yaml
spring:
application:
name: sentinel-service
cloud:
nacos:
discovery:
server-addr: ip:8848
sentinel:
transport:
dashboard: ip:8080
port: 8719
datasource:
ds1:
nacos:
server-addr: ip:8848
dataId: sentinel-service
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow #流控规则
3.nacos配置
"resource":"myResource", #资源名称
"limitApp":"default", #针对来源
"grade":1, #阈值类型,0表示线程数,1表示QPS
"count":1, #单机阈值
"strategy":0, #流控模式,0表示直接,1表示关联,2表示链路
"controlBehavior":0, #流控效果,0表示快速失败,1表示Warn Up,2表示排队等待
"clusterMode":false #是否集群
Sentinel vs Hystrix区别
技术选型:Sentinel vs Hystrix-阿里云开发者社区
@SentinelResource
value:资源名称,必需项(不能为空)
entryType:entry 类型,可选项(默认为 EntryType.OUT)
blockHandler / blockHandlerClass:主管配置违规。blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
fallback / fallbackClass:管运行异常。fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。
defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。
exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出
服务熔断
fallback只熔断java代码异常
blockHandler 负责Sentinel配置异常
都配置 则被限流降级而抛出BlockException时只会进入BlockHandler处理逻辑
exceptionsTolgnore 配置的异常 fallback失效
@SentinelResource(value = "testA")//没有配置
@SentinelResource(value = "testA",fallback = "handlerFallback")//fallback只负责业务异常
@SentinelResource(value = "testA",blockHandler = "blockHandler")//blockHandler只负责sentinel控制台配置违规
@SentinelResource(value = "testA",fallback = "handlerFallback",blockHandler = "blockHandler")
@SentinelResource(value = "testA",fallback = "handlerFallback",blockHandler = "blockHandler",exceptionsTolgnore - {异常类型})
OpenFeign 配置打开Sentinel对Feign的支持
feign:
sentinel:
enabled: true # 激活Sentinel对Feign的支持