Spring Boot 2:动态刷新属性不起作用

Posted

技术标签:

【中文标题】Spring Boot 2:动态刷新属性不起作用【英文标题】:Spring Boot 2: Refresh properties on the fly not working 【发布时间】:2018-08-28 00:25:27 【问题描述】:

我已经按照这个官方教程Getting Started Centralized Configuration使用spring boot 2.0.0.RELEASE和spring cloud Finchley.M8

但动态刷新属性(无需重新启动)不起作用。 经过一些调试后,我注意到在 ContextRefresher.class 的方法 refresh() 中,它正确返回了更改的键,但是在下次使用时重构了带有 @RefreshScope 注释的 bean。它仍然看到旧值而不是更新值。

注意:这与 spring boot v 1.5.6 和 spring cloud Edgware.RELEASE 完美配合。

有什么帮助吗?

谢谢

【问题讨论】:

启动 2.0.0.RELEASE 有一个错误 是的,我明白了。将推迟升级,直到事情稳定。谢谢 【参考方案1】:

好像spring boot 2.0.1.RELEASE中的spring.cloud.config.uri一直在寻找8888端口,不接受其他值,所以我放了下面的配置(你可以忽略它,因为它是默认值客户端,服务器应该在 8888 端口上运行

spring:
  cloud:
    config:
      uri: http://localhost:8888

我还尝试在客户端公开所有其他服务以进行如下测试

management:
  endpoints:
    web:
      exposure:
        include: '*'

或使用以下内容只允许刷新

management:
  endpoints:
    web:
      exposure:
        include: refresh

然后调用 POST 方法而不是 GET 进行刷新

$ curl -X POST localhost:8080/actuator/refresh -d  -H "Content-Type: application/json"

终于成功了。

【讨论】:

我的问题出在 2.0.0.RELEASE 版本上,也许他们在 2.0.1.RELEASE 中修复了它 我在最新版本上遇到了同样的问题,但我按照上面的方法修复了它 我现在尝试使用 spring boot V 2.0.0.RELEASE 在端口 8888 上运行配置服务器,问题是一样的。我认为他们设法在新版本中进行了一些修复。【参考方案2】:

在application.properties下面使用-

management.endpoint.refresh.enabled=true
management.endpoint.restart.enabled=true
management.endpoint.health.enabled=true
management.endpoint.health.show-details=always
management.endpoint.info.enabled=true
management.endpoints.web.exposure.include=info,health,refresh    

使用 yaml 配置文件对我不起作用,当切换到属性文件时,它可以使用上述配置。

谢谢

【讨论】:

即使我尝试了同样的方法,但令人惊讶的是它对我有用。肯定是个bug【参考方案3】:

Spring Boot 2.0 或更高版本使用“OPTIONS”方法调用“执行器/刷新”,而不是方法“POST”。

对于较低版本(

确保您在application.properties. 中定义了management.endpoints.web.exposure.include=*

【讨论】:

以上是关于Spring Boot 2:动态刷新属性不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 外部化属性不起作用

Spring Boot + OAuth + JWT + MySQL 刷新令牌第二次不起作用

Spring Boot 应用程序运行正常,但 hibernate 和 MySql 相关属性不起作用

迁移到 Spring Boot 2.2.0 @JsonIgnore 不起作用

Spring boot参数更新模型数据库不起作用

指定端口时,Spring Boot Actuator 端点的单元测试不起作用