一、@EnableFeignClients详解
1、作用
扫描和注册所有使用注解@FeignClient
定义的feign
客户端
2、源码
public @interface EnableFeignClients {
String[] value() default {};
String[] basePackages() default {};
Class>[] basePackageClasses() default {};
Class>[] defaultConfiguration() default {};
Class>[] clients() default {};
3、属性说明
属性 | 说明 |
---|---|
String[] value() | 包路径。比如 com.sbc.service ,会扫描这个包路径下带有 @FeignClient 注解的类并处理 |
String[] basePackages() | |
Class>[] basePackageClasses() | 跟 basePackages 作用一致,basePackages 是个 String 数组,而 basePackageClasses 是个 Class 数组,用于扫描这些类对应的 package |
Class>[] defaultConfiguration() | 默认的配置类,对于所有的 Feign Client,这些配置类里的配置都会对它们生效,可以在配置类里构造 feign.codec.Decoder , feign.codec.Encoder 或 feign.Contract 等bean; |
Class>[] clients() | 注解修饰的类集合,如果指定了该属性,那么扫描功能相关的属性就是失效。比如 value、basePackages 和 basePackageClasses |
二、@FeignClient
1、作用
创建声明是API接口,该接口是RESTful风格的。Feign被设计成插拔式的,可注入其他组件和Feign一起使用。默认情况下Feign会和Ribbon相结合进行负载均衡
2、源码
public @interface FeignClient {
@AliasFor("name")
String value() default "";
@Deprecated
String serviceId() default "";
String contextId() default "";
@AliasFor("value")
String name() default "";
String qualifier() default "";
String url() default "";
boolean decode404() default false;
Class>[] configuration() default {};
Class> fallback() default void.class;
Class> fallbackFactory() default void.class;
String path() default "";
boolean primary() default true;
3、属性说明
属性 | 说明 |
---|---|
String value() | 提供服务的名称 |
String path() | 请求路径,定义当前Feign客服端统一前缀 |
String name() | 跟 value 属性作用一致 |
String qualifier() | 给 FeignClient 设置 @Qualifier 注解 |
String url() | 手动调用url地址,一般用于测试,用于替换服务名。优先级比服务名高。 |
boolean decode404() | 默认是 false,表示对于一个 http status code 为 404 的请求是否需要进行 decode,默认不进行 decode,当成一个异常处理。设置为true之后,遇到 404 的 response 还是会解析 body |
Class>[] configuration() | 对于单个 FeignClient 的配置,而 @EnableFeignClients 里的 defaultConfiguration 属性是作用域全局的,针对所有的 FeignClient |
Class> fallback() | 表示 fallback 类,需要实现 FeignClient 对应的接口,当调用方法发生异常的时候会调用这个 Fallback 类对应的 FeignClient 接口方法 |
Class> fallbackFactory() | 表示生产 fallback 类的 Factory,可以实现 feign.hystrix.FallbackFactory 接口,FallbackFactory 内部会针对一个 Throwable 异常返回一个 Fallback 类进行 fallback 操作 ,用于封装通用的容错逻辑,减少重复代码 |
boolean primary() | 默认是 true,表示当前这个 FeignClient 生成的 bean 是否是 primary。 |
个人建议 编码器,解码器,重试器,调用解析器一般使用默认的就行
三、自定义配置
1、说明
在实际开发中有可能Feign
默认配置不能满足需求,这时就需要自定义Feign
配置。
按着配置方式来来划分:
java代码配置
配置文件配置
按照作用来说又可以分为:
全局配置
局部配置(针对单个Feign接口)
配置文件配置格式如下:
feign:
client:
修改默认配置的名称 默认名default
default-config: default
config:
feign的名称
feign-name:
连接超时时间
connection-timeout: 1000
读取超时时间
read-timeout: 5000
日志配置级别
logger-level: full
错误解码器
error-decoder: com.xxx
重试机制
retryer: feign.Default
自定义拦截器
request-interceptors:
decoder:
encoder:
Spring MVC 注解支持
contract:
FeignClientConfiguration配置类信息
public static class FeignClientConfiguration {
//. 日志级别
private Logger.Level loggerLevel;
//连接超时时间 java.net.HttpURLConnection#getConnectTimeout(),如果使用Hystrix,该配置无效
private Integer connectTimeout;
//读取超时时间 java.net.HttpURLConnection#getReadTimeout(),如果使用Hystrix,该配置无效
private Integer readTimeout;
//重试接口实现类,默认实现 feign.Retryer.Default
private Class retryer;
// 错误编码
private Class errorDecoder;
// 请求拦截器
private List> requestInterceptors;
//是否开启404编码
private Boolean decode404;
}
核心配置
默认的请求connectionTimeout为10s,readTimeout为60s
Java Config配置
全局配置
@SpringBootApplication
@EnableFeignClients(defaultConfiguration = FeignClientsConfiguration.class)
public class NetflixFeignClientApplication {
public static void main(String[] args) {
SpringApplication.run(NetflixFeignClientApplication.class, args);
}
}
局部配置
@Configuration
public class FeignCustomConfiguration {
}
@FeignClient(configuration= FeignCustomConfiguration.class)
public interface FeignUserService {
}
四、网络请求配置
1、httpclient配置
1、添加依赖
io.github.openfeign
feign-httpclient
2、配置信息
feign:
httpclient:
让feign使用apache httpclient作请求
enabled: true
feign的最大连接数
max-connections: 200
feign单个路径的最大连接数
max-connections-per-route: 50
2、OkHttp(推荐)
1、添加依赖
io.github.openfeign
feign-okhttp
2、配置信息
feign:
httpclient:
enabled: false
okhttp:
enabled: true
四、Gzip压缩
1、说明
Spring Cloud Feign支持请求和响应Gzip压缩,提供传输效率。只需要在配置文件配置即可
2、配置信息
feign:
client:
config:
# 默认全局配置 默认配置名称 default
default:
compression:
request:
# 配置请求支持GZIP压缩,默认为false
enable: true
#配置压缩支持的Mime Type
mime-types: application/json
# 配置压缩数据大小的上下限
min-request-size: 2048
reponse:
#配置响应支持GZIP压缩,默认为false
enable: true
1、Date类型参数的时差
@Component
public class DateFormatRegister implements FeignFormatterRegistrar{
public DateFormatRegister(){
}
@Override
public void registerFormatters(FormatterRegistry registry) {
registry.addConverter(Date.class, String.class, new Date2StringConverter());
}
private class Date2StringConverter implements Converter{
@Override
public String convert(Date source) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(source);
}
}
}
参考
https://blog.csdn.net/andy_zhang2007/article/details/86680622#_2