SpringCloud之Config
推薦網站:https://www.springcloud.cc/spring-cloud-dalston.html#_spring_cloud_config
1. 什么是 Spring Cloud Config
Spring Cloud Config 是 Spring 官方提供的 分布式配置中心 組件,用來 集中管理、動態下發、版本控制 所有微服務的配置文件,支持 Git、文件系統、Vault(什么是Vault ?) 等多種后端存儲。
2. 核心作用
.
痛點 | 沒有 Config 的情況 | 有 Config 的解決方式 |
---|---|---|
配置分散 | 每個微服務自己維護 application.yml ,修改要重啟所有服務 | 集中存儲(Git),一處修改,全部生效 |
環境差異 | 開發、測試、生產配置混雜,容易出錯 | 多環境隔離(application-dev.yml 、application-prod.yml ) |
敏感信息 | 數據庫密碼明文寫在代碼里 | 加密存儲(對稱/非對稱加密,集成 Vault) |
動態刷新 | 修改配置必須重啟服務 | @RefreshScope 實現 熱更新(無需重啟) |
版本回滾 | 配置改錯了無法回退 | Git 版本控制,一鍵回滾 |
3. 工作流程
工作流程(標準模式):
- 開發者將配置文件上傳到 Git 倉庫(如 GitHub、GitLab)。
- Config Server 啟動后連接 Git 倉庫,將配置緩存到本地。
- 微服務(Config Client)啟動時,通過 HTTP 請求 Config Server 拉取配置。
- 支持動態刷新:通過 POST /actuator/refresh 或 Spring Cloud Bus + MQ(如 RabbitMQ/Kafka)實現批量刷新
架構圖:
┌────────────────────────────────────────────┐
│ Git 倉庫(遠程) │
│ application.yml │
│ application-dev.yml │
│ application-prod.yml │
└─────────────┬──────────────────────────────┘│ 1. 拉取配置▼
┌────────────────────────────────────────────┐
│ Config Server(配置中心) │
│ - 暴露 REST API │
│ - 支持 Git、本地文件、數據庫等存儲 │
│ - 支持加密/解密 │
└─────────────┬──────────────────────────────┘│ 2. HTTP 拉取配置▼
┌────────────────────────────────────────────┐
│ Config Client(微服務) │
│ - 啟動時從 Config Server 獲取配置 │
│ - 支持 @RefreshScope 熱刷新 │
│ - 可注冊到 Eureka/Nacos 等服務發現 │
└────────────────────────────────────────────┘
4. 代碼示例(模擬3中的架構流程:client -> server -> gitee)
(1)先在遠程倉庫建立配置文件
這里使用gitee倉庫,一樣可以支持:
遠程倉庫具體配置代碼,我們配置兩套信息,dev, test, 僅供參考:
spring:profiles: active: dev
---
server:port: 8201spring:profiles: devapplication:name: springcloud-config-deveureka:client:server-url:defaultZone: http://localhost:7001/eureka
---
server:port: 8202spring:profiles: testapplication:name: springcloud-config-testeureka:client:server-url:defaultZone: http://localhost:7001/eureka
(2) 創建config-server服務
使用config-server服務連接遠程倉庫:
- 創建config-server服務模塊,導入pom依賴:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.5.RELEASE</version></dependency><!--config--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId><version>2.1.1.RELEASE</version></dependency>
- 對應resources目錄下編寫yml文件:
server:port: 9001
spring:application:name: springcloud-config-server# 連接遠程倉庫cloud:config:server:git:# 注意是https的而不是sshuri: https://gitee.com/LiDaBao0829/test123.git# 通過 config-server可以連接到gitee,去訪問剛才的資源配置
- 添加主啟動類
@SpringBootApplication
@EnableConfigServer
public class ConfigServer_9001 {public static void main(String[] args) {SpringApplication.run(ConfigServer_9001.class, args);}
}
(3)創建config-client服務
使用config-client服務去連接調用config-server服務,獲取遠程倉庫配置信息
- 創建config-client模塊,導入pom依賴:
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId><version>2.1.1.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><version>2.3.5.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.5.RELEASE</version></dependency></dependencies>
- 對應resources下創建 application.yml 和 bootstrap.yml 配置文件:
注:優先級:遠程配置 > 本地 bootstrap.yml > application.yml
bootstrap.yml :
# 系統級別的配置
spring:cloud:config:name: config-client # 對應gitee上需要讀取的資源名稱,不要后綴profile: test #讀取哪個環境,這里選擇testlabel: master #遠程倉庫分支uri: http://localhost:9001 #讀取配置的路徑,這里選擇我們的config-server模塊地址
application.yml:
# 用戶級別的配置
spring:application:name: springcloud-config-client
- 創建一個controller類,用于測試我們獲取到的配置信息:
@RestController
public class ConfigClientController {//獲取微服務名稱@Value("${spring.application.name}")private String applicationName;//獲取Eureka服務@Value("${eureka.client.server-url.defaultZone}")private String eurekaServer;//獲取服務端的端口號@Value("${server.port}")private String port;@RequestMapping("/config")public String getConfig(){return "applicationName: " + applicationName + "\n"+ " eurekaServer: " + eurekaServer + "\n"+ " port:" + port;}
- 創建主啟動類:
@SpringBootApplication
public class ConfigClient {public static void main(String[] args) {SpringApplication.run(ConfigClient.class, args);}
}
(4)調用測試
先啟動 config-server 服務,再啟動 config-client 服務,訪問 config-client 服務的 getConfig 接口,測試是否可以獲取到遠程配置信息,我們在 config-client服務 中的 bootstrap.yml 配置的是獲取 test 環境,期望結果是獲取到對應遠程倉庫的test配置信息。
測試結果:
成功!
5. 總結
Spring Cloud Config = 遠程倉庫 + Config Server(服務端)+ Config Client(客戶端),實現集中管理、版本控制、動態刷新的微服務配置中心。