1、引入依赖
版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub
Sentinel · alibaba/spring-cloud-alibaba Wiki · GitHub
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、配置规则
限流与降级区别:
1.目标不同:
限流是为了避免系统过载,保护系统资源;
降级是为了在服务出现异常时避免整个系统受到影响。
2.触发条件不同:
限流通常是基于流量大小或频率来触发;
降级则是基于服务的健康状态或异常情况来触发。
3.行为不同:
限流可能会拒绝部分请求;
降级则是对异常服务的替代处理,返回预定义的结果或错误信息。
// 限流配置规则
@PostConstruct
public static void initFlowRules() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("ordering"); //设置资源名称
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);//QPS 每秒的访问量
// Set limit QPS to 20.
rule.setCount(2);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
// 降级规则
//@PostConstruct
public void initFlowRules2() {
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule();
rule.setResource("ordering2"); //设置资源名称
rule.setGrade(RuleConstant.DEGRADE_GRADE_Sentinel使用EXCEPTION_RATIO); // 异常比率模式
rule.setCount(0.5); 异常比率阈值(50%)
rule.setMinRequestAmount(10);// 单位时长的最小请求数
rule.setTimeWindow(10); // 熔断时长10s
rule.setStatIntervalMs(10*1000); 10s 统计时长,统计的窗口(单位为 ms) 表示每10秒统计一次异常率。
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}
3、为接口设置熔断与降级方法
3.1 blockHandler与fallback命名规则
-
blockHandler方法应该接收与原始方法相同类型的参数,并且额外添加一个
BlockException
类型的参数,用于传递被 Sentinel 阻塞的具体原因。
命名规则是:
1:原方法名 + "_blockHandler",比如在示例中,对应的 blockHandler 方法应该是
ordering_blockHandler(Integer id, BlockException ex)
。2:必须为static方法
-
fallback方法应该接收与原始方法相同类型的参数
命名规则是:
1:原方法名 + "_fallback",此方法应该接收与原始方法相同的参数列表,并返回与原始方法相同的返回类型。
2:必须为static方法
在示例中,对应的 fallback 方法应该是
ordering_fallback(Integer id)
也可以ordering_fallback(Integer id, Throwable ex)
上述的 _blockHandler
和 _fallback
后面是可以带上任意的参数类型,但至少需要包含原始方法的所有参数类型,以及在 blockHandler
方法中加入 BlockException
参数。
3.2 触发条件
-
blockHandler:
-
触发条件:当资源访问由于触发了 Sentinel 的流控(QPS 超过阈值等情况)规则而被阻止时,会触发
blockHandler
指定的方法。该方法主要用于处理因流量控制而导致的阻塞情况。 -
示例中
blockHandler="ordering_blockHandler"
表示如果ordering
方法因为 Sentinel 流控规则而被阻止时,将调用OrderController
类中的ordering_blockHandler
方法进行处理。 -
fallback:(回退方法)
-
触发条件:通常在服务不稳定或者异常抛出时触发。对于 Sentinel 来说,若开启了熔断(如因多次调用超时或异常),则会触发熔断进入半开状态,后续请求会直接进入 fallback 处理逻辑,或者在某些资源执行过程中发生了异常也会触发 fallback。
-
示例中
fallback="ordering_fallback"
表示如果ordering
方法出现异常或者满足 Sentinel 熔断策略时,将调用OrderController
类中的ordering_fallback
方法进行回退处理。 -
在熔断期间,不再调用原始方法,而是直接调用降级方法
3.3验证限流
3.4 验证降级
4、验证接口
略.......
5、高级配置
5.1流量控制规则 (FlowRule)
5.2 熔断降级规则 (DegradeRule)
5.3 系统保护规则 (SystemRule)
Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
private void initSystemProtectionRule() {
List<SystemRule> rules = new ArrayList<>();
SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(10);
rules.add(rule);
SystemRuleManager.loadRules(rules);
}
5.4 访问控制规则 (AuthorityRule)
很多时候,我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的访问控制(黑白名单)的功能。黑白名单根据资源的请求来源(origin
)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。授权规则,即黑白名单规则(AuthorityRule
)非常简单,主要有以下配置项:
-
resource
:资源名,即限流规则的作用对象 -
limitApp
:对应的黑名单/白名单,不同 origin 用 ,分隔,如appA,appB
-
strategy
:限制模式,AUTHORITY_WHITE
为白名单模式,AUTHORITY_BLACK
为黑名单模式,默认为白名单模式