本文主要是介绍 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插件
创建注解@EnableFeignClients、@FeignClient,可以通过注解自动扫描接口
创建FeignClientFactoryBean,在启动时加载
对于http 的接口,可以统一返回 json 格式的数据,使用 fastjson 对返回的文本进行 decoder。
对于 application/json 的非简单请求,提供了 encoder,把对象序列化为 json
源码: https://github.com/michael-geng/my-feign-spring-boot-starter