使用环境变量设置 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.timeoutIn‌Milliseconds: $SERVICE_TIMEOUT:2000

如果您有 SERVICE_TIMEOUTsystem 变量 - 它将被应用程序使用,否则将采用默认值。

【讨论】:

【参考方案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 超时的主要内容,如果未能解决你的问题,请参考以下文章

linux环境变量的设置

Jenkins设置环境变量

电脑consul环境变量怎么设置和使用

Linux两个小技巧

使用批处理命令设置环境变量

R语言-环境变量设置