API请求重试的8种方法,你用哪种?

当前中国的品牌出海跨境发展趋势迅猛,跨境电商业务中,可能第三方的服务器分布在世界的各个角落,所以请求三方接口的时候,难免会遇到一些网络问题,这时候需要加入重试机制了 。
重试机制实现8种方式
API请求重试的8种方法,你用哪种?

文章插图
 
1. 循环重试这是最简单也最直接的一种方式 。在请求接口的代码块中加入循环 , 如果请求失败则继续请求,直到请求成功或达到最大重试次数 。
示例代码:
int retryTimes = 3;for(int i = 0; i < retryTimes; i++){try{// 请求接口的代码break;}catch(Exception e){// 处理异常Thread.sleep(1000); // 延迟1秒后重试}}这段简单的示例代码里,直接用了一个for循环来进行重试,最大重试次数设置为3次 。同时在发生异常的时候,为了避免频繁请求,使用Thread.sleep()加一个适当的延迟 。
2. 使用递归结构除了循环,还可以使用递归来实现接口的请求重试 。递归是我们都比较熟悉的编程技巧,在请求接口的方法中调用自身,如果请求失败则继续调用 , 直到请求成功或达到最大重试次数 。
示例代码:
public void requestWithRetry(int retryTimes){if(retryTimes <= 0) return;try{// 请求接口的代码}catch(Exception e){// 处理异常Thread.sleep(1000); // 延迟1秒后重试requestWithRetry(retryTimes - 1);}}这段代码里,我们定义了一个名为requestWithRetry的方法,其中retryTimes表示最大重试次数 。如果重试次数小于等于0,则直接返回 。否则 , 在捕获到异常后,我们使用Thread.sleep()方法来添加一个适当的延迟,然后调用自身进行重试 。
3.使用网络工具的内置重试机制我们常用的一些HTTP客户端通常内置了一些重试机制 , 只需要在创建对应的客户端实例的时候进行配置即可,以Apache HttpClient为例:
  • 4.5+版本:使用 HttpClients.custom().setRetryHandler() 方法来设置重试机制
CloseableHttpClient httpClient = HttpClients.custom().setRetryHandler(new DefaultHttpRequestRetryHandler(3, true)).build();
  • 5.x版本:使用HttpClients.custom().setRetryStrategy()方法来设置重试机制
CloseableHttpClient httpClient = HttpClients.custom().setRetryStrategy(new DefaultHttpRequestRetryStrategy(3,NEG_ONE_SECOND)).build();在上面的示例代码中,我们使用
DefaultHttpRequestRetryHandler或
DefaultHttpRequestRetryStrategy来创建一个重试机制,最大重试次数为3次 。如果请求失败,则会自动重试 。
Apache HttpClient还支持自定义重试策略,可以可以实现HttpRequestRetryHandler接口(4.5+版本)或者RetryStrategy接口(5.x版本),并根据需要进行重试逻辑的实现 。
这是一个自定义重试策略的示例:
CloseableHttpClient httpClient = HttpClients.custom().setRetryStrategy((response, executionCount, context) -> {if (executionCount > 3) {// 如果重试次数超过3次,则放弃重试return false;}int statusCode = response.getCode();if (statusCode >= 500 && statusCode < 600) {// 如果遇到服务器错误状态码,则进行重试return true;}// 其他情况不进行重试return false;}).build();4.使用Spring Retry库当在Spring项目中使用重试机制时,可以使用Spring Retry库来实现 。Spring Retry提供了一组注解和工具类,可以方便地为方法添加重试功能 。
<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.3.1</version></dependency>Spring Retry的使用有两种方式 , 一种是使用RetryTemplate来显式调用需要重试的方法 , 一种实用注解来自动触发重试 。
显式使用RetryTemplate
  1. 创建RetryTemplate对象并配置重试策略:
RetryTemplate retryTemplate = new RetryTemplate();// 配置重试策略RetryPolicy retryPolicy = new SimpleRetryPolicy(3);retryTemplate.setRetryPolicy(retryPolicy);// 配置重试间隔策略FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();backOffPolicy.setBackOffPeriod(1000);retryTemplate.setBackOffPolicy(backOffPolicy);在代码里,我们创建了一个RetryTemplate对象,并配置了重试策略和重试间隔策略 。这里使用了SimpleRetryPolicy来指定最大重试次数为3次,使用FixedBackOffPolicy来指定重试间隔为1秒 。
  1. 使用RetryTemplate调用方法:
retryTemplate.execute((RetryCallback<Void, Exception>) context -> {// 请求接口的代码return null;});


推荐阅读