Feign自定义配置和编写Feign的Spring boot 插件

本文主要是介绍 Feign 的自定义配置,以及开发基于 Spring Boot 的 starter 插件


背景

我们后端项目都是基于HTTP协议开发,各项目之间有相当多的接口调用关系,使用 okhttp、httpclient来调用比较麻烦,而且不够统一,后来发现 springcloud 里封装的 feign 操作很方便,但是我们希望能脱离 springcloud 环境,使用注解来加载 feign的client,所以参考了 spring-cloud-feign 的封装,提供了自定义注解。

Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。Feign内部使用 OKhttp3、HttpClient 作为 Http 请求客户端。
Spring Cloud中对 feign 进行了封装,可以通过 springmvc 的注解来注解 http api的请求参数,使用上可以说非常的方便。
Spring Cloud Feign具备可插拔的注解支持,支持Feign注解、JAX-RS注解和Spring MVC的注解。但是需要在 spring cloud 全家桶里才能使用。

feign 本身的使用

基本使用方法可以参考 feign git 网站

feign自定义配置

  • 设置超时时间,okhttp3 本身的超时是不起作用的
    @Bean
    public Request.Options getOptions(){
        return new Request.Options(1000, 3000);
    }
  • 设置重试策略
    @Bean
    Retryer feignRetryer() {
        return Retryer.NEVER_RETRY;
    }
  • 自定义错误处理
public class MyErrorDecoder implements ErrorDecoder {
    private static final Logger logger = LoggerFactory.getLogger(MyErrorDecoder.class);
    @Override
    public Exception decode(String methodKey, feign.Response response) {
        logger.error("接口调用异常:{} status:{}, request:{}", methodKey, response.status(), response.request().toString());
        if(response.status() >= 400 && response.status() <= 499){
            return new HystrixBadRequestException(methodKey + response.status());
        }
        return feign.FeignException.errorStatus(methodKey, response);
    }
}

@Bean
public ErrorDecoder MyErrorDecoder(){
    return new MyErrorDecoder();
}
  • 通过实现 Contract 来自定义一些处理逻辑,比如HystrixDelegatingContract

封装 SpringBoot插件

  1. 创建注解@EnableFeignClients、@FeignClient,可以通过注解自动扫描接口

  2. 创建FeignClientFactoryBean,在启动时加载

  3. 对于http 的接口,可以统一返回 json 格式的数据,使用 fastjson 对返回的文本进行 decoder。

  4. 对于 application/json 的非简单请求,提供了 encoder,把对象序列化为 json

  5. 源码: https://github.com/michael-geng/my-feign-spring-boot-starter

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。