首页 > 其他分享 >关于Feign的重试机制

关于Feign的重试机制

时间:2023-04-19 17:25:59浏览次数:23  
标签:Feign feign CustomRetryer 重试 maxAttempts 机制 public

日期:2023-4-17

问题:项目中feign接口的请求,一次性发多个,甲方的服务器资源有限,

导致抛出FeignException 429:too many requests

1.feign的重试机制流程

使用 Feign 客户端发送 HTTP 请求时,如果请求失败了(例如网络超时或者是目标服务器返回的 5xx 错误码),Feign 可以自动重试该请求。这就是 Feign 中的重试机制,它可以提高请求成功率和系统的健壮性。

Feign 的重试机制非常简单:在某个请求失败时,Feign 将重新尝试几次该请求,直到请求成功或者达到最大重试次数为止。默认情况下,Feign 最多会重新尝试一次请求。

当我们自定义异常重试的时候,只有返回RetryableException 异常,才会让feign进行重新调用。

2.feign的重试配置

  1. 创建CustomRetryer 类实现Retryer接口
  2. 添加重试相关的属性:最大重试次数,间隔。。。
  3. 在continueOrPropagate()方法中,执行重试的逻辑 
重试CustomRetryer
  1 public class CustomRetryer implements Retryer {
 2 
 3     // 最大重试次数
 4     private final int maxAttempts;
 5     // 重试次数
 6     private int attempt;
 7     // 重试间隔次数
 8     private final long backoff;
 9 
10     public CustomRetryer() {
11         this(5, 1000);
12     }
13 
14     public CustomRetryer(int maxAttempts, long backoff) {
15         this.maxAttempts = maxAttempts;
16         this.backoff = backoff;
17     }
18 
19     @Override
20     public void continueOrPropagate(RetryableException e) {
21         if (attempt < maxAttempts) {
22             try {
23                 Thread.sleep(backoff);
24             } catch (InterruptedException ex) {
25                 throw new RuntimeException(ex);
26             }
27             attempt++;
28         }
29         else {
30             log.error("重试了5次");
31             try {
32                 throw new Exception("重试次数超过最大值");
33             } catch (Exception ex) {
34                 throw new RuntimeException(ex);
35             }
36         }
37     }
38 
39     @Override
40     public Retryer clone() {
41         return new CustomRetryer(maxAttempts, backoff);
42     }
43 }

 

3.使用重试

  1. 在 feign中的自定义Configuration 中 注入重试Bea
  2. feign接口中指定configuration的类
  3. 创建一个继承了feign.codec.ErrorDecoder接口的自定义错误解码器类
import feign.Response;
import feign.RetryableException;
import feign.codec.ErrorDecoder;

public class CustomErrorDecoder implements ErrorDecoder {

    @Override
    public Exception decode(String methodKey, Response response) {
        if (response.status() == 429) {
            return new RetryableException(
                    "Too many requests",
                    null,
                    response.request().httpMethod(),
                    null,
                    response.request());
        }

        return new RuntimeException("Unknown error");
    }
}

 

上面的代码将HTTP状态码为429的响应转换为RetryableException异常。当Feign遇到这个异常时,它会自动进行重试。

标签:Feign,feign,CustomRetryer,重试,maxAttempts,机制,public
From: https://www.cnblogs.com/sleep-code/p/17333967.html

相关文章

  • redis 二、(哈希类型,列表类型,集合类型,有序集合,pipline机制,发布订阅,bitmap位图,HyperLogL
    目录Redis一、哈希类型二、列表类型三、集合类型四、有序集合五、慢查询六、pipline与事务七、发布订阅八、bitmap位图九、HyperLogLogRedis一、哈希类型###1---hget,hset,hdelhgetkeyfield#获取hashkey对应的field的value时间复杂度为o(1)hsetkeyfieldvalue#设......
  • OpenFeign组装请求头Header
    组装单个Header参数@RequestHeader("Authorization")Stringtoken组装多个Header参数@PostMapping(value="/a/b",headers={"Content-Type=application/json","a=AAAAAA","b=BBBBB"})ObjectcreateSth(@RequestBodyModel......
  • pg主从复制(一)——流复制机制
    PostgreSQL9.1之前,主从复制传输以WAL日志文件为单位,主库写完一个WAL日志文件后才传送到备库,这种方式导致主备延迟特别大。9.1引入了主备流复制,传输单位是WAL日志的record,备库不断从主库同步相应的数据,并apply每个WALrecord,因此9.1能够做到同步复制。同时9.1提供了HotStandby,备库......
  • pg 崩溃恢复篇(一)—— WAL的作用与全页写机制
    WAL(WriteAheadLog)机制最初在7.1版中实现,以减轻服务器崩溃的影响。它也是基于时间点恢复(PITR)和流复制(SR)实现的基础。WAL机制非常复杂,在第一篇中,我们只看看为什么需要WAL,它有什么作用,又会有什么不足。一、 没有WAL的插入操作要看为什么需要有WAL,那就先看看如果没有会怎么样。假设......
  • 一种通过编码的反爬虫机制
    遇到一个反爬虫机制,该网页为gbk编码网页,但是请求参数中,部分请求使用gbk编码,部分请求使用utf8编码,还设置了一些不进行编码的安全字符,在爬取的过程中形成了阻碍。提示:在认为参数设置正常,又无法正确爬取数据的情况下,通过response.requests.headers和esponse.requests.body与浏览器的请......
  • 一种通过编码的反爬虫机制
    遇到一个反爬虫机制,该网页为gbk编码网页,但是请求参数中,部分请求使用gbk编码,部分请求使用utf8编码,还设置了一些不进行编码的安全字符,在爬取的过程中形成了阻碍。提示:在认为参数设置正常,又无法正确爬取数据的情况下,通过response.requests.headers和esponse.requests.body与浏览器的......
  • OpenFeign优雅的远程调用
    OpenFeign目录旁边可以查询具体的目录结构和跳转一.快速开发1.依赖<!‐‐ openfeign 远程调用‐‐><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring‐cloud‐starter‐openfeign</artifactId></dependency>2.编写调用接口+@Feig......
  • WebSocket+心跳机制
    maven依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>WebSocket.classimportcn.hutool.json.JSONUtil;importlombok.SneakyThrows;impo......
  • js EventLoop事件循环机制
    1、js是单线程语言,其事件分为:同步任务和异步任务,异步任务分为宏任务与微任务;2、执行顺序为:同步任务(主流程任务)--->微任务 ---->宏任务先执行同步任务,遇到异步任务则放入任务队列中,等同步任务执行完毕,执行任务队列中的微任务,再执行宏任务...主线程从"任务队列"中读取事件,这......
  • MFC运行机制
    1.创建一个窗口代码2.设断点  3.启动调试 调用堆栈窗口:上面的函数被下面的函数所调用 4.双击函数   设断点  F5让程序执行到断点处  F11进入AfxWinMain函数 CWinThread*pThread=AfxGetThread()以Afx打头的是全局函数 F10让程序运行几行把鼠标放在pThread和pApp上......