Skip to content

springboot cloud 限流熔断 sentinel + nacos 规则持久化 ​

什么是熔断和降级 熔断是发生在调用方的 而降级是发生在被调用方的 熔断是被动触发的 通常是被调用方服务不可用法导致的 而降级则是被调用方为了保证核心业务的正常运行主动触发的保护行为 降级的常规做法 是fallback 机制 在被调用方 手动编写 fallback方法 从本地构造一个默认的参数返回给调用方 而熔断则是 在连接 被拒绝后 在一定的时间内不在调用 被调用方

spring task 相关 定时任务 ​

cron 表达式 实际上是 固定时间点执行任务

fixedRate 基于固定时间间隔触发任务 不管 任务执行时间 从 任务开时时间开始计算
fixedDelay 当上次的任务完成后再间隔指定时间进行任务的执行

默认的 情况下 spring task 是单线程执行的

可以通过配置线程池的方式去执行 设置定时任务线程池的核心线程数(即并发执行任务的最大线程数) spring.task.scheduling.pool.size=10 为定时任务线程池中的线程设置名称前缀,便于日志监控和问题排查。 spring.task.scheduling.thread-name-prefix=scheduler- 在应用关闭时,是否等待线程池中的任务执行完成。 spring.task.scheduling.shutdown.await-termination=true 设置应用关闭时等待任务完成的最长时间。 若超过 60 秒仍有任务未完成,线程池会被强制终止。 spring.task.scheduling.shutdown.await-termination-period=60s 其他的方式

java
 /**
  * 
  * ​​直接配置 TaskScheduler Bean​
  * 
  */

 import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

@Configuration
public class TaskSchedulerConfig {

   @Bean
   public TaskScheduler taskScheduler() {
       ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
       scheduler.setPoolSize(10);          // 核心线程数
       scheduler.setThreadNamePrefix("scheduler-");  // 线程名前缀
       scheduler.setAwaitTerminationSeconds(60);     // 等待任务完成的最大时间(秒)
       scheduler.setWaitForTasksToCompleteOnShutdown(true); // 关闭时等待任务完成
       scheduler.setErrorHandler(t -> {
           // 自定义错误处理逻辑
           System.err.println("Scheduled task error: " + t.getMessage());
       });
       return scheduler;
   }
}

​​自定义 TaskScheduler(推荐)​

java
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
public class SchedulerConfig implements SchedulingConfigurer {

   @Override
   public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
       // 创建线程池(核心线程数、最大线程数、队列容量等可自定义)
       ThreadPoolExecutor taskExecutor = (ThreadPoolExecutor) Executors.newScheduledThreadPool(10);
       taskRegistrar.setScheduler(taskExecutor);
   }
}

在实际的集群环境下 任务执行时可能存在重复执行的问题 解决方法 是利用 redis 分布式锁实现 设置1秒的过期时间 具体取决于任务的执行时间 在哪些执行时间小于1秒的任务 建议不设置解锁的逻辑 等待锁的过期 尽量不要使用 fixDelay 这种方式 在实践中可能存在并发执行的问题