分布式微服务 - 3.降级熔断 - 3.Sentinel
项目示例:
- 项目示例 - 3.降级熔断 - 2.Sentinel
内容提要:
- 下载启动
- 注册、持久化、资源配置
- 流控、热点、系统规则
- 熔断、授权
文档:
下载启动
- 下载jar包
- 在其所在目录中打开命令窗口,输入
java -jar jar包名称
启动sentinel dashboard - 浏览器中输入
localhost:8080
打开首页,账号和密码皆为sentinel登录(sentinel dashboard默认是懒加载模式,即只有访问过一次微服务接口后,才会在sentinel中显示)
注册到sentinel
- 导入依赖
xml
<!--Sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
- application.yml配置
yml
spring:
cloud:
sentinel:
# 取消控制台懒加载
eager: true
transport:
# 配置sentinel dashboard地址
dashboard: localhost:8080
# sentinel客户端启动的端口,默认8719端口(占用时会依次+1找未占用端口)
port: 8719
持久化配置
在sentinel dashboard上配置的规则会存储在sentinel客户端的内存中,因此在微服务重启后,配置的规则会消失。sentinel可以更改数据源,将规则持久化到其他数据源中(以下以nacos为例)。进行持久化配置后,配置规则的流程是:在数据源上修改,之后会自动同步到sentinel并应用于微服务(直接在sentinel dashboard上增删改规则并不会同步到数据源上,因此修改只是临时的,重启微服务后便会丢失)
配置步骤:(涉及配置中心的知识,可结合后续的配置中心nacos知识)
- 注册到nacos配置中心(详见后续配置中心的知识)
- 引入持久化依赖
xml
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
- application.yml配置:rule-type对应sentinel的不同配置,flow 流控、degrade 降级熔断、param-flow 热点、system 系统保护规则、authority 授权
yml
spring:
cloud:
sentinel:
datasource:
# 配置的数据源名称,可任意起名
flow:
# 数据源类型
nacos:
# nacos地址
server-addr: ${spring.cloud.nacos.config.server-addr}
# 配置文件名称
data-id: ${spring.application.name}-flow
# namespace(默认用public命名空间时不需要显示声明)和groupId
group-id: DEFAULT_GROUP
data-type: json
# 读取来的json字符串用于sentinel的哪项配置
rule-type: flow
- nacos配置中心新增配置:在nacos配置列表(对应的namespace)中新建dataId为sentinel-provider-flow(对应上述配置),groupId为DEFAULT_GROUP(对应上述配置),配置格式为json的配置文件。配置文件内容最外层是
[]
,内部为多个属性组成的对象{ "key": value }
配置资源
在类或者API方法上用@SentinelResource注解修饰可以配置资源。当资源触发流控降级规则时,抛出BlockException,若有配置blockHandler,则由该Handler处理。fallbackHandler会处理所有异常(包括BlockException)。同时配置blockHandler和fallbackHandler时,前者优先级更高。
通过配置blockHandler和fallbackHandler,可以自定义流控、降级、异常时的返回信息。
注解属性
- value:自定义资源名,用于sentinel配置规则时区分资源,必需项。
- blockHandlerClass/blockHandler:blockHandlerClass为函数所在类的Class对象(此时要求函数是static)。blockHandler为函数名字符串,且函数要求满足以下条件:
- 方法访问范围要求是public
- 返回类型要求与原方法相同
- 参数列表要求与原方法相同且最后加一个类型为BlockException的参数(接收异常信息)
- fallbackClass/fallback:fallbackClass为函数所在类的Class对象(此时要求函数是static)。fallback为函数名字符串,且函数要求满足以下条件:
- 返回值类型必须与原函数返回值类型一致;
- 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
- exceptionsToIgnore:用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。
流量控制(流控)
流量控制(也称流控,同限流)分为对单机微服务请求的控制和对集群微服务请求的控制(倘若只针对集群每个节点配置单机流控,则有可能因为流量不均匀导致单机达到阈值触发流控但集群整体没达到阈值)。
规则因素
- 资源名[resource]
- 该限流规则作用的对象
- String类型值,资源名或者api路径,必须唯一
- 针对来源[limitApp]
- 可以只对指定的服务调用者起效
- String类型值,默认为default,微服务名,default时所有来源都有效
- 阈值类型[grade]
- 指定是统计QPS(每秒钟请求数量)还是线程数达到阈值时进行限流
- 数值类型,0表示线程数、1表示QPS,默认为1
- 单机阈值[count]
- 指定阈值大小,达到阈值后触发流控
- 数值类型
- 流控模式[strategy]
- 直接:触发规则后直接限流;关联:关联资源达到本规则的阈值后,限流本资源;链路:对到来的请求筛选,只统计从入口资源到来的流量,达到阈值后,限流本资源(与针对来源相似,但针对来源是微服务级别,该配置项是api级别)。
- 数值类型,0表示直接、1表示关联、2表示链路,默认为0,关联和链路时需要配置关联/入口资源(否则json配置读取失败)
- 关联/入口资源[refResource]
- 流控规则是关联和链路时,配置的资源名
- String类型值,资源名或者api路径,必须唯一
- 流控效果[controlBehavior]
- 快速失败:限流时,直接失败并抛出异常;Warm Up:根据codeFactory(冷加载因子,默认为3)从阈值/codeFactory经预热时长,逐渐达到设置的阈值;排队等待:控制请求间隔,使其匀速到来。
- 数值类型,0表示快速失败、1表示Warm Up、2表示排队等待,默认为0
- 预热时长[warmUpPeriodSec]
- 流控效果为Warm Up时,配置预热时长,单位秒
- 数值类型,默认为10
- 超时时间[maxQueueingTimeMs]
- 流控效果为排队等待时,配置超时时间,单位毫秒
- 数值类型,默认为500
- 是否集群[clusterMode]
- 是否要对集群进行流控
- 布尔值,false表不对集群进行流控、true表对集群流控,默认为false
降级熔断
无论哪个熔断策略,都要求一个最小请求数目,即在一个统计时长内,请求数量必须大于等于设置的最小请求数目,然后再考虑是否达到其他熔断策略,否则不会触发熔断。
达到熔断策略的条件(即触发熔断),资源被熔断后,接下来的一个熔断时长内请求会自动被熔断。经过熔断时长后,熔断器会进入探测恢复状态(HALF-OPEN状态),若接下来的一个请求不会触发熔断策略的条件则结束熔断,否则会再次被熔断。
规则因素
- 资源名[resource]
- 该熔断规则作用的对象
- String类型值,资源名或者api路径,必须唯一
- 熔断策略[grade]
- 慢调用比例:当一个请求的响应时间大于设置的最大RT时,则统计为慢调用。在设置的一个统计时长内,请求数量大于设置的最小请求数目,且慢调用的比例大于阈值时,触发熔断。
- 异常比例:在设置的一个统计时长内,请求数量大于设置的最小请求数目,且响应为异常的请求比例大于阈值时,触发熔断
- 异常数:与异常比例类似,只不过统计的是异常数目,而不是异常比例。
- 数值类型,0表示慢调用比例、1表示异常比例、2表示异常数,默认为0
- 最大RT/比例阈值/异常数[count]
- 慢调用比例时,表示最大RT(Response Time,响应时间),单位毫秒;异常比例时,表示比例(注意:此时范围必须在0.0与1.0之间);异常数时,表示数目。
- 数值类型,默认为0
- 比例阈值[slowRatioThreshold]
- 仅慢调用时有效
- 数值类型,默认为1,范围必须在0.0与1.0之间
- 熔断时长[timeWindow]
- 资源被熔断后,接下来的一个熔断时长内请求会自动被降级。
- 数值类型,单位为S
- 最小请求数[minRequestAmount]
- 在一个统计时长内,请求数量必须大于等于设置的最小请求数目,否则不会触发熔断
- 数值类型,默认为5
- 统计时长[statIntervalMs]
- 熔断策略在一个统计时长内,统计请求是否会触发熔断
- 数值类型,单位ms,默认为1000
热点参数
热点参数限流可以看做是一种特殊的流量控制,仅对包含指定参数的请求生效。
规则因素
- 资源名[resource]
- 该限流规则作用的对象
- String类型值,
注意 必须是资源名
,必须唯一
- 参数索引[paramIdx]
- 资源对应的接口方法中的第几个参数
- 数值类型,从0开始
- 单机阈值[count]
- 指定阈值大小,达到阈值后触发限流
- 数值类型,默认为0
- 统计窗口时长[durationInSec]
- 统计一次的时长
- 数值类型,单位s,默认为1
- 是否集群[clusterMode]
- 是否要对集群进行流控
- 布尔值,false表不对集群进行流控、true表对集群流控,默认为false
- 参数例外项[paramFlowItemList]
- 可对参数的某些特定值单独配置阈值
- 数组,数组中的每一项是一个对象,对象包含以下属性
- 参数类型[classType]
- 参数值的数据类型
- String类型,仅可选基本类型和字符串类型
- 限流阈值阈值[count]
- 指定阈值大小,达到阈值后触发限流
- 数值类型,默认为0
- 参数值[object]
- 要单独配置的参数值
- 根据参数类型确定值类型
- 参数类型[classType]
系统规则
对应用级别的入口流量进行控制。是针对应用整体维度的,而不是资源维度的,并且仅对入口流量(进入应用的流量)生效。
授权规则(黑白名单)
根据请求来源来限制资源是否通过。请求来源的判断需要微服务中自定义类实现RequestOriginParser接口和方法,并@Component注入(注意,要考虑request中没有对应key的情况)。
规则因素
- 资源名[resource]
- 该熔断规则作用的对象
- String类型值,资源名或者api路径,必须唯一
- 流控应用[limitApp]
- 要控制的来源
- String类型值,多个来源时用逗号分隔
- 授权类型[strategy]
- 名单的类型,若配置白名单,则仅白名单才可通过;若配置黑名单,则黑名单不通过,其余通过。
- 数值类型,0表示白名单、1表示黑名单,默认为0