springboot集成consul配置中心,动态(热加载)配置文件

consul服务注册与发现、服务配置与刷新 为什么要用服务注册?为什么要用consul不用eureka? 阅读详情
AI摘要

博客介绍了使用Spring Boot和Consul实现配置热加载的方法。针对原配置加载方式无法动态增删的问题,通过Consul的配置监听功能和Spring Boot的事件监听实现动态加载。详细说明了配置中心和配置热加载的代码实现步骤,最后总结需用Consul或Nacos作配置中心实现热加载。

一、使用场景

需要根据配置文件中的某个配置生成指定的容器。原先是每次启动时加载指定的配置项后生成。但是这种方式的缺点很明显,每次需要增删配置时,都需要重启才可以,不能做到有效的动态增删,对于线上项目就很难受。

二、原理思路

通过consul线上配置,来实现动态加载配置,这里使用consul做案例。

原理:使用consul作为配置中心,通过consul自带得config watch(配置监听功能)和 Springboot的事件监听事件来实现。

流程是:consul开启watch后,会定期检查指定的配置文件,如果有更改,触发RefreshEvent事件,然后通过触发事件可以获取到更改的配置文件,然后可以实现热加载!这些可以通过源码看到,感兴趣可以看看。

三、配置中心-代码实现

  1. 亘古不变,万事先依赖

这里注意一下consul配置中心时对springboot版本的一些要求,特殊情况代码里我写的有注释!

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-config</artifactId>
    <version>3.1.3</version>
</dependency>
<!--        如果使用的是springbooit2.4以后及bootsrap.yml启动的,报错找不到启动项的,需要添加以下依赖-->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-bootstrap</artifactId>-->
<!--            <version>3.0.3</version>-->
<!--        </dependency>-->
  1. 其次,在application.yml或bootstrap.yml上写入配置文件:
spring:
  cloud:
    consul:
      port: 8500
      host: localhost
      config:
        prefix: config #consul key/value对应的前缀,就是文件夹
        format: files
        watch:
          enabled: true #是否开启监听
          waitTime: 1 #检查consul文件的事件间隔
        data-key: ${spring.application.name} #对应的配置文件名称
  config:
    import: 'consul:'
  application:
    name: cktest

以上文件对应的就是consul,key/value下面的:config/你的data-key.yaml文件。

注意:

这里的config:import比较特殊,如果是springboot2.4之前的可以不用添加,sringboot2.4之后必须添加。

如果是bootstrap.yml,则需要添加上面注释的maven,否则会报错找不到config:import,也可以改成application.yml即可。原因:因为springboot2.4之后好像去除bootstrap了,所以需要引入bootstrap以来才行。

  1. 然后在consul上对应的位置,创建好对应的yaml文件及写入其他项目配置。
    在这里插入图片描述

  2. 此后启动项目,如果端口是8092,则说明consul配置中心成功了。
    在这里插入图片描述

四、配置热加载-代码实现

  1. 实现SmartApplicationListener接口
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.cloud.context.refresh.ContextRefresher;
import org.springframework.cloud.endpoint.event.RefreshEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.SmartApplicationListener;
import org.springframework.core.env.Environment;

import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;

@Configuration
public class ConfigChangeListener implements SmartApplicationListener {

    private ApplicationContext applicationContext;

    private ContextRefresher refresh;

    private AtomicBoolean ready = new AtomicBoolean(false);

    //注入刷新事件和程序上下文
    @Autowired
    public ConfigChangeListener(ContextRefresher refresh, ApplicationContext applicationContext) {
        this.refresh = refresh;
        this.applicationContext = applicationContext;
    }


    //是否支持的事件类型
    @Override
    public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
        return ApplicationReadyEvent.class.isAssignableFrom(eventType)
                || RefreshEvent.class.isAssignableFrom(eventType);
    }

    //初始化和配置更改时触发的事件
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        try {
            //项目启动时会触发该事件
            if (event instanceof ApplicationReadyEvent) {
                handle((ApplicationReadyEvent) event);
            } else if (event instanceof RefreshEvent) {
                //consul配置文件更改时触发改事件
                handle((RefreshEvent) event);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*
     * 监听ApplicationReadyEvent事件,当Spring容器初始化完成后,会触发该事件
     * */
    public void handle(ApplicationReadyEvent event) {
        Environment environment = applicationContext.getEnvironment();
        try {
            String property = environment.getProperty("server.port");
            System.out.println("haha" + property);
            String property2 = environment.getProperty("lee.test");
            System.out.println("haha" + property2);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        this.ready.compareAndSet(false, true);
    }

    /*
     * 监听RefreshEvent事件,当配置文件发生变更时,会触发该事件
     * */
    public void handle(RefreshEvent event) throws Exception {
        // 程序未初始化好之前不做处理
        if (this.ready.get()) {
            log.info("触发事件 " + event.getEventDesc());
            //调用ContextRefresher刷新配置方法
            //刷新方法执行后,才会获得最新的配置
            Set<String> keys = this.refresh.refresh();
            log.info("更改的配置有: " + keys);
            Environment environment = null;
            if (keys.size() > 0) {
                environment = applicationContext.getEnvironment();
            }
            for (String key : keys) {
                String property = environment.getProperty(key);
                System.out.println(property);
            }
        }
    }
}
  1. 更改consul上的配置文件

在这里插入图片描述
在这里插入图片描述
当输出的是最新的配置值,说明热加载成功!

五、总结

热加载需要使用consul或者nacos作为配置中心,然后通过配置文件的监控,实现热加载!

🙉在小小的电脑上面敲呀敲呀敲,写短短的代码,埋小小的坑🙈

🙉在大大的电脑上面敲呀敲呀敲,写大大的代码,埋大大的坑🙈

🙉在特别大的电脑上面敲呀敲呀敲,写特别大的代码,埋特别大的坑🙈

🙉优秀的你肯定是一个不爱写Bug并且爱点赞关注的靓仔吧!🙈

SpringCloud Consul:服务发现与配置中心集成 Spring Cloud Consul为微服务架构提供了强大的服务发现和配置管理解决方案。通过Consul,可以实现服务的自动注册与发现,简化服务通信;同时,Consul的键值存储功能可以作为配置中心,实现配置的集中管理和动态刷新。在实际应用中,Spring Cloud Consul的集成非常简单,只需添加相应的依赖和配置即可。Consul本身部署也很轻量,支持从单节点开发环境到多节点集群生产环境的灵活扩展。对于中小规模的微服务系统,Consul是一个非常好的选择。 阅读详情

相关推荐

SpringBoot监控实战:Prometheus与Grafana环境搭建指南

在微服务架构中,应用性能监控(APM)是保障系统稳定性的关键。Prometheus作为时序数据库,采用Pull模式主动采集指标,配合Micrometer指标门面库,可无缝对接SpringBoot应用。通过暴露/actuator/prometheus端点,Prometheus定期拉取JVM、HTTP请求等指标,Grafana则实现可视化展示。这套方案能有效解决接口延迟、资源瓶颈等排查难题,适用于分布式系统的实时监控与告警。本文详细梳理了从Docker Compose部署到应用集成的完整环境准备流程。

weixin_34055787的博客 310

配置中心—Consul 配置管理

配置中心—Consul配置管理ConsulKey/Value存储.NetCore集成Consul配置中心 ConsulKey/Value存储 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul的方案更“一站式”,内置了服务注册与发现框架、分布式一致性协议实现、健康检查、Key/Value存储(配置中心)、多数据中心方案,不再需要依赖其它工具(比如ZooKeeper等),使用起来也较为简单。 请注意这里,C

weixin_37648525的博客 1万+

Logstash日志管道设计:分布式系统结构化监控实战

在分布式系统中,日志监控的本质是将异构、海量、非结构化的原始日志转化为可查询、可关联、可告警的结构化数据资产。其核心原理依赖于可编程的数据流水线模型,通过解析(如dissect/grok)、增强(geoip/日期标准化)、过滤与 enrich 等环节,实现从文本噪音到业务信号的跃迁。Logstash凭借成熟的filter插件生态、JVM级可控性及自定义扩展能力,在语义解析深度和生产稳定性上显著优于Filebeat等轻量采集器。它广泛应用于电商大促实时排查、金融风控日志归因、SaaS多租户审计等高要求场景,尤

ciyinzhi8788的博客 422

SpringCloud使用Consul作为配置中心

这一篇文章我们主要学习Consul作为配置中心来使用,每一个步骤都很详细,包括Consul管理界面的介绍与使用,Consul和SpringCloud的Config相比较而言,不需要额外的git、svn、数据库等配合,且无需配合Bus即可实现配置刷新。......

怪咖@的博客 6156

Spring Cloud开发实践:集成Consul作为配置中心和后端开发

Consul是一个开源的服务发现和配置工具,它提供了一个分布式的键值存储,可以用于存储和管理应用程序的配置信息。在Spring Cloud中使用Consul作为配置中心,可以实现动态刷新配置,无需重启应用程序。通过以上步骤,我们成功地集成了Consul作为配置中心,并通过Spring Cloud实现了动态配置的能力。你可以根据实际需求在Consul中管理各种配置项,并通过注解方式在应用程序中使用这些配置项。接下来,我们需要在Spring Boot应用程序的配置文件中配置Consul的相关信息。

class_class957的博客 259

STM32F103xx / STM32F429VET6最小系统原理图

心血来潮想试一下STM32F4系列和F1系列在编程上有什么差别,手头没有开发板,本着能勤俭节约的原则自己先做一块看看能不能成,看了一下STM32F429VET6的芯片在F429xx中最便宜,对照着数据手册绘制了原理图画了PCB,目前打板中,焊接完如果跑不通回来修改文章。这里我们可以看到,VDD是标准工作电压,VDDA是模拟工作电压,且VDDA必须与VDD等电位,VBAT是备份工作电压,一般接纽扣电池电源,如果存在VREF+引脚,则要求VDDA-VREF+ < 1.2V。截图下来比较糊,不知道为什么。

m0_51294753的博客 1万+

从零到生产:Windows/Linux/Docker三环境下Consul集群与SpringBoot整合全攻略

本文详细介绍了在Windows、Linux和Docker三种环境下部署Consul集群并与SpringBoot微服务整合的全过程。从单机开发环境搭建到多节点生产集群配置,涵盖环境规划、关键参数调优、安全设置及性能监控等核心内容,帮助开发者实现高效的服务发现与配置管理。

weixin_32715349的博客 301

TM1650数码管驱动芯片

简介 TM1650是一款国产4位共阴数码管驱动芯片,它还带有矩阵按键扫码功能。它的基本参数如下: 工作电压:3~5V 数码管驱动模式:8段x4位共阴数码管 矩阵按键驱动模式:7x4矩阵按键,不支持组合键 通信接口:类IIC,使用了IIC相同的时序,但没有完全遵守IIC的协议,不带从机地址 引脚定义 SCL:串行通信时钟线 SDA:串行通信数据线 做数码管驱动使用时 DIGx:数码管的位选引脚,灌电流驱动,最大可吸收150mA电流 A~DP:数码管的段驱动引脚,拉电流驱动,最大可输出25m

luliplus的博客 4万+

分布式配置管理平台XXL-CONF

https://www.cnblogs.com/xuxueli/p/4777808.html https://gitee.com/xuxueli0323/xxl-conf

meng19910117的博客 170

银河麒麟V10系统下VLC播放器安装全攻略(附3.0.9.2版本离线包下载)

本文详细介绍了在银河麒麟V10操作系统无网络环境下,从零开始编译安装VLC 3.0.9.2播放器的完整攻略。通过构建本地YUM仓库解决依赖问题,提供离线资源包下载,并逐步指导完成编译环境配置、软件编译与安装,帮助用户在国产麒麟系统上成功部署强大的多媒体播放能力。

a2b3c4d5e的博客 1191

KUKA机器人自动回原点程序

创建两个全局变量分别用于储存机器人的笛卡尔姿态与关节角姿态。打开System文件夹中的config文件创建全局变量的点位。在USER GROBALS用户自定义变量Userdefined variables下创建一个E6POS类型的点位,一个E6AXIS类型的点位。

A567852的博客 5210

互联网大厂Java面试全场景实战:SpringBoot+微服务+持久化技术详解

面试官:张面(严谨、专业)谢飞机:应聘者(能答会算,遇到难题“云里雾里”)公司正在打造一个 UGC 视频平台,支持用户上传短视频、实时弹幕、离线转码、推荐分发等功能。系统需满足高并发、高可用、可扩展的要求。

m0_67551826的博客 608

Unity WebGL发布避坑指南:从内存设置到字体打包,一次搞定所有常见问题

本文详细解析Unity WebGL发布的完整流程,从内存设置到字体打包,提供全面的避坑指南。涵盖关键检查清单、内存与性能优化配置、资源处理专项优化及平台适配技巧,帮助开发者高效解决常见问题,确保项目顺利发布。

weixin_28693309的博客 147

YOLO模型矩阵与SpringBoot协同的野生动物巡护系统

YOLO目标检测作为计算机视觉基础技术,其核心价值在于将图像中的物体定位与分类转化为可执行业务逻辑。在边缘计算、实时推理与多源异构设备部署场景下,单一模型难以兼顾精度、速度与功耗,因此需构建分层适配的YOLO模型矩阵;而SpringBoot凭借其成熟生态与高内聚低耦合架构,天然适合作为AI能力与业务规则之间的语义桥梁,支撑检测结果向告警、报告、工单等真实巡护动作转化。该组合方案广泛应用于自然保护、电力巡检、农业监测等强约束工业现场,尤其适合红外影像识别、弱网环境交互、离线PDF生成等典型需求。

weixin_34216107的博客 212

Arduino安装图文教程:小白也能轻松上手

手把手带你完成Arduino安装全过程,无论你是编程新手还是硬件小白,都能快速搭建开发环境。结合arduino安装教程与实操步骤,避开常见错误,让创作即刻启程。

weixin_35509395的博客 1106

深入解析mSATA与mini-PCIE接口的硬件设计要点

本文深入解析mSATA与mini-PCIE接口的硬件设计要点,涵盖信号定义、电源设计、高速信号处理及PCB布局布线等关键内容。通过实战案例和调试技巧,帮助工程师规避常见设计陷阱,提升电路设计效率,特别适合工业控制和嵌入式系统开发场景。

weixin_28741413的博客 315

Spring Cloud微服务网关实战:Nacos+Gateway+OAuth2协同方案

微服务架构中,服务发现、API网关与统一认证是三大核心能力。Spring Cloud作为治理框架,提供标准化能力抽象;Nacos承担服务注册与动态配置双重职责,支撑服务寻址与热更新;Spring Cloud Gateway不仅是反向代理,更是请求生命周期的中央处理器,支持路由、鉴权、限流等关键逻辑;OAuth2则通过JWT实现跨服务的身份信任传递与权限控制。四者协同构建高可用、可扩展、安全可控的分布式系统入口。本文聚焦真实生产环境下的集成实践,涵盖版本兼容性、Nacos服务发现与配置双模驱动、Gateway

weixin_34186128的博客 324

基于稀疏表示字典学习的图像超分辨率-杨建超论文解析

文章:《Image Super-Resolution via Sparse Representation》 作者:杨建超 信号稀疏的定义: 令字典D的原子个数M,信号维度为N,则有以下三种关系: M = N时,D为完备的; M > N时,D为冗余的; M>>N时, D为过完备的。 图解如下: 借鉴了压缩感知的思想,通过对大量低分辨率图像和高分辨...

ycc18829026593的博客 7637

服务治理consul之配置中心

作为配置中心是通过核心类实现的。

qq_36851469的博客 1304

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spring Cloud开发实践(七): 集成Consul配置中心

Consul 通过 Key/Value 功能集中管理存储配置信息, 通过 Spring Cloud Consul Config 可以实现 Config Server 和 Client 的关联. 在 Spring 启动的 bootstrap 阶段, 配置会被载入环境上下文.

IOsetting的专栏 1685

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【SpringCloud】整合Consul实现配置中心

Consul不仅能用来服务注册和发现,Consul而且支持Key/Value键值对的存储,可以用来做配置中心。Consul不仅能用来服务注册和发现,Consul而且支持Key/Value键值对的存储,可以用来做配置中心。关于spring.cloud.consul.config的配置项描述如下: • enabled 设置config是否启用,默认为true • format 设置配置的值的格式,可以yaml和properties • prefix 设置配的基本目录,比如config • defaultCont

1559

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

consul服务注册发现与配置中心

Eureka已经停止更新了,consul是独立且和微服务功能解耦的注册中心,而不是单独作为一个独立微服务嵌入到系统中。

长江七号的博客 2405

【Consul教程】3.SpringBoot整合Consul搭建配置中心

前言 上篇讲到了SpringBoot和Consul搭建服务注册与发现,这篇主要描述SpringBoot整合Consul搭建配置中心。 整合 consul的注册中心是安装的服务器上,只需要搭建注册客户端就行了。 pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifa

terrybg 1万+

【SpringCloud】Consul-服务注册中心及配置中心快速入门

首先要创建一个 Config 文件夹,然后创建各个子文件夹,最后的data文件就是配置文件。注意:如果输入结尾是’/',则当前为文件夹,下方的文本框会消失。注解即可开启动态刷新配置的功能,默认每隔55s刷新一次配置。启动SpringBoot服务,检查服务是否注册成功。为例,默认环境的配置如下,其他几个环境操作都相同。在测试之前,别忘了将。

Decade_Faiz的博客 2246

java分布式的ACP是什么

否则无法保证一致性,Consul 遵循CAP原理中的CP原则,保证了强一致性和分区容错性,且使用的是Raft算法,比zookeeper使用的Paxos算法更加简单。虽然保证了强一致性,但是可用性就相应下降了,例如服务注册的时间会稍长一些,因为 Consul 的 raft 协议要求必须过半数的节点都写入成功才认为注册成功;当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。

Alfred_tfk的博客 1992

Springboot 集成 Consul 实现服务注册中心-05

Consul是一个开源的服务发现和配置管理工具,具有跨平台、运行高效等特点。它由HashiCorp公司开发,并使用Go语言编写。Consul主要用于实现分布式系统中的服务发现、健康检查、键值存储等功能。 Consul的核心功能 服务发现:Consul通过DNS或HTTP接口实现服务发现,允许开发人员轻松地注册、发现和注销服务,从而实现高可用和负载均衡。 健康检查:Consul具备强大的健康检查功能,可以监控服务的状态并根据设定的规则自动剔除故障节点。它支持多种健康检查方式,如TCP、HTTP、Docker

编程是一门实践技术 1461
上一篇: springboot的kafka动态工具类(动态创建topic、监听和监听方法)
下一篇: nvm--Node多版本控制及依赖问题解决
黄焖大排骨
博客等级 码龄8年 52粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值