当前位置: 首页 > news >正文

Springboot 熔断,穿透,雪崩

1. 熔断(Circuit Breaker)

含义

熔断机制类似于电路中的保险丝,当某个服务出现问题(如响应时间过长、频繁报错等)时,为了避免整个系统被拖垮,会暂时切断对该服务的调用,直接返回一个默认的响应结果。这样可以防止故障的扩散,保证系统的稳定性。

产生原因
  • 服务提供者出现故障,如服务器宕机、数据库连接异常等,导致大量请求积压,进而影响其他依赖该服务的组件。
  • 网络问题,如网络延迟、丢包等,使得服务调用的响应时间变长,甚至超时。
Spring Boot 中的解决方案

在 Spring Boot 中,可以使用 Resilience4j 或 Hystrix 来实现熔断机制。以下以 Resilience4j 为例:

  • 添加依赖
<!-- 选择合适的版本 -->

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
    <version>1.7.1</version>
</dependency>


<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot3</artifactId>
    <version>2.0.2</version> <!-- 选择合适的版本 -->
</dependency>
  • 配置熔断
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @CircuitBreaker(name = "myService", fallbackMethod = "fallback")
    public String doSomething() {
        // 调用可能出现问题的服务
        // 模拟异常
        throw new RuntimeException("Service is unavailable");
    }

    public String fallback(Exception e) {
        return "Fallback response";
    }
}

在上述代码中,@CircuitBreaker 注解用于标记需要进行熔断处理的方法,name 属性指定熔断策略的名称,fallbackMethod 属性指定当熔断发生时调用的备用方法。

2. 穿透(Cache Penetration)

含义

缓存穿透是指客户端请求的数据在缓存中不存在,同时在数据库中也不存在,这样每次请求都会穿透缓存直接访问数据库,给数据库带来巨大的压力。例如,攻击者可能会故意发起大量不存在的 key 的请求,导致数据库被频繁访问。

产生原因
  • 业务逻辑错误,如查询条件错误,导致查询的数据根本不存在。
  • 恶意攻击,攻击者利用漏洞发送大量无效请求。
Spring Boot 中的解决方案
  • 缓存空对象:当查询结果为空时,将空对象也缓存起来,并设置一个较短的过期时间,这样下次相同的请求就可以直接从缓存中获取空对象,避免再次访问数据库。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class CacheService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public Object getData(String key) {
        Object data = redisTemplate.opsForValue().get(key);
        if (data == null) {
            // 从数据库查询
            data = queryFromDatabase(key);
            if (data == null) {
                // 缓存空对象
                redisTemplate.opsForValue().set(key, null, 60, TimeUnit.SECONDS);
            } else {
                // 缓存正常数据
                redisTemplate.opsForValue().set(key, data);
            }
        }
        return data;
    }

    private Object queryFromDatabase(String key) {
        // 模拟从数据库查询
        return null;
    }
}

  • 布隆过滤器:在访问缓存之前,先使用布隆过滤器判断该 key 是否可能存在。如果布隆过滤器判断不存在,则直接返回,避免访问数据库。

3. 雪崩(Cache Avalanche)

含义

缓存雪崩是指在某一时刻,大量的缓存同时过期失效,或者缓存服务器发生故障,导致大量请求直接涌向数据库,使数据库瞬间承受巨大的压力,甚至可能导致数据库崩溃,进而引发整个系统的雪崩效应。

产生原因
  • 缓存过期时间设置不合理,导致大量缓存同时过期。
  • 缓存服务器出现故障,如 Redis 集群宕机。
Spring Boot 中的解决方案
  • 设置随机过期时间:在设置缓存时,为每个缓存项的过期时间添加一个随机值,避免大量缓存同时过期。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Random;
import java.util.concurrent.TimeUnit;

@Service
public class CacheAvalancheService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void setData(String key, Object value) {
        Random random = new Random();
        int expireTime = 3600 + random.nextInt(600); // 随机过期时间
        redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);
    }
}

  • 缓存集群化和高可用:使用 Redis 集群等方式提高缓存的可用性,避免因单点故障导致缓存雪崩。
  • 限流和降级:在数据库层面设置限流规则,当请求量超过一定阈值时,对部分请求进行降级处理,如返回默认值或提示信息。

通过以上方法,可以有效地解决 Spring Boot 项目中熔断、穿透和雪崩的问题,提高系统的稳定性和可靠性。

相关文章:

  • 网络安全-新型路径攻击流程及防御措施
  • 【论文精读】YOLO-World:实时开放词汇目标检测
  • 【无人集群系列---无人机集群编队算法】
  • Qt中C++与QML交互从原理、方法与实践陷阱深度解析
  • List的模拟实现(2)
  • 远程部署 Qt 应用程序套件错误原因
  • maven编译出错,javac: ��Ч��Ŀ�귢�а�: 17
  • 基于SpringBoot和Leaflet的邻省GDP可视化实战
  • 二叉树的遍历知识点及习题
  • 项目升级Sass版本或升级Element Plus版本遇到的问题
  • 文件包含-session2
  • 函数式编程:概念、特性与应用
  • 运行测试用例
  • c3p0、Druid连接池+工具类 Apache-DbUtils (详解!!!)
  • 使用 DeepSeek + OmniParser v2 + UIAutomation 实现 GUI 应用自动化测试的探索
  • 【C++】 stack和queue以及模拟实现
  • [C语言]动态内存分配详解
  • python与C系列语言的差异总结(2)
  • C++21--红黑树
  • 网络安全实入门| 剖析HTTP慢速攻击(Slowloris)与Nginx防护配置
  • 泽连斯基已离开土耳其安卡拉
  • 工商银行杭州金融研修院原院长蒋伟被“双开”
  • 科技部等七部门:优先支持取得关键核心技术突破的科技型企业上市融资
  • 杭勇已任常州市政协党组成员,此前任常州市委常委、秘书长
  • 220名“特朗普币”持有者花1.48亿美元,获邀与特朗普共进晚餐
  • 时隔4年多,这一次普京和泽连斯基能见面吗?