@FeignClient

一. 什么是 @FeignClient

  • @FeignClient 注解非常优雅的解决了SpringCloud搭建各种微服务之后,服务间通常存在相互调用的需求
  • Ta被@Target(ElementType.TYPE)修饰,表示FeignClient注解的作用目标在接口上。
  • 实际应用时实现类需结合@RestController、@RequestMapping(“@FeignClient中path路径”)

二. 引入 Maven 依赖

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>
<dependency>
    <groupId>com.netflix.archaius</groupId>
    <artifactId>archaius-core</artifactId>
    <version>0.7.6</version>
</dependency>

三. 参数解释

2.1 value() 、 name() 和 serviceId()
  • name、value和serviceId声明接口之后,通过@Resource注入之后即可使用。
  • name是value的别名,value也是name的别名。两者的作用是一致的,name指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现。
  • serviceId和value的作用相同,用于指定服务ID,不过已经废弃。
2.2 qualifier()
  • 用来指定@Qualifier()注解的值,qualifier=“”是FeignClient的限定词,可以使用改值进行引用。
  • 客户端使用 @Qualifier() 来注入服务
2.3 url()
  • 一般用于调试程序,允许我们手动指定@FeignClient调用的地址。
2.4 decode404()
  • 当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException。
  • 调用时发生错误:
  • 为了在调用服务抛出404错误时,返回一些有用的信息。我们可以将decode404参数设置为true。
  • 调用输出
2.5 configuration()
  • Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract。
  • 配置:自定义configuration配置类,简单的定义一个自己的Decoder,该Decoder配合decod404=true使用;当服务调用抛出404错误时,将自动调用自定义的Decoder,输出一个简单的字符串。
  • 自定义的 Decoder 类 MyDecoder。
  • 配置 MyConfiguration 类
  • 配置 FeignClient 类
  • 调用输出:
2.6 fallback() 和 fallbackFactory()
  • fallback:定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口。
  • fallbackFactory:工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码。
2.7 path()
  • 定义当前 @FeignClient 的统一前缀。这样方便在该FeignClient中的@RequestMapping中书写value值。
  • 假设系统有一堆相同前缀的服务:“/app/service/hi”“/app/service/getData”,则只需要在 @FeignClient 中的path设置为“/app/service”即可
2.8 contextId()
  • 当同一个工程下有多个 @FeignClient 的name是相同的情况下,会因为Bean冲突导致启动报错。
  • 解决方案1:设置application.properties
    spring.main.allow-bean-definition-overriding=true
    
  • 解决方案2:为每个 @FeignClient 设置不同的 contextId(),避免冲突报错
2.9 primary()
  • primary对应的是@Primary注解,默认为true,当@FeignClient实现了fallback后,也就意味着@FeignClient有多个相同的Bean在Spring容器中,当我们在使用@Autowired进行注入的时候,不知道注入哪个,所以我们需要设置一个优先级高的,@Primary注解就是干这件事情的。

参考地址

https://blog.csdn.net/weixin_38912281/article/details/104538676
http://www.imooc.com/article/details/id/299213