Hystrix小技巧之Feign动态超时时间配置
文章目录
为应对服务上线后一些二方接口的响应时间长和无法预估的问题,需要将Feign调用远程接口时的超时时间设置成动态的,指定时间内无法返回则进行降级。
二方接口优化之后能动态调整超时时间,而不需要重新发布。
动态配置中心
超时时间的配置使用公司搭建的Etcd配置中心。使用jetcd就可以实现监听,以实现动态配置。
设置Feign超时时间
按正常的想法,监听到配置变动后重新使用HystrixFeign.Builder构建一个新的实例不就行了吗?
然而并不行,Feign Hystrix实际使用的是HystrixCommand,它有着一套自己的动态配置。
Hystrix uses Archaius for the default implementation of properties for configuration.
The documentation below describes the default
HystrixPropertiesStrategy
implementation that is used unless you override it by using a plugin.
没错,正是Archaius 。
Archaius
那么,怎么使用Archaius 实现Hystrix的动态配置呢。
从github的wiki我们能找到答案,甚至提供了动态配置的类DynamicWatchedConfiguration。
看这个类的构造函数:
|
|
其实我们要做的就是:
- 建立一个与我们配置中心关联的configuration。
- 执行ConfigurationManager.install(configuration);
重点在第1步,我们可以使用DynamicWatchedConfiguration,只要提供构造函数所需的参数就行。其实选择实现WatchedConfigurationSource接口就好了。
但是,我当时没想到,选择直接继承ConcurrentMapConfiguration。在配置更新的时候调用ConcurrentMapConfiguration的setProperty方法(我当时咋就脑子抽风了选择这种不优雅的方式呢)。
Hystrix Configuration
说了这么多,怎么配置超时时间呢?
从wiki里我又知道了。
Default Value | 1000 |
---|---|
Default Property | hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds |
Instance Property | hystrix.command.*HystrixCommandKey*.execution.isolation.thread.timeoutInMilliseconds |
How to Set Instance Default | HystrixCommandProperties.Setter() .withExecutionTimeoutInMilliseconds(int value) |
Feign Hystrix默认是使用类加方法名作为HystrixCommandKey,我们可以使用SetterFactory自定义。
就像这样:
|
|
然后调用HystrixFeign.Builder.setterFactory设置一下。
我们只要在etcd配置如下配置即可实现动态超时时间了:
|
|