前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >玩转OpenFeign-续集

玩转OpenFeign-续集

作者头像
吴就业
发布2020-07-10 11:40:10
1.2K0
发布2020-07-10 11:40:10
举报
文章被收录于专栏:Java艺术Java艺术Java艺术

上一篇《玩转OpenFeign》介绍了OpenFeign的一些常用配置,不过还漏了点内容。

Client连接超时、读超时的配置

这篇主要介绍如何为不同的Client配置不同的连接超时、读超时这类参数,并从源码角度分析配置是怎么起作用的,以及都可以配置哪些参数,内容不多。

还是要从FeignAutoConfiguration这个自动配置类说起,该配置类使用@EnableConfigurationProperties注册了两个用于装载OpenFeign配置的Bean,分别是FeignClientPropertiesFeignHttpClientProperties

  • FeignHttpClientProperties:用于配置HttpClient。HttpClient是真正用于发起Http请求的客户端工具类。

如果OpenFeignClient使用的是默认的Default,由于Default这个Client使用的HttpClientHttpURLConnection,所以FeignHttpClientProperties这个配置不会使用到。建议不使用默认的Default

如果OpenFeignClient使用的是OkHttpClient,那么FeignHttpClientProperties则用于装载OkHttpClient的连接池、全局连接超时配置。

  • FeignClientProperties:为每个Client配置连接超时、读超时、重试器、请求拦截器等。支持哪些配置参数可查看FeignClientProperties的内部类FeignClientConfiguration有哪些字段。

FeignClientProperties用于接收在application.yaml配置文件中为每个Client配置的连接超时、读超时、重试器、请求拦截器、编码器、解码器这类参数。

配置重试器、请求拦截器等不建议在application.yaml中配置,因为在application.yaml中配置重试器、请求拦截器的类名,OpenFeign是从Spring Boot启动应用的ApplicationContext中根据类名获取Bean的,并没有使用OpenFeign提供的Client隔离的ApplicationContext

除非你想全部Client都使用相同的重试器和请求拦截器,否则不建议这样配置。既然都需要在代码中创建这些重试器、请求拦截器这些Bean,那么直接在代码中配置不是更方法吗。在上一篇已经介绍如何通过代码方式实现为不同Client配置不同的重试器、请求拦截器。

通过代码方式配置连接超时、读超时这些参数可通过给在ClientApplicationContext注入一个Request.Options类型的Bean实现。

首先创建自动配置类Configuration,往容器中注入Request.Options,给Request.Options配置连接超时和读超时,如下图所示。

不要在这个配置类上并@Configuration注解,因为这不是注册到应用的ApplicationContext,而是注册到OpenFeign为Client创建的ApplicationContext。

最后给@FeignClient注解的configuration属性添加这个配置类。

再来看下如何在application.yaml中配置Client的连接超时、读超时这些参数。

接收feign.client.config配置的类为FeignClientConfiguration

config字段是个map,支持多个配置,每个Client配置的keyClient的名称(服务提供者名称),value类型为FeignClientConfiguration。支持配置连接超时(connectTimeout)、读超时(readTimeout)等参数。

从源码分析配置是怎么生效的

OpenFeign会将使用@FeignClient注解注释的接口扫描出来,并往每个Client各自的ApplicationContext注入一个FeignClientFactoryBean,该FeignClientFactoryBeangetObject方法返回的是接口的代码对象。

FeignClientFactoryBean在创建接口的代理对象时,会先生成一个Feign.Builder,然后使用这个Feign.Builder创建代理对象。

FeignClientFactoryBean在创建Feign.Builder后会读取配置,将配置写入到Feign.BuilderFeign.Builder在创建代理对象时就会使用上这些配置,最后用于创建方法拦截器SynchronousMethodHandler

FeignClientFactoryBean为Feign.Builder填充配置的源码如下。

从上面源码可以看出,我们在application.yaml中配置default-to-propertiestrue实际目的是不要让默认配置覆盖我们在application.yaml中添加的配置。

如果项目中使用Ribbon,那么FeignRibbonClientAutoConfiguration会注入一个Request.Options,当default-to-properties配置为false时,这个Request.Options就会覆盖application.yaml中添加的配置。所以要将default-to-properties配置为true,配置才生效。

从上面源码还发现一个参数inheritParentContext,这个inheritParentContext的值默认为true。当配置inheritParentContextfalse时,我们在application.yaml中添加的配置就都不会生效。

如果想要将inheritParentContext设置为false,该如何设置呢?

@FeignClient注解的configuration属性指定的配置类中注入一个FeignClientConfigurer类型的Bean,实现FeignClientConfigurer接口的inheritParentConfiguration方法,在方法中返回false即可。

实际我们关心的还是创建出来的代理对象的方法拦截器(SynchronousMethodHandler)。在创建SynchronousMethodHandlerFeign.Builder会将封装了连接超时、读超时配置的Request.Options对象传递给SynchronousMethodHandler。在发起请求时,由SynchronousMethodHandlerRequest.Options配置对象传给Client,如OkHttpClient

每种Client实现的方式不同,OkHttpClient的实现是,当全局配置的连接超时与当前Client配置的连接超时不同时,重新创建HttpClient,即重新创建用于真正发起Http请求的OkHttpClient,使用的还是相同的连接池。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java艺术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档