查看原文
其他

Spring Cloud Edgware新特性之三:使用配置属性自定义Feign的行为

周立 IT牧场 2021-08-10

Spring Cloud是当前炙手可热的微服务开发框架。它的功能强大,组件丰富,设计优雅。目前Spring Cloud还在不断发展之中。

Spring Cloud即将发布 SpringCloudEdgware 版本。该版本解决了不少Bug,新增了不少新特性,本系列博客将为大家详细阐述在Spring Cloud Edgware中新增的特性。

我们知道:

  • Ribbon在 SpringCloudBrixton 版中,只能使用Java代码自定义配置

  • Ribbon在 SpringCloudCamden 版中,可使用Java代码自定义配置,也可使用配置属性自定义配置,两者等价。配置属性配置的方式为我们带来更好的使用体验和开发效率。

  • Feign使用Java代码自定义配置的方式跟Ribbon非常类似

  • 遗憾的是:在 SpringCloudCamden 中,Feign依然不支持使用配置属性来自定义配置。

该遗憾已在 SpringCloudEdgware 得到了填补——从此,Feign也支持配置属性自定义配置啦!

下面我们来看看如何使用配置属性自定义Feign的行为

配置指定名称的Feign Client

对于一个指定名称的Feign Client(例如该Feign Client的名称为 feignName ):

  1. feign:

  2.  client:

  3.    config:

  4.      feignName:

  5.        connectTimeout: 5000  # 相当于Request.Options

  6.        readTimeout: 5000     # 相当于Request.Options

  7.        # 配置Feign的日志级别,相当于代码配置方式中的Logger

  8.        loggerLevel: full

  9.        # Feign的错误解码器,相当于代码配置方式中的ErrorDecoder

  10.        errorDecoder: com.example.SimpleErrorDecoder

  11.        # 配置重试,相当于代码配置方式中的Retryer

  12.        retryer: com.example.SimpleRetryer

  13.        # 配置拦截器,相当于代码配置方式中的RequestInterceptor

  14.        requestInterceptors:

  15.          - com.example.FooRequestInterceptor

  16.          - com.example.BarRequestInterceptor

  17.        decode404: false

通用配置

上面讨论了如何配置特定名称的Feign Client,那么如果想为所有的Feign Client都进行配置,该怎么办呢?我们知道, @EnableFeignClients 注解上有个 defaultConfiguration 属性,我们可以将默认配置写成一个类,然后用 defaultConfiguration 来引用,例如:

  1. @EnableFeignClients(defaultConfiguration = DefaultRibbonConfig.class)

那么如果想使用配置属性该怎么办呢?

如果你想配置所有的Feign Client,只需像如下配置即可:

  1. feign:

  2.  client:

  3.    config:

  4.      default:

  5.        connectTimeout: 5000

  6.        readTimeout: 5000

  7.        loggerLevel: basic

如果你不小心又使用了Java代码配置Feign,同时又使用了配置属性配置Feign,那么使用配置属性的优先级更高。配置属性配置的方式将会覆盖Java代码配置。如果你想修改代码配置方式的优先级,可使用如下属性: feign.client.default-to-properties=false 。

TIPS:

  • 使用代码自定义Feign的官方文档:http://cloud.spring.io/spring-cloud-static/Camden.SR3/#spring-cloud-feign-overriding-defaults

  • 引入该特性的相关pull request:https://github.com/spring-cloud/spring-cloud-netflix/pull/1942

  • 个人并不建议配置retryer,Spring Cloud Camden以及之后的版本中,Spring Cloud关闭了Feign的重试,而是使用Ribbon的重试。如果自己再定义Feign的重试后,那么可能会造成重试特性的混乱。笔者已在https://github.com/spring-cloud/spring-cloud-netflix/issues/2330 提出该问题。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存