Spring Cloud Config 核心原理

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. …