feignclient详解
首先查看@feignclient注解的源码:
@target(elementtype.type)
@retention(retentionpolicy.runtime)
@documented
public @interface feignclient {
@aliasfor("name")
string value() default "";
@deprecated
string serviceid() default "";
@aliasfor("value")
string name() default "";
string qualifier() default "";
string 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;
}
feignclient注解被@target(elementtype.type)修饰,标识feignclient注解的作用目标在接口上。
@retention(retentionpolicy.runtime)注解表明该注解会在class字节码文件中存在,在运行时可以通过反射获取到。
@documented表示该注解将被包含在javadoc中。
@feignclient注解用于创建声明式api接口,该接口是restful风格的。feign被设计成插拔式的,可以注入其他组件和feign一起使用。最典型的是如果ribbon可用,feign会和ribbon相结合进行负载均衡。
在代码中,value()和name()一样,是被调用的服务的serviceid。直接填写硬编码的url地址。
decode404()即404是被解码,还是抛异常。
configuration()指明feignclient的配置类,默认的配置类为feignclientsconfiguration
类,在缺省的情况下,这个类注入了默认的decoder、encoder和contract等配置的bean。
fallback()为配置熔断器的处理类。
feignclient的配置
feign client默认的配置类为feignclientsconfiguration, 这个类在spring-cloud-nettlix-core的jar包下。
打开这个类,可以发现这个类注入了很多feign相关的配置bean,包括feignretryer、feignl oggerfactory和formattingconversionservice 等。
另外,decoder、 encoder 和contract这3个类在没有bean被注入的情况下,会自动注入默认配置的bean,即responseentitydecoder、springencoder和springmvccontract。默认注入的配置如下。
- decoder feigndecoder:responseentitydecoder
- decoder feignencoder:springencoder
- logger feignlogger:slf4jlogger
- contract feigncontract:springmvccontract
- feign.builder feignbuilder: hystrixfeign.builder
feignclientsconfiguration的配置类部分代码如下,@conditionalonmissingbean注解表示如果没有注入该类的bean就会默认注入一个bean:
重写feignclientsconfiguration类中的bean,覆盖掉默认的配置bean,从而达到自定义配置的目的。例如feign默认的配置在请求失败后,重试次数为0,即不重试(retryer.neverretry)。现在希望在请求失败后能够重试,这时需要写一个配置feignconfig 类,在该类中注入retryer的bean,覆盖掉默认的retryer的bean,并将feignconfig指定为feignclient的配置类。feignconfig 类的代码如下:
在上面的代码中,通过覆盖了默认的retryer的bean,更改了该feignclient的请求失败重试策略,重试间隔为100毫秒,最大重试时间为1秒,重试次数为5次。