首页 > 其他分享 >Feign调用重试

Feign调用重试

时间:2023-10-10 09:44:04浏览次数:37  
标签:Feign 调用 指定 重试 retry 注解 Retryable

Feign是一个Java HTTP客户端库,它简化了使用HTTP API的过程。当使用Feign调用远程API时,有时会遇到连接超时或请求失败的情况。为了解决这些问题,可以使用Feign的重试功能。

Feign的重试功能可以通过以下步骤来实现:

  1. 添加Feign的retry依赖

在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-retry</artifactId>
    <version>10.8</version>
</dependency>
  1. 配置Feign的retry

在Feign的配置文件中,可以配置重试的次数、间隔时间、重试条件等。例如,以下配置将重试3次,每次间隔1秒钟,重试条件为连接超时或请求失败:

@Configuration
public class FeignConfig {

    @Bean
    public Retryer feignRetryer() {
        return new Retryer.Default(1000, 1000, 3);
    }

}
  1. 使用Feign的retry

在调用远程API时,可以使用@Retryable注解来指定需要重试的方法。例如,以下代码将使用Feign的retry重试调用getUsers方法:

@FeignClient(name = "user-service", fallback = UserServiceFallback.class)
public interface UserService {

    @GetMapping("/users")
    @Retryable
    List<User> getUsers();

}

需要注意的是,使用Feign的retry功能需要在应用程序中添加Spring Retry依赖。可以在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.3.1</version>
</dependency>

 

@Retryable是Spring框架中提供的重试注解,它用于在方法执行失败时自动进行重试。@Retryable注解有以下参数:

  1. value:指定要重试的异常类型,默认为Throwable.class,表示所有异常都会被重试。

  2. include:指定要重试的异常类型,它是value参数的一个别名。

  3. exclude:指定不要重试的异常类型,它是一个Class数组,可以指定多个异常类型。

  4. maxAttempts:指定最大重试次数,默认为3次。

  5. backoff:指定重试间隔时间的策略,它是一个@Backoff注解类型。

  6. stateful:指定是否要使用有状态的重试策略,默认为false,表示使用无状态的重试策略。

其中,@Backoff注解有以下参数:

  1. value:指定重试间隔时间的初始值,默认为1000毫秒。

  2. maxDelay:指定重试间隔时间的最大值,默认为0,表示不使用最大值限制。

  3. multiplier:指定重试间隔时间的增长倍数,默认为0,表示不使用增长倍数。

需要注意的是,@Retryable注解只能用于public方法上,并且只能在Spring容器中生效。如果需要在非Spring环境中使用重试功能,可以考虑使用第三方的重试库,例如Guava Retry或者Failsafe。

 

下面是一个使用@Retryable注解的示例:

@FeignClient(name = "example", url = "http://example.com")
public interface ExampleClient {

    @Retryable(value = { ConnectException.class }, maxAttempts = 5, backoff = @Backoff(delay = 1000, multiplier = 2))
    @GetMapping("/example")
    String getExample();
}

这个示例中,我们定义了一个名为ExampleClient的Feign客户端,它的请求地址为http://example.com。在接口方法getExample()上,我们添加了@Retryable注解,指定需要重试的异常类型为ConnectException,最大重试次数为5,重试间隔时间为1000毫秒,重试间隔策略为指数退避(每次重试间隔时间翻倍)。如果在请求过程中出现ConnectException异常,Feign会自动重试请求,最多重试5次。

标签:Feign,调用,指定,重试,retry,注解,Retryable
From: https://www.cnblogs.com/huangdh/p/17753787.html

相关文章

  • python接口自动化之request请求,如何使用 Python调用 API?
    Python实战|如何使用Python调用API一、HTTP 请求HTTP 请求是在 HTTP 协议下的一种数据格式,用于向服务器发送请求,其通常由请求行、请求头和请求体三部分构成,请求头和请求体之间用空行隔开,其中各部分包含的信息如下:请求行 (Request Line):包括请求方法 (GET请求、POST请......
  • @FeignClien注解
    @FeignClient是SpringCloud中的一个注解,用于定义一个声明式的REST客户端。它可以让我们像调用本地方法一样调用远程服务。@FeignClient注解有以下属性:name:指定FeignClient的名称,用于创建FeignClient的SpringBean,默认值为类名的简单名称。value:同 name,用于指定FeignC......
  • C#调用WebService
     一、前言在日常工作中,如果涉及到与第三方进行接口对接,有的会使用WebService的方式,这篇文章主要讲解在.NETFramework中如何调用WebService。首先我们创建一个WebService,里面有两个方法:一个无参的方法,一个有参的方法:创建好了WebService以后,把WebService部署到IIS上,并确保可......
  • .net 调用webservice 总结
    最近做一个项目,由于是在别人框架里开发app,导致了很多限制,其中一个就是不能直接引用webservice。我们都知道,调用webserivice最简单的方法就是在"引用" 那里点击右键,然后选择"引用web服务",再输入服务地址。确定后,会生成一个app.config里面就会自动生成了一些配置信息。现......
  • Day16 函数对象--函数嵌套调用--闭包函数
    1.Day15_复习1: 2.Day15_复习2: 3.Day15_复习3: 4.函数对象_可以赋值_可以当做函数参数传给另外一个函数: 5.函数对象_可以当做函数另外一个函数的返回值_可以当做容器类型的一个元素: 6.函数对象初步实现ATM流程: 7.函数对象应用案例优化: 8.函数的嵌套调用: 9.......
  • 函数调用
    P7077[CSP-S2020]函数调用我们考虑如果没有第三种函数,如何解决这个问题。发现,对于每个1(1类),我们考虑在它之后执行了多少个2,然后累乘,就是这个增加操作实际的贡献。我们只需要倒序,维护一个后缀积即可。我们的核心思想就是计算每个1的贡献是几倍。考虑有3会怎么样。还是延续上面......
  • WebForm后端调用前端JS
    /*注意:定义的js方法一定要放在head里面,不能放下面,否则不生效*/<%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="WebForm1.aspx.cs"Inherits="WebFormBackEndCallFrontJsDemo.WebForm1"%><!DOCTYPEhtml><htmlxmlns=&qu......
  • oracle存储过程声明及调用
    一、声明--此过程用于删除多余扎帐数据--IN_MZZZID:门诊扎帐ID--OUT_MESSAGE:输出执行结果信息createorreplaceprocedurep_out_yl_mz_mzzz_del(IN_MZZZIDINVARCHAR2,OUT_MESSAGEOUTVARCHAR2)isv_msgvarchar2(32767);begininsertintoBHIS.YL_......
  • php模拟post提交请求,调用接口
    /***模拟post进行url请求*@paramstring$url*@paramstring$param*/functionrequest_post($url='',$param=''){if(empty($url)||empty($param)){returnfalse;}......
  • Python 内部类,内部类调用外部类属性,方法
     一Python中内部类classMyOuter:age=18def__init__(self,name):self.name=nameclassMyInner:def__init__(self,inner_name):self.inner_name=inner_nameout=MyOuter('lqz')inner=out.MyInner('lqz_inner�......