1、熔断降级限流
熔断
A服务调用B服务的某个功能,由于网络不稳定、B服务卡机等问题,导致功能时间超长。如果这样子的次数太多,我们就可以直接将B断路(A不再请求B接口),凡是调用B服务的直接返回降级数据,不必等待B的超长执行。这样B的故障问题就不会级联影响到A。
降级
整个网站处于流量高峰期,服务器压力剧增,根据当前业务情况及流量,对一些服务和页面进行有策略的降级(停止服务,所有的调用直接返回降级数据)。以此缓解服务器资源的压力,以保证核心业务的正常运行,同时也保持了客户和大部分客户得到正确的响应。
相同点:
1、为了保证集群大部分服务的可用性和可靠性,防止崩溃,牺牲小我
2、用户最终都是体验到某个功能不可用
不同点:
1、熔断是被调用方故障,触发的系统主动规则
2、降级是基于全局考虑,停止一些正常的服务,释放资源
限流
对进入服务的请求流量进行控制,使服务能够承担不超过自己的流量压力。
2、Sentinel简介
官方文档:https://github.com/ailbaba/Sentinel/wiki
项目地址:https://github.com/alibaba/Sentinel
随着微服务的流行,服务与服务之间的稳定性变得越来越来重要。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
2.1 Sentinel与Hystrix
功能 | Sentinel | Hystrix |
隔离策略 | 信号量隔离(并发线程数限流) | 线程池隔离、信号量隔离 |
熔断降级策略 | 基于响应时间、异常比率、异常数 | 基于异常比率 |
实时统计表现 | 滑动窗口(LeapArray) | 滑动窗口(基于RxJava) |
动态规则配置 | 支持多种数据源 | 支持多种数据源 |
扩展性 | 多个扩展点 | 插件形式 |
基于注解的支持 | 支持 | 支持 |
限流 | 基于QPS,支持基于调用关系的限流 | 有限的支持 |
流量整形 | 支持预热模式、匀速器模式、预热排队模式 | 不支持 |
系统自适应保护 | 支持 | 不支持 |
控制台 | 可配置规则、查看秒级监控、机器发现等 | 简单的监控查看 |
2.2 Sentinel-定制网关流控返回
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
@Configuration
public class SentinelGatewayConfig {public SentinelGatewayConfig() {GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {// 响应式编码,网关限流了请求就会调用此回调@Overridepublic Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {R error = R.error(BizCodeEnum.BLOCK_EXCEPTION.getCode(), BizCodeEnum.BLOCK_EXCEPTION.getMsg());String errJson = JSON.toJSONString(error);return ServerResponse.ok().body(Mono.just(errJson), String.class);}});}}