使用环境变量设置 Hystrix 超时
Posted
技术标签:
【中文标题】使用环境变量设置 Hystrix 超时【英文标题】:Setting Hystrix timeout with environment variable 【发布时间】:2017-06-23 16:17:02 【问题描述】:为了改变 Hystrix 的默认请求超时时间(1000ms),必须设置以下属性:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000
对应的环境变量是什么?
我想在我最喜欢的云平台上“调整”超时,而无需先接触源代码。
我很确定这个不起作用:HYSTRIX_COMMAND_DEFAULT_EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS=2000
编辑:Spring Cloud Camden / Spring Boot 1.4 发现问题。
【问题讨论】:
你试过HYSTRIX_COMMAND_DEFAULT_EXECUTION_ISOLATION_THREAD_TIMEOUTINMILLISECONDS
吗?
@spencergibb 不,也不起作用。我什至尝试将hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
作为环境变量但没有成功。我将尝试使用 SPRING_APPLICATION_JSON= "hystrix" : "command" : ...
(可能是 JSON 语法使用的更糟糕的属性)
让它与 SPRING_APPLICATION_JSON
环境变量在本地工作...由于某种原因,应用程序无法在具有相同环境变量的 Elastic Beanstalk 上启动,但这是另一回事。
@MichaelTecourt 您评论中的hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
字符串实际上在“In”和“Milliseconds”之间包含两个不可见的 Unicode 字符 - \u200C
和 \u200B
,小心!
【参考方案1】:
使用SPRING_APPLICATION_JSON 环境变量找到了比解决方案更多的解决方法:
SPRING_APPLICATION_JSON=' "hystrix" : "command" : "default" : "execution" : "isolation" : "thread" : "timeoutInMilliseconds" : 3000 '
【讨论】:
【参考方案2】:您可以使用 Spring config yaml 文件,请在以下链接中进一步阅读
https://github.com/spring-cloud/spring-cloud-netflix/issues/321
【讨论】:
我的问题是关于如何使用hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
作为环境变量。我知道它在配置文件中工作正常,我只想覆盖该属性而不需要重新打包应用程序。
如果您关心重新打包,您可以尝试使用覆盖打包属性文件的外部配置文件(例如:在磁盘上)。 mkyong.com/spring/spring-propertysources-example【参考方案3】:
可以从应用程序配置中引用 VM 选项和环境变量,这通常是设置具有较长名称的属性的更方便的方法。
例如,可以在application.yml
中定义以下引用:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: $service.timeout
这将从 VM 选项 -Dservice.timeout=10000
解决,将默认 Hystrix 命令超时设置为 10 秒。使用环境变量更简单——感谢relaxed binding,这些都可以工作(export
示例适用于 Linux):
export service.timeout=10000
export service_timeout=10000
export SERVICE.TIMEOUT=10000
export SERVICE_TIMEOUT=10000
常见的方法是使用lowercase.dot.separated
作为VM 参数,使用ALL_CAPS_WITH_UNDERSCORES
作为环境变量。
【讨论】:
它需要修改源,但这是一个聪明的解决方法,因为自定义变量也可以绑定到ribbon.ReadTimeout
(通常需要与hystrix的超时一起修改)
@MichaelTcourt 出于好奇,我尝试了-Dhystrix.command.default.execution.isolation.thread.timeoutinMilliseconds=10000
JVM 参数和export HYSTRIX_COMMAND_DEFAULT_EXECUTION_ISOLATION_THREAD_TIMEOUTINMILLISECONDS=10000
环境属性,它们都适用于 Spring Boot 1.5.3 和 Spring Cloud Dalston.RELEASE。尝试为hystrix.command.default.execution.isolation.thread.timeoutinMilliseconds
键调试com.netflix.config.ConcurrentCompositeConfiguration#getList
以查看实际返回的内容。
也不适合我。调试发现EnvironmentConfiguration.map
是一个Hashmap,它的key还是HYSTRIX_COMMAND_DEFAULT_EXECUTION_ISOLATION_THREAD_TIMEOUTINMILLISECONDS
。 Spring Boot 1.5.22 和 Spring Cloud Dalston.SR1。
@jihor 你有没有使用任何@ConfigurationProperties bean,因为魔法来自轻松的绑定? Spring Boot uses some relaxed rules for binding Environment properties to @ConfigurationProperties beans...
docs.spring.io/spring-boot/docs/1.5.22.BUILD-SNAPSHOT/reference/…【参考方案4】:
您可以尝试使用默认值的表达式:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: $SERVICE_TIMEOUT:2000
如果您有 SERVICE_TIMEOUT
system 变量 - 它将被应用程序使用,否则将采用默认值。
【讨论】:
【参考方案5】:VM 选项-Dhystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000
适合我。但是它有一个副作用,因为系统属性是优先级的,所以您不能在 java 代码中更改配置值。
ConfigurationManager.getConfigInstance().setProperty(
"hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds", 3000);// it doesn't work
【讨论】:
以上是关于使用环境变量设置 Hystrix 超时的主要内容,如果未能解决你的问题,请参考以下文章