场景
基于springboot开发的项目,对接第三方,第三方的接口有限流策略,某个时间段内有调用频率限制,返回的状态码HttpStatus不是200,而HttpStatus是429。现基于HttpStatus我们发起的重试。
技术点
- springboot
- feign
feign要基于HttpStatus重试。
实现
一般我不喜欢配置全局的配置,因为feign的客户端可能会有多个,如果只有一个第三方服务,那可以配置全局的。
- 基于HttpStatus为429的解码器
@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);
}
}
}
- feign配置类
public class RemoteFeignConfig {
@Bean
public ErrorDecoder errorDecoder() {
return new RemoteErrorDecoder();
}
// 重试器可以使用默认的 这边可以根据自己实际情况配置
@Bean
public Retryer retryer() {
return new Retryer.Default(30000, 30000, 3);
}
}
- feign client
@FeignClient(name = "xxx", url = "xxx", configuration = RemoteFeignConfig.class)
public interface RemoteService {
// TODO 调用的接口
}