动态刷新springboot配置

Posted

技术标签:

【中文标题】动态刷新springboot配置【英文标题】:Refresh springboot configuration dynamically 【发布时间】:2019-01-26 02:29:45 【问题描述】:

有什么方法可以在我们更改.properties 文件后立即刷新springboot 配置?

我遇到了spring-cloud-config,许多文章/博客建议将其用于分布式环境。我的springboot 应用程序有很多部署,但它们彼此不相关或不依赖。我还查看了一些解决方案,他们建议提供休息端点以手动刷新配置而无需重新启动应用程序。但我想在更改 .properties 文件时动态刷新配置,无需手动干预。

非常感谢任何指南/建议。

【问题讨论】:

【参考方案1】:

您能否只使用 Spring Cloud Config“服务器”并让它向您的 Spring Cloud 客户端发出属性文件已更改的信号。看这个例子:

https://spring.io/guides/gs/centralized-configuration/

在幕后,它正在执行poll of the underlying resource,然后将其广播给您的客户:

    @Scheduled(fixedRateString = "$spring.cloud.config.server.monitor.fixedDelay:5000")
    public void poll() 
        for (File file : filesFromEvents()) 
            this.endpoint.notifyByPath(new HttpHeaders(), Collections
                    .<String, Object>singletonMap("path", file.getAbsolutePath()));
        
    

如果您不想使用配置服务器,在您自己的代码中,您可以使用类似的预定注释并监控您的 properties 文件:

@Component
public class MyRefresher 

    @Autowired
    private ContextRefresher contextRefresher;

    @Scheduled(fixedDelay=5000)
    public void myRefresher() 
        // Code here could potentially look at the properties file 
        // to see if it changed, and conditionally call the next line...
        contextRefresher.refresh();
     

【讨论】:

在这种情况下使用 Scheduled 是否有效?我试图通过这种方法了解我的应用程序的过载[如果有的话]。我无法重新启动应用程序以刷新配置更改。但我想通过使用可用选项即时刷新来尽可能保持高效。 我建议的第一个选项(使用 Spring Config Server)可能是您最好的方法。它基本上会向您的应用程序发送一个事件。但是,不利的一面是,如果您不想让单独的服务器运行,它会“效率低下” 感谢@Dovmo。我会尝试第一个选项,看看它是否适合

以上是关于动态刷新springboot配置的主要内容,如果未能解决你的问题,请参考以下文章

Nacos配置文件获取不到 动态刷新失效问题解决

SpringCloud04 服务配置中心消息总线远程配置动态刷新

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

Spring boot 动态的配置Scheduling

Apollo配置中心动态刷新日志级别

springboot动态修改配置文件