Sentinel断路器没有半开状态,所谓的半开状态是指系统自动去检测请求是否有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。
<br/>
Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出`DegradeException`)。
<br/>
:-: ![](https://img.kancloud.cn/23/a1/23a12e0ff3b89825f2d939684696965f_1889x716.png)
**设置降级规则的地方**
![](https://img.kancloud.cn/9a/f2/9af2cb50f03cfe554d9bf5f3d301953b_850x398.png)
**降级策略**
* 资源名:降级规则的作用对象,唯一名称,默认为请求路径。
下面演示降级策略的效果。
**1. RT(秒级平均响应时间)**
触发RT降级需要同时满足两个条件:<mark>在1s时间内对同一个资源请求大于等于5次</mark>且<mark>在RT时间内如果还没有将请求处理完</mark>,则会触发RT降级。过了这1s,再过时间窗口(单位s)后方可取消RT降级。
<br/>
(1)降级规则:如果在1s时间内请求`/testC`的次数大于等于5,并且在RT(200ms)的时间内没有将这1s内的请求处理完成,则触发RT降级。只有过了这1s的时间后,再过时间窗口的4s时间才会取消RT降级。
:-: ![](https://img.kancloud.cn/30/33/303381b5d7b91ecbf160dcff45f41adc_846x395.png)
(2)设置处理一次`/testC`请求需要1s的时间。
```java
@RestController
public class FlowLimitController {
@RequestMapping("testC")
public String testC() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "testC 测试RT-------";
}
}
```
(3)演示效果:我用jmeter在1s的时间内向`/testC`请求10次(已经超过Sentinel设定的5次了),并且在上一步规定处理每个请求需要1s的时间,但是10次请求我总共只给了200ms的时间,根本就处理不了,所以会触发RT降级,过了这1s,再过时间窗口的4s后才取消RT降级。
![](https://img.kancloud.cn/dd/32/dd32c4083bc1248bb1ef11876e247bfb_1494x405.gif)
<br/>
**2. 异常比例**
触发异常比例降级需要同时满足两个条件:<mark>在1s时间内对同一个资源请求大于等于5次</mark>且<mark>这1s时间内通过异常请求的比例大于设置的异常比例</mark>(异常比例范围在`[0.0, 1.0]`,对应`[0%, 100%]`),则会触发异常比例降级。过了这1s,再过时间窗口(单位s)后方可取消异常比例降级。
<br/>
(1)降级规则:如果在1s的时间内对`/testD`请求次数大于等于5,并且通过异常请求的比例大于设置的异常比例(0.2)则触发异常比例降级,过了这1s后,再过时间窗口的4s才取消异常比例降级。
![](https://img.kancloud.cn/39/6e/396e858b1f6ca52ab142c925069b263c_850x395.png)
(2)设置通过异常请求的比例为100%。
```java
@RestController
public class FlowLimitController {
@RequestMapping("/testD")
public String testD() {
//除数不能为0,这里会发生异常的
//如果异常被try/catch捕获不会触发异常比例降级
int age = 10 / 0;
return "testD 测试异常比例降级-------";
}
}
```
(3)演示效果:我用jmeter在1s时间内向`/testD`发送10次请求(已经超过Sentinel设定的5次了),并且每次请求都发生异常,即通过异常请求的比例为100%,已经超过设置的异常比例0.2了,所以异常比例降级被触发,当过了这1s,再过时间窗口的4s后,异常比例降级被取消。
![](https://img.kancloud.cn/80/72/807256cf0e7f903e9ef0d75690a2fe39_1494x405.gif)
<br/>
**3. 异常数**
触发异常数降级的条件是:1min内对同一资源请求通过的异常次数大于设置的异常数,则会触发异常数降级。从这1min内最后一次请求开始计算,过了时间窗口(单位s)后才取消异常数降级。
<br/>
异常数降级的时间窗口以min计算,所以设置的时间窗口小于60s的话,可能会导致已经被取消异常数降级后又自动触发异常数降级。
<br/>
(1)降级规则:如果1min内对`/testE`请求通过的异常次数大于设置的异常数5,则触发异常数降级。从这1min内的最后一次请求开始计算,过了时间窗口70s后异常数降级才被取消。
![](https://img.kancloud.cn/e4/c9/e4c992e3a828e5a6be1c8ec10e3d7b69_847x400.png)
(2)`/testE`请求。
```java
@RestController
public class FlowLimitController {
@RequestMapping("/testE")
public String testE() {
//除数不能为0,这里会发生异常的
//如果异常被try/catch捕获不会触发异常比例降级
int age = 10 / 0;
return "testE 测试异常数降级";
}
}
```
(3)演示效果:在1min内向`/testE`发出超过5次请求,每次请求都发生异常,超过了设置的异常数5,异常数降级被触发。从这1min内的最后一次请求开始计算,过了时间窗口70s后异常数降级才被取消。
- 微服务
- 微服务是什么?
- 微服务架构
- 微服务优缺点
- 微服务技术栈
- 微服务框架对比
- SpringCloud
- SpringCloud是什么
- SpringCloud与SpringBoot对比
- SpringCloud与Dubbo对比
- Rest微服务案例
- 总体介绍
- 父工程构建步骤
- 公共模块构建步骤
- 服务端模块构建步骤
- 消费端模块构建步骤
- Eureka服务注册与发现
- Eureka是什么
- Eureka原理
- Eureka注册服务中心构建
- 向Eureka注册已有微服务
- Eureka的自我保护机制
- Eureka服务发现
- Eureka集群配置
- Eureka与Zookeeper对比
- Ribbon负载均衡
- Ribbon是什么
- Ribbon负载均衡演示
- 构建服务端模块
- 构建消费端模块
- Ribbon核心组件IRule
- 自定义负载均衡策略
- Ribbon均衡策略优先级
- 轮询策略算法
- OpenFeign负载均衡
- OpenFeign是什么
- 负载均衡演示
- 日志打印功能
- 导出功能
- Hystrix断路器
- Hystrix是什么
- 服务熔断
- Hystrix服务端构建
- 服务熔断演示
- 服务熔断类型
- HystrixProperty配置汇总
- 服务降级
- Hystrix客户端构建
- 服务降级演示
- fallbackFactory
- 熔断与降级
- 服务监控
- 网关服务Zuul
- Zuul是什么
- Zuul路由服务构建
- 设置访问映射规则
- Config分布式配置中心
- Config分布式配置中心是什么
- Config服务端与Git通信
- Config客户端获取配置
- Config客户端动态刷新
- Bus消息总线
- Bus消息总线是什么
- Bus消息总线原理
- 广播通知设计思想
- 广播通知演示
- 定点通知演示
- Stream消息驱动
- 为什么要引入Stream
- Stream消息驱动是什么
- Stream设计思想
- Stream流程和注解
- Stream案例演示
- 重复消费问题
- 消息持久化
- Sleuth分布式链路跟踪
- Sleuth是什么
- 搭建链路监控
- SpringCloud Alibaba
- Nacos注册与配置中心
- Nacos是什么
- 安装并运行Nacos
- Nacos注册中心
- 服务端入住Nacos
- 消费端入住Nacos
- Nacos负载均衡演示
- 服务注册中心对比
- Nacos的AP和CP转化
- Nacos配置中心
- 基础配置演示
- Nacos分类配置
- Nacos集群搭建
- Sentinel实现熔断与限流
- Sentinel是什么
- Sentinel环境搭建
- Sentinel监控微服务演示
- Sentinel流控规则
- 流量监控的作用
- 设置流控规则
- Sentinel降级规则
- 熔断降级作用
- 设置降级规则
- Sentinel热点限流
- 什么是热点
- 设置热点限流
- Sentinel系统限流
- @SentinelResource
- @SentinelResource属性
- @SentinelResource限流演示
- @SentinelResource熔断演示
- 规则持久化
- 熔断框架比较
- Seata分布式事务
- 分布式事务问题
- Seata是什么
- Seata分布式事务过程
- Seata环境搭建
- 演示示例
- 业务说明
- 数据库环境准备
- 微服务环境准备
- 测试
- Consul服务注册与发现
- Consul是什么
- Consul能做什么
- 环境搭建
- Windows平台
- 服务端入住Consul
- 消费端入住Consul
- 注册中心对比
- Zookeeper服务注册与发现
- Zookeeper是什么
- 环境搭建
- 服务端入住Zookeeper
- 消费端入住Zookeeper
- 网关服务Gateway
- Gateway是什么
- Gateway能做什么
- Gateway对比Zuul
- 三大核心概念
- Gateway工作流
- 环境搭建
- 网关路由配置方式
- 配置文件配置
- 代码中配置
- 动态路由
- Predicate断言
- 断言是什么
- 常用断言
- Filter过滤器
- 过滤器是什么
- 过滤器种类
- 自定义过滤器