Spring Cloud feign替换http请求
1.引入maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.开启feignClient
3.示例
创建一个简单的client
@FeignClient(url = "${url}" ,name = "name" , path = "path")
public interface TestService {
/**
* 经营异常
* @param appkey appkey
* @param AuthVersion 2.0 固定参数
* @param sign sign 加密参数
* @param timestamp timestamp
* @param keyword 关键词
* @param skip 跳过条数
* @return AbnormalData
*/
@GetMapping(value = "/test" ,headers = "")
ResponseData<AbnormalData> getAbnormalOperationData(@RequestHeader("appkey") String appkey,
@RequestHeader("Auth-Version") String AuthVersion,
@RequestHeader("sign") String sign,
@RequestHeader("timestamp") Long timestamp,
@RequestParam String keyword , @RequestParam Integer skip);
}
使用feign的时候调用不同的client时如果需要添加不同header时可以采用spring的注解添加对应的参数
同时如果所有的client对应的header参数相同可以在FeignConfig里面统一定义请求头
FeginClient中的参数可以直接引用application中的参数
2.简单配置feignCLient的重试机制
可以选择继承拦截器或者切面实现不同参数配置这边是一个简单的示例
import cn.hutool.extra.spring.SpringUtil;
import feign.Retryer;
import feign.codec.ErrorDecoder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
@Configuration
@Slf4j
public class FeignConfig {
/**
* 自定义重试机制
* @return Retryer
*/
@Bean
public Retryer feignRetryer() {
//最大请求次数为3,初始间隔时间为100ms,下次间隔时间1.5倍递增,重试间最大间隔时间为500ms,
return new Retryer.Default(3, 100, 500);
}
@Bean
public ErrorDecoder feignError() {
return (key, response) -> {
StringRedisTemplate bean = SpringUtil.getBean(StringRedisTemplate.class);
if (response.status() == 400) {
log.error("请求服务400参数错误,返回:{}", response.body());
}
if (response.status() == 409) {
log.error("请求服务409异常,返回:{}", response.body());
bean.delete("DECHEN:ACCESS:TOKEN");
}
if(response.status() == 401){
log.error("请求服务401异常,返回:{}", response.body());
bean.delete("DECHEN:ACCESS:TOKEN");
}
if (response.status() == 404) {
log.error("请求服务404异常,返回:{}", response.body());
}
// 其他异常交给Default去解码处理
// 这里使用单例即可,Default不用每次都去new
return new ErrorDecoder.Default().decode(key, response);
};
}
}
评论区