文章目录

断路器的工作原理
断路器的三个状态:打开、关闭、半开
断路器的基本思想是通过监控服务调用的成功率或平均响应时间等指标,在(被调用的)服务出现异常时 自动切换到"打开 "状态,阻止后续请求继续访问该服务,从而避免引发连锁故障。
一段时间后,断路器会尝试半开 (Half-Open),允许部分请求通过以探测服务是否恢复,如果服务恢复正常,则断路器关闭 ,恢复正常调用;如果服务仍不可用,则继续保持打开状态。
熔断策略
在Sentinel中有三种熔断策略,慢调用比例、异常比例、异常数
慢调用比例
- 判断逻辑:当单位时间内的请求数超过最小请求数,且其中 "慢调用"(响应时间超过预设阈值的请求)的比例达到阈值时,触发熔断。
- 如A调用B,设置0.7,当统计时长中有70%的请求为慢请求(设置阈值)时,会把断路器打开,之后A就不会在调用B了。同时会有熔断时长,时长内的调用全部拒绝访问,之后会变为半开状态。半开状态会放行一个探测,如果成功则断路器关闭,失败则打开。
异常比例
- 判断逻辑:当单位时间内的请求数超过最小请求数,且异常请求(如抛出异常、返回错误码)的比例达到阈值时,触发熔断。
- 如:规定时间(统计时长)内70%的请求发送异常,则断路器打开
异常数
- 判断逻辑:当单位时间内的异常请求数直接达到预设阈值时,触发熔断(无需计算比例)。
- 如:统计时长内100个请求中有15个发送异常,则断路器打开
有无熔断区别

- 在没有配置熔断规则时,A调用B时,B发生超时或异常都会触发A的兜底回调。
- 当有熔断规则时,如配置了慢调用比例,当断路器打开时不会在调用B直到熔断时长结束。节约了调用时间和资源
示例
慢调用比例

图中GET:http://qf-service-product/product/{id}为feign调用的接口
设置参数:五秒内有80%的请求响应超过一秒时,发起熔断30秒。需要至少五个以上请求才会触发该规则
被调用服务接口Thread.sleep(3000),让响应时间超过1秒。
设置好的熔断规则
被调用方代码
java
import com.qf.entity.Product;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
@Slf4j
@RestController
public class ProductController {
@GetMapping("/product/{id}")
public Product getProduct(@PathVariable("id") Long id, HttpServletRequest request){
String header =request.getHeader( "X-Token");
System.out.println(header);
Product product = new Product();
product.setId(id);
product.setProductName("华为手机");
product.setPrice(new BigDecimal(5000));
product.setNum(100);
log.info("查询商品:{}",product);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return product;
}
}
多次访问http://127.0.0.1:8081/seckill接口,可以发现之后的每次调用都会直接触发兜底回调
java
//兜底回调在@FeignClient中设置
@FeignClient(value = "qf-service-product", fallback = ProductFeignClientFallback.class)
public interface ProductFeignClient {
//mvc注解的两套使用逻辑
//1、标注在Controller上,是接受这样的请求
//2、标注在FeignClient上,是发送这样的请求
@GetMapping("/product/{id}")
Product getProductById(@PathVariable("id") Long id);
}
@Component
public class ProductFeignClientFallback implements ProductFeignClient {
@Override
public Product getProductById(Long id) {
System.out.println("兜底回调....");
Product product = new Product();
product.setId(id);
product.setPrice(new BigDecimal("0"));
product.setProductName("feign未知商品");
product.setNum(0);
return product;
}
}
异常比例
五秒内异常比例超过80%,则熔断30秒,最少5个请求时熔断规则生效
这里模拟异常调用,将被调用服务关闭或抛出异常。可以发现多次调用后会直接触发兜底回调。
异常数
五秒内异常数超过10,则熔断30秒,最少5个请求时熔断规则生效
熔断规则与流控规则的区别
维度 | 熔断规则 | 流控规则 |
---|---|---|
触发依据 | 依赖资源的异常指标(错误率、响应时间) | 资源的流量指标(QPS、线程数) |
目标 | 保护系统免受不稳定依赖的影响 | 保护系统不被正常流量压垮 |
处理方式 | 熔断期间直接拒绝调用,后期自动恢复 | 超过阈值时拒绝 / 排队 / 预热处理超额请求 |
典型场景 | 服务调用超时、接口频繁报错 | 秒杀高并发、接口 QPS 超限 |
相关文章:
Spring Cloud Alibaba快速入门
Spring Cloud Alibaba快速入门-Nacos注册中心(上)
Spring Cloud Alibaba快速入门-Nacos注册中心(下)
Spring Cloud Alibaba快速入门-Nacos配置中心(上)
Spring Cloud Alibaba快速入门-Nacos配置中心(下)
Spring Cloud Alibaba快速入门-OpenFeign
Spring Cloud Alibaba快速入门-OpenFeign进阶用法
Spring Cloud Alibaba快速入门-Sentinel
Spring Cloud Alibaba快速入门-Sentinel流量控制(FlowRule)
Spring Cloud Alibaba快速入门-Sentinel熔断规则