Spring Cloud Config 是 Spring Cloud 提供的一个用于集中化管理应用程序各个环境下的配置属性的解决方案。它支持统一管理配置,并且可以在不重启应用的情况下动态地更新配置信息,提高开发和运维效率。

主要特点
• 集中管理配置:可以将不同环境下(如开发、测试、生产)的应用配置集中存储在一个地方,比如Git仓库,便于管理和版本控制。
• 动态刷新配置:支持在不重启应用的情况下,动态刷新配置信息,只需要引入spring-boot-starter-actuator依赖,并暴露 refresh 端点即可

实现对指定配置项的刷新。
• 多种存储方式:虽然默认使用Git作为后端存储,但也支持其他存储方式,如Subversion、本地文件系统等,通过简单的配置就可以切换。
• 加密与解密:提供对配置内容的加密与解密功能,增加了配置的安全性,特别是对于敏感信息的保护。

简单使用示例
创建配置文件
在一个 Git 仓库中创建配置文件 {application}-{profile}.yml 或者 {application}-{profile}.properties ,存放微服务的配置项。比如 myapp-dev.yml 或者 myapp-dev.properties ,表示的是微服务 myapp 在 dev 环境下的配置项。

创建 Config Server
pom.xml 添加依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId>
</dependency>

Spring Boot 应用的主类上添加 @EnableConfigServer 注解以启用 Config Server 功能:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);}
}

在 application.properties 或 application.yml 中指定 Git 仓库的位置,Config Server 将从这里读取配置文件。

server:port: 8888 # 默认端口为8888spring:cloud:config:server:git:uri: https://github.com/your-repo/config-repo # 替换为配置文件的Git仓库地址

创建 Config Client
在 pom.xml 文件中添加依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId>
</dependency>

在 bootstrap.properties 或 bootstrap.yml 中配置客户端应用去连接到 Config Server 并获取配置信息。

spring:application:name: myapp # 与 Config Server 拉取的 Git 的配置文件名匹配cloud:config:uri: http://localhost:8888 # Config Server的地址

这样就可以在应用程序代码中通过 @Value 注解或者直接注入 Environment 对象来访问从 Config Server 获取的配置值:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {@Value("${your.config.key:default_value}")private String configValue;@GetMapping("/test")public String test() {returnthis.configValue;}
}

核心原理
在这里插入图片描述

Spring Cloud Config 的核心组件:

配置存储(比如Git):
• 用户将配置文件 push 到 Git 仓库,配置文件按照 {application}-{profile}.yml 或者 {application}-{profile}.properties 格式命名。

Config Server:
• 配置服务器,负责从后端存储(如 Git )中读取配置,并提供给客户端访问。需要在项目中添加spring-cloud-config-server依赖,并使用@EnableConfigServer注解启用。
• 每次 Config Client 请求获取配置信息的时候,Config Server 会从 Git 把最新配置信息拉到本地文件系统(本地 Git 仓库),然后从本地读取并返回。当远程仓库无法获取的时候,会直接从本地返回。
• 连接 Git 仓库的配置:
• spring.cloud.config.server.git.uri:Git仓库位置。
• spring.cloud.config.server.git.searchPaths:配置仓库路径下的相对搜索位置,可以配置多个。
• spring.cloud.config.server.git.username:访问Git仓库的用户名。
• spring.cloud.config.server.git.password:访问Git仓库的用户密码。

Config Client:
• 配置客户端,连接到配置服务器获取配置信息,并根据这些配置启动或运行。需要添加spring-cloud-starter-config依赖来接入配置中心服务。
• Cloud Client 在启动的时候,默认会从工程的 classpath 中加载配置信息并启动应用。只有当配置了 spring.cloud.config.uri 的时候,客户端才会尝试连接 Config Server 服务端来获取远程配置信息并初始化 Spring 环境配置。
• 备注:必须将该参数配置在 bootstrap.propertites、环境变量或其他优先级高于应用 Jar 包内的配置信息中,才能正确加载到远程配置( Spring boot 的配置加载解有优先级)。
• Config Server 中存储了多个 Config Client 的配置,因此 Config Client 需要配置声明获取哪一个 Client 的配置文件:
• spring.cloud.config.uri:配置服务端 Config Server 的地址。可以把 Config Server 作为一个普通的微服务应用,纳入 Eureka 的服务治理体系中,这样就可以通过配置中心的服务名(而不是具体 ip )来获取配置信息。
• spring.application.name:应用名,对应配置文件规则中的 {application} 部分。
• spring.cloud.config.profile:环境名,对应配置文件规则中的 {profile} 部分,比如 pre 、gray 、online 。
• spring.cloud.config.label:指定 Git 的 branch、tag 或 commit ID,不填写则默认为获取 Git 的 master 分支配置。

Spring Cloud Config 动态更新配置原理:

核心概念:
• Environment 和 PropertySource:在 Spring 中,Environment 是一个关键接口,它代表了当前应用程序正在运行的环境,并且包含了多个 PropertySource 实例。每个 PropertySource 都是一个潜在的属性来源,如系统属性、环境变量或外部配置文件等。Spring Cloud Config Client 会将从 Config Server 获取到的配置作为 PropertySource 添加到 Environment 中。
• @RefreshScope 注解:这是 Spring Cloud 提供的一个特殊 Bean 作用域。标记为 @RefreshScope 的 Bean 在启动时会被代理,当触发刷新操作时,这些 Bean 会重新初始化它们的状态,以反映最新的配置值,特别适用于那些需要根据最新配置立即做出反应的组件。

刷新机制:
• /actuator/refresh 端点:Spring Boot Actuator 提供了一个 /actuator/refresh 端点,允许用户手动触发配置的刷新操作。当发送 POST 请求到这个端点时,Spring Cloud 会扫描所有标注了 @RefreshScope 的 Bean,并重新加载它们的配置。
• Spring Cloud Bus:为了简化在微服务架构中广播配置变更通知的过程,可以使用 Spring Cloud Bus。它本质上是一个消息总线,可以用来传播状态变化(如配置更新)。通过向任意服务实例发送 /actuator/bus-refresh 请求,可以触发整个集群的服务配置更新,而不需要逐个调用每个服务的刷新端点。

动态刷新配置步骤:
• 客户端请求刷新:可以通过 HTTP POST 请求访问 /actuator/refresh 端点来手动触发刷新过程。
• 获取最新配置:一旦收到刷新请求,Spring Cloud Config Client 会尝试从 Config Server 获取最新的配置信息。
• 更新 Environment:获取到的新配置将被添加到现有的 Environment 中,覆盖旧的配置值。
• 重刷 @RefreshScope Beans:对于那些被 @RefreshScope 注解标记的 Bean,Spring 将重新初始化它们,使它们能够感知到最新的配置变化。
• @RefreshScope 是 Spring Cloud 中用于实现配置动态刷新的机制,其原理是通过创建一个代理对象来替代被标记为 @RefreshScope 的 Bean,并采用延迟初始化策略(即仅在首次访问时根据最新的配置信息创建并初始化该 Bean)。当配置发生变更并触发刷新操作时,Spring Cloud 会发布刷新事件,RefreshScope 捕获此事件后将相关 Bean 的缓存视为过期并清除;下次访问这些 Bean 时,系统基于更新后的配置重新创建和初始化它们,从而实现在不重启应用的情况下响应配置变化的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97756.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97756.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/97756.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot ioc 控制反转入门与实战

Spring Boot3 IOC 项目地址https://gitee.com/supervol/loong-springboot-study&#xff08;记得给个start&#xff0c;感谢&#xff09;IOC 概述在 Spring Boot 3 中&#xff0c;IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是核心思想之一&#xff…

LangGraph 重要注意事项和常见问题

01. 数据状态与归纳函数在前面的课时中&#xff0c;我们说过在 LangGraph 中 节点 在默认情况下返回的字典数据会将原始数据覆盖&#xff0c;例如下面的代码最终返回结果是 {"messages": [4]} 而不是 [1,2,3,4]&#xff0c;如下class MyState(TypedDict):messages: l…

避坑指南!解决Navicat运行SQL成功但没有表的问题

在运行转储的SQL文件时&#xff0c;成功运行&#xff0c;试了很多办法都不显示出表。原因&#xff1a;当从一个高版本的 MySQL 数据库导入数据到低版本的 MySQL 数据库时&#xff0c;可能会遇到兼容性问题。因为高版本的 MySQL 可能支持 utf8mb4_0900_ai_ci&#xff0c;而低版本…

在 Elasticsearch 中使用用户行为分析:使用 UBI 和 search-ui 创建一个应用程序

作者&#xff1a;来自 Elastic Eduard Martin 及 Alexander Dvila 通过一个实际示例学习如何在 Elasticsearch 中使用 UBI。我们将创建一个在搜索和点击结果时生成 UBI 事件的应用程序。 想要获得 Elastic 认证吗&#xff1f;看看下一次 Elasticsearch Engineer 培训什么时候开…

SpringBoot3中使用Caffeine缓存组件

SpringBoot3已经把EhCache从框架中删除了&#xff0c;SpringBoot3默认的缓存组件为Caffeine&#xff0c;那么我们在SpringBoot3中如何去使用它了&#xff1f; 1.添加依赖 <dependency><groupId>com.github.ben-manes.caffeine</groupId><artifactId>ca…

正则表达式与grep文本过滤详解

文章目录前言一、正则表达式概述1.1 定义1.2 主要用途1.3 Linux 中的正则表达式分类1.3.1 基础正则表达式&#xff08;BRE&#xff09;1.3.2 扩展正则表达式&#xff08;ERE&#xff09;二、正则表达式的基本组成2.1 普通字符2.2 元字符2.2.1 基本元字符2.2.2 重复次数相关2.2.…

Dify 集成 Milvus 配置指南

&#x1f9e9; Dify 集成 Milvus 配置指南 &#x1f527; 详细配置步骤 1. 环境准备与克隆仓库 首先确保你的系统已安装 Git、Docker 和 Docker Compose。然后克隆 Dify 的代码仓库&#xff1a; git clone https://github.com/langgenius/dify.git cd dify/docker2. 配置环境变…

为不平,不止于此

口碑可以成就一个人&#xff0c;也可以毁掉一个人&#xff0c; 所以我们选择用实力去创造两种无声的口碑。 要么让期待的你张口而呼&#xff0c; 要么让挑剔的你哑口无言。玛哈特科技创始人 #为不平&#xff0c;不止于此#

0902 C++类的匿名对象

Part 1.梳理思维导图一.匿名对象1.概念没有对象名的类对象2.格式类名();3.作用1.给有名对象初始化2.给对象数组初始化3.作为函数的参数传递给形参4.例子#include <iostream>using namespace std;class Dog {friend void Dogfriend(Dog &b); private:string name;int …

在 PySpark 中解锁窗口函数的力量,实现高级数据转换

本篇文章Mastering PySpark Window Functions: A Practical Guide to Time-Based Analytics适合数据分析和工程师入门了解PySpark的窗口函数。文章的亮点在于详细介绍了窗口函数的基本概念及其在销售数据分析中的实际应用&#xff0c;帮助读者理解如何进行复杂的数据计算而无需…

从理念到实践:三层解耦架构与“无系统”论

在上一篇中&#xff0c;我们揭示了“五层双闭环”治理模型如何像骨骼一样&#xff0c;为数字化转型提供支撑和定型。但再宏伟的蓝图也需要坚实的施工来实现。今天&#xff0c;我们将深入最具体的实施层面&#xff0c;将“业务重塑”和“以人为本”的理念&#xff0c;转化为可落…

详细介绍Linux 内存管理struct page数据结构中的_count和_mapcount有什么区别?

在Linux内核的struct page中&#xff0c;_count&#xff08;或_refcount&#xff09;和_mapcount是两个关键的引用计数成员&#xff0c;它们各自承担不同的职责。以下是深度解析和代码案例&#xff1a;1. _count vs _mapcount 区别详解_count&#xff08;或_refcount&#xff0…

面阵 vs 线阵相机:怎么选不踩坑?选型公式直接套用

面阵vs线阵相机&#xff1a;怎么选不踩坑&#xff1f;选型公式直接套用&#x1f3af;面阵vs线阵相机怎么选不踩坑&#xff1f;&#x1f3af;一、面阵相机&#xff1a;工业检测的“万能选手”&#xff0c;拍全图靠它&#x1f3af;二、线阵相机&#xff1a;大视野/高精度的“专属…

Spring Security 如何使用@PreAuthorize注解

&#x1f9f1; 第一步&#xff1a;环境准备✅ 1. 创建数据库&#xff08;MySQL&#xff09;-- 创建数据库&#xff0c;使用 utf8mb4 字符集支持 emoji 和多语言 CREATE DATABASE security_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 使用该数据库 USE security…

JVM中产生OOM(内存溢出)的8种典型情况及解决方案

Java中的OutOfMemoryError&#xff08;OOM&#xff09;是当JVM内存不足时抛出的错误。本文将全面剖析JVM中产生OOM的各种情况&#xff0c;包括堆内存溢出、方法区溢出、栈溢出等&#xff0c;并提供详细的诊断方法和解决方案。 一、OOM基础概念 1.1 OOM错误类型 Java中的OOM是…

【IEEE出版、EI检索、往届会后3个月检索】第四届信号处理、计算机网络与通信国际学术会议(SPCNC 2025)

第四届信号处理、计算机网络与通信国际学术会议&#xff08;SPCNC 2025&#xff09;将于2025年12月5-7日于中国武汉召开&#xff08;线上同步&#xff09;。为本次会议旨在齐聚海内外信号处理、计算机网络与通信等计算机领域的专家学者&#xff0c;为相关领域研究和从业人员提供…

Spring boot注解介绍

1. Spring 核心注解Spring Boot 是基于 Spring 框架的&#xff0c;所以核心注解依然适用。✅ 常见核心注解Component表示一个通用组件&#xff0c;Spring 会自动扫描并注入到容器中。Component public class MyComponent {public void sayHello() {System.out.println("He…

撤销回退 情况⼆:已经 add ,但没有 commit

撤销回退 情况⼆&#xff1a;已经 add &#xff0c;但没有 commit add 后还是保存到了暂存区呢&#xff1f;怎么撤销呢&#xff1f; 1 # 向ReadMe中新增⼀⾏代码 2 hyb139-159-150-152:~/gitcode$ vim ReadMe 3 hyb139-159-150-152:~/gitcode$ cat ReadMe 4 hello bit 5 hell…

【Linux笔记】命令行与vim基础

一、Linux命令行基础 1. 基本语法命令空格参数&#xff08;可写可不写&#xff09;空格文件&#xff0c;文件夹&#xff08;可写可不写&#xff09;ls列出文件夹中的内容/opt 根目录下的opt文件夹ls-a all显示出所有文件以及隐藏文件/optls-a如果不写则输出一个点&#xff0c;当…

Redis 的整数集合:像分类收纳盒一样的整数专属存储

目录 一、先懂定位&#xff1a;为什么需要整数集合&#xff1f;&#xff08;衔接哈希表&#xff09; 二、整数集合的结构&#xff1a;像 “贴了规格标签的收纳盒” 1. encoding&#xff1a;收纳盒的 “规格标签”&#xff08;核心&#xff1a;决定格子大小&#xff09; 2. …