SpringBoot的配置如何动态刷新(方案)

整合springboot集成实现动态刷新配置,花三分钟看完这篇文章你就懂了 前言大家在面试的时候不同程度会被问到JVM的垃圾回收,看面试官水平,有些就背个书就行,比如GC的工作原理,有哪些GC算法和回收器,分别优点和缺点等等,有些面试官估计自己也就背书水平,都没个追问;有些面试官就能追问,一追问就歇菜,比如低延迟的垃圾回收器有哪些以及其原理,跨代引用及解决方案,三色标记及漏标问题处理,等等。 阅读详情
AI摘要

文章介绍了微服务环境下配置管理的三种主流方案——Nacos、Config+Bus和Apollo,重点讨论了SpringBoot项目中动态刷新配置的适用场景。对于微服务集群推荐使用SpringBoot+Nacos,单体服务则可选择SpringBoot+Config+actuator或手动refresh。文章还提供了SpringBoot+Nacos和SpringBoot+Config+actuator的配置和使用步骤。

对于微服务而言配置本地化是个很大的鸡肋,不可能每次需要改个配置都要重新把服务重新启动一遍,因此最终的解决方案都是将配置外部化,托管在一个平台上达到不用重启服务即可一次修改多处生效的目的。
但是对于单体应用的Spring Boot项目而言,动态刷新显然是有点多余,反正就一个服务,改下重启不就行了,然而在某些特殊的场景下还是必须用到动态刷新的

微服务下有哪几种主流的方案?

微服务下的动态配置中心有三种主流的方式,如下图:

上图中的三种配置中心方案可以说是现在企业中使用率最高的,分别是:

  1. Nacos:阿里巴巴的最近开源的项目,这个家伙很牛逼,一个干掉了Eureka(停更)和Config+Bus,既能作为配置中心也能作为注册中心,并且有自己的独立的 管理平台,可以说是现在最主流的一种。

  2. Config+Bus:早期在用的微服务配置中心,可以依托GitHub管理微服务的配置文件,这种现在也是有不少企业在用,但是需要自己独立部署一个微服务,和Nacos相比逊色了不少。

  3. Apollo:携程开源项目Apollo,这个也是不少企业在用,陈某了解的不多,有兴趣的可以深入研究下。

针对Spring Boot 适用的几种方案?

其实上述三种都可以在Spring Boot项目中适配,但是作为单体应用有些重了。

1. 如果项目是一个微服务的集群,业务功能复杂

        建议: Spring Boot+Nacos

2. 如果项目是单体服务,业务功能单一

        建议: Spring Boot+Config+actuator

                   Spring Boot+手动refresh

针对Spring Boot+Nacos

阿里要做的其实是一个微服务生态,Nacos不仅仅可以作为Spring Cloud的配置和注册中心,也适配了Dubbo、K8s,官方文档中对于如何适配都做了详细的介绍,作者 这里就不再详细介绍了,如下图:

当然Nacos对Spring、Spring Boot 项目同样适用。

如何使用呢?这里作者只提供下思路,不做过多的深究,这篇在作者下个专栏Spring Cloud 进阶会详细介绍:

  1. 下载对应版本的Nacos,启动项目,访问http://localhost:8848进入Nacos的管理界面;

  2. Spring Boot 项目引入Nacos的配置依赖nacos-config-spring-boot-starter,配置Nacos管理中心的地址。

  3. @NacosPropertySource、@NacosValue两个注解结合完成。

  • @NacosPropertySource:指定配置中心的dataId,和是否自动刷新

  • @NacosValue替代@Value注解完成属性的自动装配

  1. 如果公司项目做了后台管理,则可以直接调用Nacos开放的API修改对应配置的值(替代了Nacos管理界面的手动操作),API的地址:https://nacos.io/zh-cn/docs/open-api.html

针对Spring Boot+Config+actuator

1. 添加Config的依赖,如下

<!-- springCloud的依赖-->
<dependencyManagement>
    <dependencies>
        <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
    </dependencies>
</dependencyManagement>

<!-- config的依赖-->
<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>

  <!-- actuator的依赖-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

2. 配置文件中暴露Spring Boot的端点,如下:

management.endpoints.web.exposure.include=*

3. 配置文件中新增三个属性配置

config.version=22
config.app.name=dynamic-project
config.platform=mysql

4. 结合@RefreshScope注解动态刷新,写个Controller,如下:

@RestController
//@RefreshScope该注解必须标注,否则无法完成动态更新
@RefreshScope
public class DynamicConfigController {
    @Value("${config.version}")
    private String version;

    @Value("${config.app.name}")
    private String appName;

    @Value("${config.platform}")
    private String platform;


    @GetMapping("/show/version")
    public String test(){
        return "version="+version+"-appName="+appName+"-platform="+platform;
    }

5. 启动项目测试

1. 浏览器访问http://localhost:8080/show/version
2. 修改target目录下的配置文件,如下:
    config.version=33
    config.app.name=dynamic-project
    config.platform=ORACLE
3. POST请求http://localhost:8080/actuator/refresh接口,手动刷新下配置(必须,否则不能自动刷新)
4. 浏览器再次输入http://localhost:8080/show/version

可以看到,配置已经自动修改了

针对Spring Boot+手动refresh

经过源码分析,配置刷新是发布刷新事件,在监听器实现刷新

发布事件:
    以nacos为例 : com.alibaba.cloud.nacos.refresh.NacosContextRefresher
    applicationContext.publishEvent(new RefreshEvent(this,null,"Refresh Nacos config"));



监听刷新事件: org.springframework.cloud.endpoint.event.RefreshEventListener

	@Override
	public void onApplicationEvent(ApplicationEvent event) {
		if (event instanceof ApplicationReadyEvent) {
			handle((ApplicationReadyEvent) event);
		}
		else if (event instanceof RefreshEvent) {
			handle((RefreshEvent) event);
		}
	}

	public void handle(ApplicationReadyEvent event) {
		this.ready.compareAndSet(false, true);
	}


执行刷新 : org.springframework.cloud.context.refresh.ContextRefresher

	public synchronized Set<String> refresh() {
		Set<String> keys = refreshEnvironment();
		this.scope.refreshAll();
		return keys;
	}

	public synchronized Set<String> refreshEnvironment() {
		Map<String, Object> before = extract(
				this.context.getEnvironment().getPropertySources());
		addConfigFilesToEnvironment();
		Set<String> keys = changes(before,
				extract(this.context.getEnvironment().getPropertySources())).keySet();
		this.context.publishEvent(new EnvironmentChangeEvent(this.context, keys));
		return keys;
	}

可以基于刷新自己实现动态加载

@GetMapping("/show/refresh")
    public String refresh(){
        //修改配置文件中属性
        HashMap<String, Object> map = new HashMap<>();
        map.put("config.version",99);
        map.put("config.app.name","appName");
        map.put("config.platform","ORACLE");
        MapPropertySource propertySource=new MapPropertySource("dynamic",map);
        //将修改后的配置设置到environment中
        environment.getPropertySources().addFirst(propertySource);
        //异步调用refresh方法,避免阻塞一直等待无响应
        new Thread(() -> contextRefresher.refresh()).start();
        return "success";
    }

测试步骤

1. 浏览器访问http://localhost:8080/show/version
2. 修改target目录下的配置文件,如下:
    config.version=33
    config.app.name=dynamic-project
    config.platform=ORACLE
3. POST请求http://localhost:8080/actuator/refresh接口,手动刷新下配置(必须,否则不能自动刷新)
4. 浏览器再次输入http://localhost:8080/show/version

可以看到,配置已经自动修改了

spring boot 配置文件动态刷新 spring boot 配置文件动态刷新说明实现方式1.建立一个spring boot工程,名称:boot-config,目录如下:2.引入pom依赖application.yml文件TestController示例测试1.启动项目,直接访问:localhost:8080/hello2.找到项目编译文件夹,找到配置文件,修改hello的值:保存文件,访问配置文件刷新接口:http://localhost:8080/actuator/refresh再次访问:localhost:8080/hello: 说明 动 阅读详情

相关推荐

springboot - 实现动态刷新配置

** * 一个Spring配置类,定义了一个名为 filePropertiesSource 的Bean,并将其加入到环境变量中。// 属性源是按照添加的顺序进行合并的,后添加的属性源中的属性会覆盖前面添加的属性源中的同名属性。// 因此,为了确保我们自定义的属性源中的属性优先级最高,我们需要将它添加到属性源列表的最后。这样就能保证后添加的属性源中的属性值会覆盖之前的同名属性。} }

学无止境 3544

springboot配置项动态刷新

springboot 配置文件一般以yaml方式保存,除了系统配置项如spring、server等外,还有我们自定义的配置项,方便系统启动时自动注入。自定义的配置项一般是动态配置项,在系统运行过程中,可能需要在线修改,来实现自定义的配置项不停服更新,也就是类似于spring-cloud-starter-config的动态刷新。由于系统不重启,无法通过自动注入的方式自动更新自定义配置, 这儿便需要我们手动加载yaml文件,转换为java对象,将变化赋值到spring管理的对象中采用最常见的snakeyaml、

爱码少年 00fly.online 的博客 2万+

SpringBoot开发——SpringBoot中10种动态修改配置的方法

SpringBoot开发——SpringBoot中10种动态修改配置的方法

bjzhang75的博客 461

Spring Boot如何实现配置文件的自动加载和刷新?

在本文中,我们介绍了Spring Boot如何实现配置文件的自动加载和刷新。配置文件是应用程序的重要组成部分,而配置文件的自动加载和刷新可以使应用程序更加灵活和可配置。我们讨论了基于轮询和基于Webhook的配置文件刷新方式,并给出了相应的示例代码。在实践中,我们需要注意一些细节,例如配置文件中属性的获取方式、Bean的刷新方式、Git仓库的访问权限和安全性等。希望本文能够对大家理解Spring Boot的配置文件自动加载和刷新有所帮助。

u013749113的博客 9499

BUSCO评估基因组的完整性

因为数据库收集的时候找的就是在不同的物种间都是单拷贝的基因,所以说在评估的物种里面应该也是单拷贝的状态才对。基因组层面评估:先去基因组上预测这些基因,再去做评估,如果说给他是一个注释好的基因集,这个时候提供的是一个蛋白集合,它就直接是去进行同源搜索,再去评估,看BUSCO数据库里面的这些单拷贝基因有或者无;首先,tblastn也是同源搜索,同源搜索之后,去对转录本进行读码框预测,预测完的结果还是去进行hmmsearch的搜索(hmmsearch是做蛋白质结构域搜索的),最终拿到BUSCO评估结果。

qq_64400864的博客 2959

STM32F429移植LVGL9.3.0:从源码配置到双缓冲优化实战

本文详细介绍了如何在STM32F429平台上移植LVGL 9.3.0图形库,涵盖从源码准备、工程配置、显示驱动适配到双缓冲优化等关键步骤。重点解析了利用STM32F429的硬件特性实现高效内存管理和流畅显示性能的实战技巧,为嵌入式GUI开发提供完整解决方案。

q6r7s8t9的博客 1135

如何实现Spring Boot动态刷新配置?3种方案对比,第2种最安全

掌握Spring Boot的配置动态刷新,解决微服务配置更新难题。对比3种实现方案,涵盖@RefreshScope、消息总线与配置中心集成,第2种安全可靠,适用于生产环境。深入原理与最佳实践,值得收藏。

AlgoPerch的博客 1075

中国大学MOOC-翁恺-C语言程序设计习题集-解答汇总

中国大学MOOC-翁恺-C语言程序设计习题集 PAT 习题集 02-0. 整数四则运算(10) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 乔林(清华大学) 本题要求编写程序,计算2个正整数的和、差、积、商并输出。题目保证输入和输出全部在整型范围内。 输入格式: 输入在一行中给出2...

weixin_30691871的博客 3万+

Spring Boot 配置动态刷新:无需重启服务的两种实战方案(附完整代码)

在 Spring Boot 开发中,修改等配置文件后需重启服务才能生效,影响开发效率和生产环境稳定性。本文结合 Spring 官方文档,详细讲解两种动态刷新配置的方案:轻量级本地刷新(适合单体应用)和分布式配置中心 + 消息总线(适合微服务架构),包含完整依赖配置、YML 参数说明及代码示例。单体应用:选择轻量级方案,只需添加 Actuator 和 Spring Cloud Context 依赖,通过refresh端点手动触发刷新微服务架构。

专注于 Java 后端架构、微服务、分布式、前端及 AI 领域的技术分享,是开发者获取硬核知识、交流实战经验的专业博客。 2179

量化投资进阶:Fama-French三因子模型实战解析与Python实现

本文深入解析了Fama-French三因子模型,并提供了完整的Python实战指南。文章阐述了该模型如何通过引入市值因子(SMB)和价值因子(HML),对传统CAPM模型进行重要扩展,以更精准地解释股票收益来源。详细演示了使用Python获取数据、执行回归分析并解读结果(包括关键的阿尔法α)的全过程,并探讨了该模型在量化策略构建、风格诊断和业绩归因中的核心应用。

yog99的博客 1127

激光器安规详细解读 - 一级 - 并以940波长为例

前言: 作为人工智能的重要解决方案,激光作为不可或缺的一个选项。但是,激光的安规问题始终是要得到关注。尤其是3D识别技术在人脸上的使用的时候,如何判读激光器的安全使用规范,变得非常重要。本文,尝试从欧洲激光标准IEC 60825-1:2014,以及国家激光产品规则标准GB 7247.1,抛砖引玉,写出自己的理解。 本节,主要讨论,人脸识别需要符合的安全等级1: 1 激光标准的分类 激光国际...

山云的专栏 5037

Spring Boot 的配置动态刷新

对于微服务而言配置本地化是个很大的鸡肋,不可能每次需要改个配置都要重新把服务重新启动一遍,因此最终的解决方案都是将配置外部化,托管在一个平台上达到不用重启服务即可一次修改多处生效的目的。但是对于单体应用的Spring Boot项目而言,动态刷新显然是有点多余,反正就一个服务,改下重启不就行了?添加数据源:对接某个第三方平台的时候,你不可能每次添加一个数据源都要重启下服务固化的对接:大量的固定对接方式,只是其中的某个固定的代码段不同,比如提供视图中的字段不同,接口服务中字段不同等情况。

BUG指挥课堂 1824

华为HCIE之TS部分整理

TroubleShooting 整体拓扑 1. MSTP 题目需求:site1 中,CLIENT1 属于 VLAN12,CLIENT3 属于 VLAN34;MSTP 中的 VLAN12 属于 instance1,vlan34 属于 instance2;两个 instance 的主备根桥分别在 SW1 和 SW2 上,并且要求 CLIENT1访问 R1 时经过的路径是 SW3-SW1-R1;同时要求 CLIENT3 访问 R1 时经过的路径是SW3-SW2-R1; 排错思路: ①查看SW3 SW1 SW

ledrsnet的博客 5756

SpringBoot+@RefreshScope:动态刷新配置的终极指南

通过,我们实现了:• ✅ 零停机配置更新• ✅ 即时生效的应用参数• ✅ 更灵活的运维体验• ✅ 资源利用最大化最佳实践建议:• 敏感配置(如密码)避免使用动态刷新• 配合配置中心(Nacos/Config Server)使用• 生产环境务必保护刷新端点技术的本质是让复杂变简单。掌握动态配置刷新,让你的应用在云原生时代如虎添翼!

m0_69632475的博客 466

【完整梳理验证】企业微信第三方应用接入全流程java版

由企业内部的开发者自己开发部署,相当于是企业自己的资产,调用接口基本没有任何限制。由SaaS服务商的开发者开发并部署在服务商侧,面向所有企业。需要企业授权使用(先试用后付费),服务商仅可获取企业授权部分的权限,相当于白名单控制。由服务商的开发者开发,但部署在企业内部。一般是线下签约采购方式,因此权限几乎与自建应用无异,企业管理员只需要配置不对服务商开放的敏感权限,相当于黑名单控制。服务商后台地址:企业微信服务商官网企业管理后台地址:企业微信管理后台服务商,可以理解为 SAAS 中的运营端。企业管理端,可以理

Hello, New World! 2760

CVPR 2023 中的半监督学习: FixMatch 的升级版 UniMatch

我们首先回顾下发表在 NeurIPS 2020 上的 FixMatch: Simplifying Semi-Supervised Learning with Consistency and Confidence,FixMatch 是一种更轻量的半监督分类方法。如下图所示,FixMatch 首先使用模型(带标签数据训练后的)对弱增强的未标记图像进行预测,生成伪标签。对于给定的图像,只有在模型产生高置信度的预测时,伪标签才会被保留。然后,在输入同一图像的强增强版本时,训练模型预测伪标签。

NJU phd 在读。 2633

SpringBoot整合Nacos:微服务日志统一管理与动态刷新实战

日志治理是微服务架构中绕不开的基础工程,配置分散、格式不统一、级别调整依赖重启,这些问题直接拖慢线上问题定位效率。配置中心作为微服务配置管理的核心基础设施,能够将日志格式、级别、输出策略等配置项集中收口,并通过长轮询机制实现秒级动态推送,让日志体系从源头变得规范可控。SpringBoot内置的日志管理系统与Nacos配置中心的结合,使得日志级别无需重启即可动态调整,统一格式后traceId贯穿调用链,为后续链路追踪和监控告警提供可靠数据基础。本文以工程实践视角,梳理从环境搭建、配置规划、动态刷新原理到实操验

weixin_31528001的博客 256

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

apollo修改配置刷新bean_springboot实战之整合配置中心实现动态刷新(Apollo篇)

分布式apollo简介Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。本文主要介绍如何使用apollo与springboot实现动态刷新配置,如果之前不了解apollo可以查看如下文档https://github.com/ctripcorp/apollo学习了解一下...

weixin_39941262的博客 1654

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

nacos 配置动态刷新_使用 Spring Cloud Alibaba Nacos Config 作为配置中心

什么是 Nacos Config 在分布式系统中,由于服务数量巨多,为了方便服务 配置文件统一管理,实时更新,所以需要分布式配置中心组件。 Spring Cloud Alibaba Nacos Config 是 Spring Cloud Config 的替代方案。 Nacos Config 的存储配置功能为分布式系统中的外部化配置提供服务器端和客户端支持,可以在 Nacos 中集中管理 Sprin...

weixin_42361611的博客 420

【微服务架构】SpringCloud Alibaba(二):Nacos作为配置中心(Config数据模型、集成SpringBoot、动态刷新原理)

这个也是在之前的图中讲到,他是将客户端每次请求都会放到这个quene里面,放到这里面就是,当页面或者通过api调用修改了配置,修改配置之后会发送一个消息,订阅消息一端就会遍历我们刚刚这个allSubs队列当中,看看这个队列里面请求的配置发生了变化,如果发生变化的配置和请求的客户端监听的配置匹配上之后,就会立即将变更的内容发挥给客户端。这里面的代码就是将客户端请求,进行个返回,那返回之前他会干什么,他会进行比较, 他会比较我们监听的配置和我本身的配置是否发生了变化,他的执行的代码在他的run当中,

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

apollo动态切换mysql数据源_apollo与springboot集成实现动态刷新配置

分布式apollo简介Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。本文主要介绍如何使用apollo与springboot实现动态刷新配置,如果之前不了解apollo可以查看如下文档学习了解一下apollo,再来查看本文正文apollo与spring实现动态刷新配置本文主要...

weixin_33603551的博客 1039

Springboot+Nacos 配置中心 动态刷新自定义配置文件失效

nacos 配置中心 动态刷新配置

weixin_40559666的博客 1859

SpringBoot + @RefreshScope:动态刷新配置的终极指南!

默认情况下,配置刷新的触发条件是:调用 refresh 端点,或者配置中心的配置变了。但有时候,咱们可能想自定义触发条件,比如只有当某个特定的配置变了之后,才触发刷新;或者只有管理员才能触发刷新。要实现自定义触发条件,咱们可以通过 “监听 RefreshEvent 事件” 或者 “自定义 RefreshScope” 来实现。这里咱们讲一个简单的方法:监听 RefreshEvent 事件。比如咱们想实现:只有当 “user.greeting” 这个配置变了之后,才触发 UserConfig 的刷新。

欢迎来到我的博客 1606

SpringBoot2中使用Lettuce 拓扑刷新问题

Lettuce 拓扑刷新问题

Brucelwl的博客 1万+

SpringBoot中10种动态修改配置的方法

通过自定义Spring的和文件监听机制,实现本地配置文件的动态加载。动态配置修改能够提升系统的灵活性和可管理性,选择合适的动态配置方案应综合考虑应用规模、团队熟悉度、基础设施现状和业务需求。无论选择哪种方案,确保配置的安全性、一致性和可追溯性都是至关重要的。

风象南的专栏 1574
上一篇: JDK版本选择
下一篇: SpringBoot的配置如何动态刷新(Nacos实现)
xinyuan_java
博客等级 码龄12年 181粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值