前言

微服务项目里 OpenFeign 是最常用的声明式 HTTP 客户端,但 @FeignClient 的属性含义很多人只停留在 value 上。这篇整理注解的全属性解读,以及一个常见的坑:多个 FeignClient 指向同一个服务时的 bean 重名冲突。

一、@FeignClient 全属性解读

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FeignClient {

    /**
     * 1、value 与 name 互为别名,两者二选一即可
     * 2、当 contextId 没有值的时候,会默认获取(value/name)的值
     * 3、当未指定 url 请求地址的时候,最终会通过 ribbon-loadbalancer 工具,
     *    从注册中心选取 service-id 等于 value 的服务作为请求地址
     */
    @AliasFor("name")
    String value() default "";

    /**
     * serviceId 已作废,其目的与 value 一致。如果设置了 serviceId,
     * 则 value/name 皆以 serviceId 为准
     */
    @Deprecated
    String serviceId() default "";

    /**
     * 1、当 contextId 没有值的时候,会默认获取(value/name)的值
     * 2、当 qualifier 没有值的时候,会将 '${contextId}FeignClient' 作为
     *    feign 的 bean 组件别名
     */
    String contextId() default "";

    /** 同 value,二选一 */
    @AliasFor("value")
    String name() default "";

    /**
     * feign 的 bean 组件别名,拥有最高优先级;
     * 当 qualifier 为空时,取 '${contextId}FeignClient' 作为 bean 的名称
     */
    String qualifier() default "";

    /**
     * 1、设置 url 以后,后续发起 http 调用时,直接读取该地址作为请求目标;
     * 2、未设置 url 时,借助 ribbon-loadbalancer 组件,根据 (value/name)
     *    从注册中心的服务列表中选中 service-id 匹配的目标服务
     */
    String url() default "";

    boolean decode404() default false;

    Class<?>[] configuration() default {};

    Class<?>[] fallback() default void.class;

    Class<?>[] fallbackFactory() default void.class;

    /**
     * 目标服务器对应的资源 uri(FeignClient 下所有方法相同的 path 前缀)
     */
    String path() default "";

    boolean primary() default true;
}

属性速查:

……

阅读全文