好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SpringCloud @FeignClient参数的用法解析

SpringCloud @FeignClient 参数详解

今天因为工作中遇到FeignClient一个奇葩的bug,后面仔细研究了,找出了原因,那么刚好对FeignClient 这个注解总结一下:

先看@FeignClient 源码:源码如下,本文最后面。

11个方法,常用方法说明如下

?

1

@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有什么区别呢

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@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 层面比较深,因为它用线程抛出了异常,可以看到底层具体问题。

?

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

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

/**

  * Annotation for interfaces declaring that a REST client with that interface should be

  * created (e.g. for autowiring into another component). If ribbon is available it will be

  * used to load balance the backend requests, and the load balancer can be configured

  * using a <code>@RibbonClient</code> with the same name (i.e. value) as the feign client.

  *

  * @author Spencer Gibb

  * @author Venil Noronha

  */

@Target (ElementType.TYPE)

@Retention (RetentionPolicy.RUNTIME)

@Documented

public @interface FeignClient {

 

    /**

     * The name of the service with optional protocol prefix. Synonym for {@link #name()

     * name}. A name must be specified for all clients, whether or not a url is provided.

     * Can be specified as property key, eg: ${propertyKey}.

     */

    @AliasFor ( "name" )

    String value() default "" ;

 

    /**

     * The service id with optional protocol prefix. Synonym for {@link #value() value}.

     *

     * @deprecated use {@link #name() name} instead

     */

    @Deprecated

    String serviceId() default "" ;

 

    /**

     * The service id with optional protocol prefix. Synonym for {@link #value() value}.

     */

    @AliasFor ( "value" )

    String name() default "" ;

   

    /**

     * Sets the <code>@Qualifier</code> value for the feign client.

     */

    String qualifier() default "" ;

 

    /**

     * An absolute URL or resolvable hostname (the protocol is optional).

     */

    String url() default "" ;

 

    /**

     * Whether 404s should be decoded instead of throwing FeignExceptions

     */

    boolean decode404() default false ;

 

    /**

     * A custom <code>@Configuration</code> for the feign client. Can contain override

     * <code>@Bean</code> definition for the pieces that make up the client, for instance

     * {@link feign.codec.Decoder}, {@link feign.codec.Encoder}, {@link feign.Contract}.

     *

     * @see FeignClientsConfiguration for the defaults

     */

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

 

    /**

     * Fallback class for the specified Feign client interface. The fallback class must

     * implement the interface annotated by this annotation and be a valid spring bean.

     */

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

 

    /**

     * Define a fallback factory for the specified Feign client interface. The fallback

     * factory must produce instances of fallback classes that implement the interface

     * annotated by {@link FeignClient}. The fallback factory must be a valid spring

     * bean.

     *

     * @see feign.hystrix.FallbackFactory for details.

     */

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

 

    /**

     * Path prefix to be used by all method-level mappings. Can be used with or without

     * <code>@RibbonClient</code>.

     */

    String path() default "" ;

 

    /**

     * Whether to mark the feign proxy as a primary bean. Defaults to true.

     */

    boolean primary() default true ;

 

}

@FeignClient 注解常用参数

怕以后又忘记,总结下目前项目中实际用到的 @FeignClient 注解中的参数,如下:

?

1

2

3

4

5

@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 调用的地址

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/Susan8888/article/details/95992172

查看更多关于SpringCloud @FeignClient参数的用法解析的详细内容...

  阅读:47次