SpringCloud @FeignClient 参数详解
今天因为工作中遇到FeignClient一个奇葩的bug,后面仔细研究了,找出了原因,那么刚好对FeignClient 这个注解总结一下:
先看@FeignClient 源码:源码如下,本文最后面。
11个方法,常用方法说明如下
@FeignClient(name = "service-name", url = "${feign.urls.service-name:}", fallback =ApiFallBack.class,configuration = Interceptor.class)
- 1.
value
,name
这两个就同一个意思:对应的是调用的微服务的服务名,对用服务发现、走网关调用,这个很关键。 - 2.
url
这是访问地址,可以直接提供给外部调用,也可以直接写如192.168.1.11:8800/applicationName - 3.
fallback
与fallbackFactory
就给@FeignClient注解设置fallback属性,并且回退类要继承@FeignClient所注解的接口
ApiFallBack类拿出去单独作为一个类的话,我们就得在该类上添加注解@Component
如果fallback默认优先级比fallfactory优先级高。所以二者都存在的话,会访问fallback的回退方法。
这里不做演示。
那么fallback和fallfactory有什么区别呢
@FeignClient(name = "service-name", fallbackFactory = HystrixClientFallbackFactory.class)
protected interface HystrixClient {
@RequestMapping(method = RequestMethod.GET, value = "/test")
Hello iFailSometimes();
}
@Component
static class HystrixClientFallbackFactory implements FallbackFactory<HystrixClient> {
@Override
public HystrixClient create(Throwable cause) {
return new HystrixClientWithFallBackFactory() {
@Override
public Hello iFailSometimes() {
return new Hello("fallback; reason was: " + cause.getMessage());
}
};
}
}
fallback和fallfactory区别
fallback
只是重写了回退方法。fallfactory
层面比较深,因为它用线程抛出了异常,可以看到底层具体问题。
@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 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 注解常用参数
怕以后又忘记,总结下目前项目中实际用到的 @FeignClient 注解中的参数,如下:
@FeignClient(value = "annoroad-alpha", url = "${annoroad.ms.annoroad-alpha.url}")
public interface UserFacade {
@PostMapping(value = "/user/detail")
UserDto detail(@RequestParam("id") long id);
}
value
- value 等同于 name
url
- 一般用于调试,可以手动指定 @FeignClient 调用的地址
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。