前置条件
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
配置yml
server:
port: 10001
spring:
application:
name: cloud-consumer-feign
cloud:
nacos:
discovery:
namespace: public
server-addr: localhost:8848
//[0]
sentinel:
transport:
dashboard: localhost:8080
port: 8719
- [0]处 为配置sentinel,dashboard时sentinel后台管理页面地址,port为sentinel api 端口
熔断
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。
ps:因为三种熔断机制差不多,所以我只讲一种剩下得大家举一反三即可。
-
如何添加熔断规则
和流控一样点击熔断按钮即可。ps:对应的接口必须请求一次才能出现在sentinel后台。
-
参数说明
- 慢调用比例 (
SLOW_REQUEST_RATIO
):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。 - 异常比例 (
ERROR_RATIO
):当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是[0.0, 1.0]
,代表 0% - 100%。 - 异常数 (
ERROR_COUNT
):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
- 慢调用比例 (
-
慢调用比例演示
-
熔断配置
-
改造testA接口,确保每次调用都大于100ms
@GetMapping("/testA") public String testA() { try { TimeUnit.MICROSECONDS.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } return "test A port:" + port; }
-
-
测试
jmeter配置,一秒一个发20个请求
测试结果
可以看到前6个是没有问题得,但是程序里面设置sleep所以。慢调用比例肯定是100%。所以过了统计时间之后就满足了。统计时间内请求数目大于5,并且慢调用比例大于50%。所以进入熔断,但是熔断时间只有一秒便会进入探测恢复状态。又因为接下来得请求还是慢调用,所以就又会熔断,如此反复。
-
总结
- 熔断之后会进入探测恢复状态,而不是全恢复
- 熔断机制有三种:慢调用,异常比例,异常数
- 熔断像是断臂求生一样,舍弃一两个保全大局