为了深入理解Feign,下面将从源码的角度来讲解Feign。首先来查看FeignClient注解@FeignClient的源码,其代码如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {
@AliasFor("name")
String value() default "";
/** @deprecated */
@Deprecated
String serviceId() 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;
}
FeignClient注解被@Target(ElementType.TYPE)修饰,表示FeignClient注解的作用目标在接口上。@Retention(RetentionPolicy。RUNTIME)注解表明该注解会在Class字节码文件中存在,在运行时可以通过反射获取到。@Documented表示该注解被包含在Javadoc中。
@FeignClient注解用于创建声明式API接口,该接口是RESTful风格的。Feign被设计成挺拔式的,可以注入其他组件和Feign一起使用。最典型的是如果Ribbon可用,Feign会和Ribbon相结合进行负载均衡。
在代码中,value()和name()一样,是被调用的服务的ServiceId。url()直接填写硬编码的Url地址。decode404()即404是被解码,还是抛异常。configuration()指明FeignClient的配置类,默认的配置类为FeignClientsConfiguration类,在缺省的情况下,这个类注入了默认的Decoder、Encoder、和Contract等配置的Bean。fallback()为配置熔断器的处理类。