[TOC]
> 在分布式微服務架構中,由于服務數量很多 ,使得有很多配置文件,在更新配置文件時很麻煩。
每個微服務自已帶著一個 application.yml,上百個配置文件的管理起來就很麻煩,所以一套集**中式的、動態的配置管理功能**是必不可少的,在Spring Cloud中,有分布式配置中心組件Spring Cloud Config來解決這個問題
## **1. 什么是Spring Cloud Config**
Spring Cloud Config 為微服務架構中的微服務提供 **集中式的外部配置支持**, 配置服務器為各個不同微服務應用的所有環境提供了一個中心化的外部配置。

### 1.1 **Spring Cloud Config 分為服務端與客戶端兩個部分**
* **服務端 config server**
也稱為分布式配置中心,它是一個獨立的微服務應用,用來連接配置服務器并為客戶端提供獲**取配置信息,加密、解密信息等訪問接口.**
**配置服務器**官方推薦采用 Git 來存儲配置信息,這樣就有助于對環境配置進行版本管理,并且可通過Git客戶端工具來方便的管理與訪問配置信息。
* **客戶端 config client**
通過指定的服務端來管理服務的資源,以及與業務相關的配置內容,并在啟動的時候從服務端獲取和加載配置信息。
* 作用
1. 集中管理配置文件
2. 不同環境不同配置,動態化的配置更新,根據不同環境部署,如 dev/test/prod運行期間動態調整配置,不再需要在每個服務部署的機器上編寫配置,服務會向配置中心統一拉取自已的配置信息
3. 當配置發生變動時,服務不需要重啟即可感知到配置的變化并使用修改后的配置信息
4. 將配置信息以REST接口的形式暴露
## **2. Spring Cloud Config 服務端配置**
### **2.1 創建配置文件與提交Github**
**1. 登錄 GitHub,新建一個 microservice-cloud-config 倉庫**


**2. 克隆遠程倉庫到本地**
git clone https://github.com/dailinlernhard/microservice-cloud-config.git

**3. 在 D:\\gitStudy\\SpringCloud\\microservice-cloud-config 中,新建一個 microservice\-config\-application.yml配置文件**
```
#注意:如果在記事本上編寫,下面的縮進不要使用Tab來縮進,不然報錯
spring:
profiles:
active: dev # 激活開發環境配置
---
server:
port: 4001 #端口號
spring:
profiles: dev # 開發環境
application:
name: microservice-config-dev
---
server:
port: 4002 #端口號
spring:
profiles: prod # 生產環境
application:
name: microservice-config-prod
```
**4. 將 application.yml 推送到 github 遠程庫**
```
$ cd microservice-cloud-config
# 添加到暫存區
$ git add microservice-config-application.yml
# 提交到本地庫
$ git commit -m "first commit" microservice-config-application.yml
# 推送到遠程庫origin 的 master 主分支上
$ git push origin master
```
提交上去了

### **2.2 新建Config服務端模塊(配置中心)**
**1. 創建 microservice-cloud-config模塊**

**2. 修改pom文件,加入confia server依賴**
```
<!-- Spring Cloud Config配置中心依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
```
**3. 配置 application.yml 文件**
配置 遠程倉庫git地址
~~~
server:
port: 5001
spring:
application:
name: microservice-config
cloud:
config:
server:
git: # 遠程庫的git地址
uri: https://github.com/dailinlernhard/microservice-cloud-config.git
~~~
**4. 創建啟動類與添加注解 @EnableConfigServer**
~~~
package com.tuna.springcloud.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@EnableConfigServer
@SpringBootApplication
public class ConfigServer_5001 {
public static void main(String[] args) {
SpringApplication.run(ConfigServer_5001.class, args);
}
}
~~~
**5. 配置讀取規則**
* `/{application}-{profile}.yml
`
/讀取的配置文件名-環境配置項 (默認為master分支)
如:`http://localhost:5001/microservice-config-application-dev.yml
`
* `/{application}/{profile}[/{label}]
`
/讀取的配置文件名/環境配置項/分支名
如:`http://localhost:5001/microservice-config-application/dev/master
`
* `/{label}/{application}-{profile}.yml
`
/分支名/讀取的配置文件名/環境配置項
如:`http://localhost:5001/master/microservice-config-application-dev.yml`
***測試讀取配置文件***
[http://localhost:5001/microservice-config-application-dev.yml](http://localhost:5001/microservice-config-application-dev.yml)
表示讀取文件名microservice-config-application.yml文件,并且是profile是Dev的部分

讀取profile=prod的配置文件

## **3. Spring Cloud Config 客戶端服務**
### **1. 新建Config客戶端模塊**
創建模塊:microservice-cloud-config-client

### **2. 配置 pom.xml 文件**
```
<dependencies>
<!-- Spring Cloud Config 客戶端依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
```
### **3 .配置 bootstrap.yml**
* application.yml 是用戶級別的配置項
* bootstrap.yml 是系統級別的配置項,優先級更高
* bootstrap.yml?先于 application.yml 加載
> 在類路徑resources下創建 bootstrap.yml 配置文件,內容如下:
~~~
spring:
cloud:
config:
name: microservice-config-application #github上的配置文件名稱,注意沒有yml后綴名
profile: dev #本次訪問的環境配置項
label: master #遠程庫的分支名
uri: http://localhost:5001 #Config配置中心地址,通過它獲取microservice-config-application.yml配置信息
~~~
### **4. 配置 application.yml**
在類路徑 resources 下創建 application.yml,內容如下:
~~~
server:
port: 8080
spring:
application:
name: microservice-config-client
~~~
### **5. ConfigClient 類,通過Rest方式驗證是否能夠讀取到 GitHub 上的配置信息**
在bean中,通過@Value("key值") 綁定 GitHub 中對應配置中的key所對應的value值。
~~~
@RestController
public class ConfigClient {
@Value("${server.port}") //綁定值
private String port;
@Value("${spring.application.name}") //綁定值
private String applicationName;
@GetMapping("/config")
public String config() {
String content = "applicationName: " + applicationName + ", port: " + port;
System.out.println(content);
return content;
}
}
~~~
### **6. 創建啟動類**
~~~
@SpringBootApplication
public class ConfigClient_8080 {
public static void main(String[] args) {
SpringApplication.run(ConfigClient_8080.class, args);
}
}
~~~
### **7. 測試:**

* **client端口是8080為啥訪問不到?**
右下圖可以看去,雖然application.yml配置的端口是8080,但是從日志啟動來看,占用的卻是4001端口

造成上邊的原因是在client端**bootstrap.yml**配置文件讀取了`http://localhost:5001`的profile=Dev的microservice-config-application配置文件配置,**也就是git上的dev部分配置文件!**
```
spring:
cloud:
config:
name: microservice-config-application #github上的配置文件名稱,注意沒有yml后綴名
profile: dev #本次訪問的環境配置項
label: master #遠程庫的分支名
uri: http://localhost:5001 #Config配置中心地址,通過它獲取microservice-config-application.yml配置信息
```

所以訪問4001可以的

說明正確的讀取到了git上的配置
**如果bootstrap.yml修改成prod**

* **如圖訪問4002(因為git上的配置文件prod部分端口就是4002)**

- springcloud
- springcloud的作用
- springboot服務提供者和消費者
- Eureka
- ribbon
- Feign
- feign在微服務中的使用
- feign充當http請求工具
- Hystrix 熔斷器
- Zuul 路由網關
- Spring Cloud Config 分布式配置中心
- config介紹與配置
- Spring Cloud Config 配置實戰
- Spring Cloud Bus
- gateway
- 概念講解
- 實例
- GateWay
- 統一日志追蹤
- 分布式鎖
- 1.redis
- springcloud Alibaba
- 1. Nacos
- 1.1 安裝
- 1.2 特性
- 1.3 實例
- 1. 整合nacos服務發現
- 2. 整合nacos配置功能
- 1.4 生產部署方案
- 環境隔離
- 原理講解
- 1. 服務發現
- 2. sentinel
- 3. Seata事務
- CAP理論
- 3.1 安裝
- 分布式協議
- 4.熔斷和降級
- springcloud與alibba
- oauth
- 1. abstract
- 2. oauth2 in micro-service
- 微服務框架付費
- SkyWalking
- 介紹與相關資料
- APM系統簡單對比(zipkin,pinpoint和skywalking)
- server安裝部署
- agent安裝
- 日志清理
- 統一日志中心
- docker安裝部署
- 安裝部署
- elasticsearch 7.x
- logstash 7.x
- kibana 7.x
- ES索引管理
- 定時清理數據
- index Lifecycle Management
- 沒數據排查思路
- ELK自身組件監控
- 多租戶方案
- 慢查詢sql
- 日志審計
- 開發
- 登錄認證
- 鏈路追蹤
- elk
- Filebeat
- Filebeat基礎
- Filebeat安裝部署
- 多行消息Multiline
- how Filebeat works
- Logstash
- 安裝
- rpm安裝
- docker安裝Logstash
- grok調試
- Grok語法調試
- Grok常用表達式
- 配置中常見判斷
- filter提取器
- elasticsearch
- 安裝
- rpm安裝
- docker安裝es
- 使用
- 概念
- 基礎
- 中文分詞
- 統計
- 排序
- 倒排與正排索引
- 自定義dynamic
- 練習
- nested object
- 父子關系模型
- 高亮
- 搜索提示
- kibana
- 安裝
- docker安裝
- rpm安裝
- 整合
- 收集日志
- 慢sql
- 日志審計s
- 云
- 分布式架構
- 分布式鎖
- Redis實現
- redisson
- 熔斷和降級