由于项目需要,开发的系统需要调用外部系统API接口,所在项目使用的是Spring Cloud 分布式架构,利用自身提供的FeignClient作为内部和外部服务调用的工具,需要配置超时重试机制,用来满足业务以及系统上的需要。
我们的需求是当调用API发生网络错误或者超时异常时,需要连续调用2次接口,第一次间隔5分钟,第二次调用间隔10分钟,系统最大超时时间是150000毫秒。
项目代码如下:
首先是API基础配置信息,统一由FeignClientConfiguration 提供:
import feign.Request;
import feign.Retryer;
import feign.auth.BasicAuthRequestInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.TimeUnit;
@Configuration
public class FeignClientConfiguration {
@Value("${key}")
private String consumerKey;
@Value("${password}")
private String consumerPassword;
@Bean
public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
return new BasicAuthRequestInterceptor(consumerKey, consumerPassword);
}
public static int connectTimeOutMillis = 150000;//超时时间
public static int readTimeOutMillis = 150000;
@Bean
public Request.Options options() {
return new Request.Options(connectTimeOutMillis, readTimeOutMillis);
}
@Bean("FeignRetryer")
@ConditionalOnMissingBean
public Retryer feignRetryer() {
return new Retryer.Default(TimeUnit.MINUTES.toMillis(5), TimeUnit.MINUTES.toMillis(10), 2);
}
}
其次将如上的配置信息真正配置到FeignClient中,也就是真正调用的接口里面:
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
//@FeignClient
@FeignClient(name="myFeignClient",url="${url}",configuration = FeignClientConfiguration.class)
public interface FeignClientProxy {
@RequestMapping(value = "/create", method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"},consumes={"application/json;charset=UTF-8"})
POResponseBody save(@RequestBody String json);
注意:其中${url} ${key} ${password} 都是在服务本身配置文件application.yml中配置好的哦。