微服务保护-降级


个人名片:

博主:酒徒ᝰ.
个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志:三人行,必有我师焉。

本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 点击观看

目录

三、隔离和降级

3. 熔断降级

熔断降级是解决雪崩问题的重要手段。其思路是由断路器 统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。
断路器控制熔断和放行是通过状态机来完成的:

状态机包括三个状态:

  • closed:关闭状态,断路器放行所有请求,并开始统计异常比例、慢请求比例。超过阈值则切换到open状态
  • open:打开状态,服务调用被熔断,访问被熔断服务的请求会被拒绝,快速失败,直接走降级逻辑。Open状态5秒后会进入half-open状态
  • half-open:半开状态,放行一次请求,根据执行结果来判断接下来的操作。
  • 请求成功:则切换到closed状态
  • 请求失败:则切换到open状态

断路器熔断策略有三种:慢调用、异常比例、异常数

  1. 慢调用

慢调用:业务的响应时长(RT)大于指定时长的请求认定为慢调用请求。在指定时间内,如果请求数量超过设定的最小数量,慢调用比例大于设定的阈值,则触发熔断。

案例

需求:给 UserClient的查询用户接口设置降级规则,慢调用的RT阈值为50ms,统计时间为1秒,最小请求数量为5,失败阈值比例为0.4,熔断时长为5

1)设置慢调用

修改user-service中的/user/{id}这个接口的业务。通过休眠模拟一个延迟时间:

java 复制代码
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id,
                      @RequestHeader(value = "Truth", required = false) String truth) throws InterruptedException {
    System.out.println("truth: " + truth);
    if (id == 1) {
        Thread.sleep(60);
    } 
    return userService.queryById(id);
}

2)设置熔断规则

给feign接口设置降级规则, 超过50ms的请求都会被认为是慢请求

3)测试

在浏览器访问:http://localhost:8088/order/101,快速刷新5次,可以发现:

触发了熔断,请求时长缩短至5ms,快速失败了,并且走降级逻辑,返回的null

此时,在浏览器访问:http://localhost:8088/order/102,竟然也被熔断了:

  1. .异常比例

异常比例:统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常的比例达到设定的比例阈值,则触发熔断。

案例

需求:给 UserClient的查询用户接口设置降级规则,统计时间为1秒,最小请求数量为5,失败阈值比例为0.4,熔断时长为5s

1)设置异常请求

首先,修改user-service中的/user/{id}这个接口的业务。手动抛出异常,以触发异常比例的熔断:

也就是说,id 为 2时,就会触发异常

java 复制代码
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id,
                      @RequestHeader(value = "Truth", required = false) String truth) throws InterruptedException {
    System.out.println("truth: " + truth);
    if (id == 1) {
        Thread.sleep(60);
    } else if (id == 2) {
        throw new RuntimeException("故意抛出异常,触发异常比例熔断");
    }
    return userService.queryById(id);
}

2)设置熔断规则

下面,给feign接口设置降级规则, 在5次请求中,只要异常比例超过0.4,也就是有2次以上的异常,就会触发熔断。

3)测试

在浏览器快速访问:http://localhost:8088/order/102,快速刷新5次,触发熔断(一直无法访问到user,当访问时间变短时就是触发了熔断):

此时,我们去访问本来应该正常的101:

  1. 异常比例、异常数

异常数:统计指定时间内的调用,如果调用次数超过指定请求数,并且出现异常超过指定异常数,则触发熔断。

案例

需求:给 UserClient的查询用户接口设置降级规则,统计时间为1秒,最小请求数量为5,异常数为2,熔断时长为5s

1)设置异常请求

java 复制代码
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id,
                      @RequestHeader(value = "Truth", required = false) String truth) throws InterruptedException {
    System.out.println("truth: " + truth);
    if (id == 1) {
        Thread.sleep(60);
    } else if (id == 2) {
        throw new RuntimeException("故意抛出异常,触发异常比例熔断");
    }
    return userService.queryById(id);
}

2)设置熔断规则

3)测试

在浏览器快速访问:http://localhost:8088/order/102,快速刷新5次,触发熔断(访问时间变短):

此时,我们去访问本来应该正常的101,地址:http://localhost:8088/order/102

相关推荐
像少年啦飞驰点、16 分钟前
零基础入门 Spring Boot:从“Hello World”到可部署微服务的完整学习路径
java·spring boot·微服务·编程入门·后端开发
从此不归路32 分钟前
Qt5 进阶【13】桌面 Qt 项目架构设计:从 MVC/MVVM 到模块划分
开发语言·c++·qt·架构·mvc
java干货36 分钟前
微服务:把一个简单的问题,拆成 100 个网络问题
网络·微服务·架构
indexsunny1 小时前
互联网大厂Java求职面试实战:Spring Boot微服务与Kafka消息队列应用解析
java·数据库·spring boot·微服务·面试·kafka·jpa
天才奇男子2 小时前
《深度解析HAProxy七层代理:原理、配置与最佳实践》
linux·运维·微服务·云原生
橙露3 小时前
Vue3+Pinia实战:从零搭建企业级后台管理系统的核心架构
架构
onkel in blog3 小时前
【Java】Gradle 多模块项目实战:Spring Boot 微服务搭建全流程
java·spring boot·微服务·gradle
七夜zippoe3 小时前
Kubernetes与Python微服务编排实战:从基础部署到自动扩缩容
python·微服务·kubernetes·service·hpa
小毅&Nora3 小时前
【人工智能】【大模型】从厨房到实验室:解密LLaMA架构如何重塑大模型世界
人工智能·架构·llama
CS创新实验室3 小时前
《计算机网络》深入学:IPv4 协议架构与演进
网络·计算机网络·架构·ipv4