feign是一个声明式的HTTP客户端,spring-cloud-openfeign将feign集成到spring boot中,在接口上通过注解声明Rest协议,将http调用转换为接口方法的调用,使得客户端调用http服务更加简单。
Fegin
1.fegin的默认超时时间为1s,默认不开启hystrix,默认开启ribbon启用轮询规则(RoundRobinRule);
2.对于开启啦hystrix和ribbon的feign ,ribbon的超时不会抛出异常,hystrix与feign谁小听谁的;
原理分析
@EnableFeignClients 注解声明客户端接口
(@EnableFeignClients的参数声明客户端接口的位置和默认的配置类。)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
//basePackages的别名
String[] value() default {};
//声明基础包,spring boot启动后,会扫描该包下被@FeignClient注解的接口
String[] basePackages() default {};
//声明基础包的类,通过该类声明基础包
Class<?>[] basePackageClasses() default {};
//默认配置类
Class<?>[] defaultConfiguration() default {};
//直接声明的客户端接口类
Class<?>[] clients() default {};
}
@FeignClient注解,将接口声明为Feign客户端
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {
@AliasFor("name")
String value() default "";
//名称,对应与eureka上注册的应用名
@AliasFor("value")
String name() default "";
//生成spring bean的qualifier
String qualifier() default "";
//http服务的url
String url() default "";
boolean decode404() default false;
//配置类,这里设置的配置类是Spring Configuration,将会在FeignContext中创建内部声明的Bean,用于不同的客户端进行隔离
Class<?>[] configuration() default {};
//声明hystrix调用失败后的方法
Class<?> fallback() default void.class;
Class<?> fallbackFactory() default void.class;
String path() default "";
}
FeignClientsRegistrar 注册客户端
@EnableFeignClients注解上被注解了@Import(FeignClientsReg