衰减重试,直到可用才标记可用

本文介绍了如何在Spring Boot应用中,配合Eureka实现服务启动时,若数据获取失败,应用将进行衰减重试直至数据可用。通过实现ApplicationRunner接口并利用ScheduledThreadPoolExecutor进行定时任务,逐步增加重试间隔,最终使服务在Eureka中状态正确。同时,通过修改实例状态为DOWN来通知其他服务暂时不可用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、前提背景

  1. 如果服务实例在获取某个数据的时候,获取不到则不能启动成功
  2. 搭配eureka,如果获取失败,才能将其注册到eureka中
  3. 因服务启动存在服务依赖,服务的先后启动顺序
  4. 降低安装部署的门槛(如果部署时存在服务的先后顺序,不按顺序还起不来,则岂不是很烦。可以让其服务运行起来,慢慢达到可用的一个状态)

2、实现方案

  1. 实现ApplicationRunner接口,服务启动时,就会执行的接口
  2. 让代码先启动,但是又没有完全启动,一直去重试,可以通过衰减重试(先尝试一次不成功,则失败后再重试一次,只是重试的时间间隔会越来越长,最后间隔时间固定)
  3. eureka表示down,其他服务不可用(通过ApplicationInfoManager进行设置实例的状态)
  4. ScheduledThreadPoolExecutor的schedule来设置任务的延迟执行时间来达到衰减重试的效果(每次设置schedule的实现时,都可设计延迟的时间,达到衰减的效果)
  5. 失败后,再次执行任务,这段逻辑需要放到finally去执行
  6. 因我的实现是基于自动装配,故数据的依赖是通过构造函数进行数据赋值(@Autowired)

3、代码


import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.appinfo.InstanceInfo;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.Ti
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值