侧边栏壁纸
博主头像
gale-blog博主等级

少年一贯快马扬帆,道阻且长不转弯,要盛大,要绚烂,要哗然,要用理想的泰坦尼克号去撞现实冰川,要当烧赤壁的风,而非借箭草船,要为了一片海,就肯翻万山

  • 累计撰写 39 篇文章
  • 累计创建 5 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

Spring Cloud feign替换http请求

二月在这里
2024-07-25 / 0 评论 / 0 点赞 / 9 阅读 / 4059 字

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);
        };
    }

}

0

评论区