SpringBoot feign基于HttpStatus重试

场景

基于springboot开发的项目,对接第三方,第三方的接口有限流策略,某个时间段内有调用频率限制,返回的状态码HttpStatus不是200,而HttpStatus是429。现基于HttpStatus我们发起的重试。

技术点

  1. springboot
  2. feign
    feign要基于HttpStatus重试。

实现

一般我不喜欢配置全局的配置,因为feign的客户端可能会有多个,如果只有一个第三方服务,那可以配置全局的。

  1. 基于HttpStatus为429的解码器
java 复制代码
@Slf4j
public class RemoteErrorDecoder implements ErrorDecoder {
    private static final int TOO_MANY_REQUESTS_CODE = 429;

    private final ErrorDecoder defaultErrorDecoder = new ErrorDecoder.Default();

    @Override
    public Exception decode(String methodKey, Response response) {
        if (response.status() == TOO_MANY_REQUESTS_CODE) {
            log.error("请求因为限流被拒绝,methodKey:{},status:{}", methodKey, response.status());
            return new RetryableException(TOO_MANY_REQUESTS_CODE, "请求因为限流被拒绝", response.request().httpMethod(), null,
                response.request());
        } else {
            log.error("其他状态码,methodKey:{},status:{}", methodKey, response.status());
            return defaultErrorDecoder.decode(methodKey, response);
        }
    }
}
  1. feign配置类
java 复制代码
public class RemoteFeignConfig {
    @Bean
    public ErrorDecoder errorDecoder() {
        return new RemoteErrorDecoder();
    }
		// 重试器可以使用默认的  这边可以根据自己实际情况配置
    @Bean
    public Retryer retryer() {
        return new Retryer.Default(30000, 30000, 3);
    }
}
  1. feign client
java 复制代码
@FeignClient(name = "xxx", url = "xxx", configuration = RemoteFeignConfig.class)
public interface RemoteService {
  // TODO 调用的接口
}
相关推荐
呆呆在发呆.2 分钟前
计组实验-Bomb Lab -2
java·服务器·前端
老马啸西风8 分钟前
开源分布式系统追踪-01-Zipkin-01-入门介绍
java
工一木子14 分钟前
【Leecode】Leecode刷题之路第82天之删除排序链表中的重复元素II
java·数据结构·算法·leetcode·链表
亽仒凣凣34 分钟前
Tomcat官网下载安装
java·tomcat
Amor风信子35 分钟前
华为OD机试真题---机房布局
java·开发语言·数据结构·算法·华为od
吴代庄1 小时前
探秘Redis哨兵模式:原理、运行与风险全解析
java·redis·系统架构
喵手1 小时前
Spring注解篇:@EnableAutoConfiguration详解
java·后端·spring
杨荧1 小时前
【开源免费】基于Vue和SpringBoot的电影评论网站(附论文)
前端·javascript·vue.js·spring boot·spring cloud·java-ee·开源
独自破碎E1 小时前
Java 面经之 Kafka
java·开发语言·kafka
BestandW1shEs1 小时前
快速理解类的加载过程
java·jvm