一、Sentinel

上篇文章我们讲解了Sentinel 流控规则的配制,本篇文章我们继续讲下Sentinel 的熔断降级,依然采用程序配制方式实现。

上篇文章地址:https://blog.csdn.net/qq_43692950/article/details/122159806

由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。这个问题和 Hystrix 里面描述的问题是一样的。

Sentinel 和 Hystrix 的原则是一致的: 当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源,最终产生雪崩的效果。

二、Sentinel 熔断降级

Sentinel 提供了基于异常比例、异常数、慢调用比例的策略,下面来看下实现:

基于异常比例的熔断策略

新建熔断规则了:

@PostConstruct
public void initDegrade() {DegradeRule rule = new DegradeRule();rule.setResource("errdegrade");rule.setGrade(CircuitBreakerStrategy.ERROR_RATIO.getType()); //熔断策略,异常比例rule.setCount(0.5d); //异常比例的阈值rule.setStatIntervalMs(10000); //统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)rule.setMinRequestAmount(4); //熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)rule.setTimeWindow(5); //熔断时长,单位为 sList<DegradeRule> rules = new ArrayList<>();rules.add(rule);DegradeRuleManager.loadRules(rules);
}

上面实现了基于异常比例的熔断规则,在统计时长10秒的时间,请求数达到4次,如果有50%的请求异常,则进入熔断状态,下面的请求全都进入降级方法,熔断时间为5秒,每5秒则释放一个请求测试接口是否恢复正常,如果接口恢复正常则停止熔断。

下面在编写测试接口前,先创建个全局的降级回调方法。

public class CustomerBlockHandler {public static ResponseTemplate blockHandler(BlockException exception) {return ResFailTemplate.builder().code(406).message("接口限流!").build();}public static ResponseTemplate fallback() {return ResFailTemplate.builder().code(406).message("服务降级!").build();}
}

下面编写测试接口:

@RestController
@RequestMapping("/circuitBreaker")
public class CircuitBreakerController {@SentinelResource(value = "errdegrade",blockHandlerClass = CustomerBlockHandler.class,blockHandler = "blockHandler",fallbackClass = CustomerBlockHandler.class,fallback = "fallback")@GetMapping("/errdegrade")public ResponseTemplate errdegrade() throws InterruptedException {System.out.println("请求了!");int a = 1 / 0;return ResSuccessTemplate.builder().build();}
}

下面编写测试请求程序:

@Slf4j
public class TestDegrade {public static void main(String[] args) throws InterruptedException {RestTemplate restTemplate = new RestTemplate();String url = "http://localhost:8080/circuitBreaker/errdegrade";for (int i = 1; i <= 20; i++) {long t = System.currentTimeMillis();String forObject = restTemplate.getForObject(url, String.class);log.info("请求次数:{} , 返回结果:{} , 耗时:{}", i, forObject, (System.currentTimeMillis() - t));Thread.sleep(500);}}
}

调用测试程序,查看打印日志:


可以看出大部分请求都已经被熔断直接进入了降级方法。

基于异常数的熔断策略

修改下上面的规则:

@PostConstruct
public void initDegrade() {DegradeRule rule = new DegradeRule();rule.setResource("errdegrade");rule.setGrade(CircuitBreakerStrategy.ERROR_COUNT.getType()); //熔断策略,异常数rule.setCount(2d); //异常数阈值rule.setStatIntervalMs(10000); //统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)rule.setMinRequestAmount(4); //熔断触发的最小请求数,请求数小于该值时即使异常数超出阈值也不会熔断(1.7.0 引入)rule.setTimeWindow(5); //熔断时长,单位为 sList<DegradeRule> rules = new ArrayList<>();rules.add(rule);DegradeRuleManager.loadRules(rules);
}

上面的规则表示,在统计时长10秒的时间内,请求数达到4次,并且有2次错误请求,即进入熔断状态,5秒后尝试释放一个请求探测接口是否正常,如果正常则结束熔断。

还是使用上面的测试程序进行测试:



可见至进来了5个请求,其余均被熔断。

基于慢调用比例的熔断策略

修改熔断规则:

@PostConstruct
public void initDegrade() {DegradeRule rule = new DegradeRule();rule.setResource("errdegrade");rule.setGrade(CircuitBreakerStrategy.SLOW_REQUEST_RATIO.getType()); //熔断策略,慢调用比例rule.setCount(1500d); //慢调用临界 RT(超出该值计为慢调用)rule.setStatIntervalMs(10000); //统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)rule.setMinRequestAmount(4); //熔断触发的最小请求数,请求数小于该值时即使异常数超出阈值也不会熔断(1.7.0 引入)rule.setTimeWindow(5); //熔断时长,单位为 srule.setSlowRatioThreshold(0.5d); //慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)List<DegradeRule> rules = new ArrayList<>();rules.add(rule);DegradeRuleManager.loadRules(rules);
}

上面规则表示的意思,在10秒的时间,请求数达到了4次,并且有50%的接口处理时间超过了1.5秒的时间,则进入熔断状态,每隔5面释放一个请求用来探测接口是否已正常。

下面修改测试接口:

@RestController
@RequestMapping("/circuitBreaker")
public class CircuitBreakerController {@SentinelResource(value = "errdegrade",blockHandlerClass = CustomerBlockHandler.class,blockHandler = "blockHandler",fallbackClass = CustomerBlockHandler.class,fallback = "fallback")@GetMapping("/errdegrade")public ResponseTemplate errdegrade() throws InterruptedException {TimeUnit.SECONDS.sleep(2);System.out.println("请求了!");return ResSuccessTemplate.builder().build();}
}

再次使用上面写的测试程序进行测试:


同样实现了熔断的效果。

三、熔断监听

Sentinel他还提供了熔断状态切换的监听,可以做一些自定义的逻辑:

@PostConstruct
public void ruleObserver() {EventObserverRegistry.getInstance().addStateChangeObserver("logging",(prevState, newState, thatRule, snapshotValue) -> {log.info("{} 熔断状态改变,当前状态:{} ", thatRule.getResource(), newState);});
}


喜欢的小伙伴可以关注我的个人微信公众号,获取更多学习资料!

SpringCloud Alibaba Sentinel 熔断降级 - 程序配制方式实现相关推荐

  1. springcloud(十六)--SpringCloud Alibaba Sentinel实现熔断与限流

    Sentinel实现熔断与限流 一.Sentinel 二.安装Sentinel控制台 Sentinel安装步骤: ①下载 ②运行命令 ③访问sentinel管理界面 三.初始化演示工程 1.启动Nao ...

  2. SpringCloud Sentinel 熔断降级、热点参数限流、与系统自适应限流介绍与配置

    一.熔断降级介绍与配置 概述:除了上一章节讲解的sentinel的流量控制之外,sentinel还提供了熔断降级功能.与处理高并发的系统自我保护机制不同的是,熔断降级主要防止当前接口不可用时,导致依赖 ...

  3. SpringCloud Alibaba Sentinel 流量控制规则介绍与配置

    概述:流量控制(flow control),其原理是sentinel断路器通过监控应用服务调用的QPS或调用并发线程数来实现调用控制.当QPS或线程数达到配置的阈值时,进行响应的服务降级功能,从而到达 ...

  4. SpringCloud Alibaba Sentinel 分布式系统的流量防未兵

    一.服务雪崩 如果启动的下单服务不可用,就会出现线程池里所有线程都因等待响应而被阻塞,从而造成整个服务链路不可用,进而导致整个系统的服务雪崩.如图所示: 二.服务雪崩效应 服务雪崩效应:因服务提供者的 ...

  5. sentinel 熔断降级

    sentinel 熔断降级 官网:https://sentinelguard.io/zh-cn/docs/circuit-breaking.html 熔断降级 熔断降级:服务由于响应慢.异常等原因触发 ...

  6. Sentinel 熔断降级原理

    Sentinel 熔断降级原理 一.概述 对于熔断这个概念,我们并不陌生,比如股市熔断机制,当股指波幅达到规定的熔断点时,交易所为控制风险采取的暂停交易措施.亦或者是电流熔断,当通过的电流超出导线所能 ...

  7. Sentinel熔断降级

    # 0.说明 - https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7 - 除了流量控制以外,对调 ...

  8. SpringCloud Alibaba Sentinel实现熔断与限流-微服务(三十四)

    服务熔断功能 sentinel整合ribbon+openFeign+fallback Ribbon系列 启动nacos和sentinel 提供者9003/9004 新建cloudalibaba-pro ...

  9. SpringCloud Alibaba Sentinel实现熔断与限流(下)

    在上一篇讲了sentinel的介绍,安装Sentinel控制台.初始化演示工以及程流控规则 接下来学习熔断规则,热点key限流,系统规则,@SentinelResource注解,服务熔断功能以及规则持 ...

最新文章

  1. php分析图片水印,PHP开发的文字水印,缩略图,图片水印实现类与用法示例
  2. Leetcode 349. 两个数组的交集 解题思路及C++实现
  3. android内存优化方法,Android开发内存优化注意事项和方法
  4. 携程基于大数据分析的实时风控体系
  5. 重新定义智能平板电脑 第四范式与联想达成战略合作
  6. 《进击吧!Blazor!》系列入门教程 第一章 7.图表
  7. .NET 简单的smtp协议发邮件
  8. 苹果电脑裸机和不裸机的区别_将Kubernetes带到裸机边缘
  9. LED显示驱动(七):图层基本测试总结
  10. 个人收款解决方案之三方聚合收款方案
  11. 74CMS4.1.2.4版本黑盒测试
  12. 私钥、证书、USBKey
  13. U盘分区了怎么恢复?详细演示两个方法
  14. 狂神Springboot笔记
  15. css动画效果制作正方体旋转相册
  16. web设计与制作|DW故宫景点介绍网页设计制作|web旅游景点网站模板成品|html故宫介绍网页设计制作源码|HTML5期末大作业...
  17. 目前最火热的IT技术有哪些?
  18. python中遍历列表和字典的方法
  19. openwrt - 新增栏目 - 新增页面
  20. 基于用户画像的精准营销决策建议

热门文章

  1. rand()函数100000随机数_随机函数Rand、Randbetween应用技巧解读
  2. java 线程池扩容_java线程池自动扩容
  3. 【Android系统学习路线】
  4. Java入门 - 数组进阶
  5. 物联网卡管理平台有几种类型
  6. [C]常胜将军思考题之取最后一根火柴为输
  7. jQuery mobile(初级教程)
  8. 解题:使用 Promise 实现 machine 函数
  9. android平板进recovery,recovery模式进不去正确进入方法详解
  10. Linux下Python实现有道词典