目錄
- 前言
- 1. Spring Cloud Config 基礎知識點
- 1.1 特點與優缺點
- 1.2 config 的 server 端和 client 端
- 1.3 配置存盤
- 1.4 常用的三種環境配置名稱
- 1.5 使用本地檔案存盤配置的弊端
- 1.6 Spring Cloud Config 的作用
- 2. 配置服務器的示例
- 2.1 引入 pom.xml 依賴檔案
- 2.2 修改 boostrap.yaml 組態檔
- 2.2.1 在本地檔案進行配置
- 2.2.2 在 git 上進行配置
- 2.3 在主程式類上標注注解
- 2.4 撰寫客戶端的組態檔
- 3. 客戶端獲取服務端配置示例
- 3.1 引入 pom.xml 依賴
- 3.2 修改 boostrap.yml 組態檔
- 3.2.1 服務器使用本地檔案方式存盤配置
- 3.2.2 服務器使用 git 方式存盤配置
- 3.3 客戶端獲取服務端配置的流程
- 3.3.1 本地配置的讀取流程
- 4. 動態重繪服務的配置
- 4.1 使用 @RefreshScope 注解
- 4.2 重繪微服務配置的幾種方式
- 5. 使用 Spring Cloud Config 加密敏感配置資訊
- 5.1 下載并安裝加密所需的 Oracle JCE jar
- 5.2 創建加密密鑰
- 5.3 加密和解密屬性
- 5.4 配置微服務以在客戶端使用加密
- 最后
前言
參考資料:
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服務原理與實戰》
《B站 尚硅谷 SpringCloud 框架開發教程 周陽》
SpringCloud Config 為微服務架構中的微服務提供集中化的外部配置支持,配置服務器為各個不同微服務應用的所有環境提供了一個中心化的外部配置;
1. Spring Cloud Config 基礎知識點
1.1 特點與優缺點
特點:
- 非分布式鍵值存盤;
- 提供對 Spring 及非 Spring 服務的緊密集成;
- 可以使用多個后端來存盤配置資料;
- 易于搭建和部署使用;
- 與 Spring Boot 緊密集成,可以使用注解完成配置;
1.2 config 的 server 端和 client 端
- server 端為分布式配置中心,是一個獨立的微服務應用;
- client 端為分布式系統中的基礎設定或微服務應用,通過指定配置中心來管理相關的配置;
1.3 配置存盤
- Spring Cloud Config 支持將配置存盤在:git、資料庫、svn 以及本地檔案;
1.4 常用的三種環境配置名稱
- dev:開發環境;
- prd:實際環境;
- test:測驗環境;
- 一般測驗環境是實際環境的 copy;
1.5 使用本地檔案存盤配置的弊端
- 將維護環境的責任放在開發人員身上;
1.6 Spring Cloud Config 的作用
- 集中管理組態檔;
- 不同環境不同配置,動態化的配置更新,分環境部署,如:dev/test/prod/beta/release;
- 運行期間動態調整配置,不再需要在每個服務部署的機器上撰寫組態檔,服務會向配置中心統一拉取配置自己的資訊;
- 當配置發生變動時,服務不需要重啟即可感知到配置的變化并應用新的配置;
- 將配置資訊以REST介面的形式暴露;
2. 配置服務器的示例
2.1 引入 pom.xml 依賴檔案
<!--配置中心服務-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
2.2 修改 boostrap.yaml 組態檔
resources 包下的 boostrap.yaml,為配置服務器自己的組態檔;
- 應用程式組態檔的命名約定是 應用程式名稱-環境名稱.yml;
- 其中環境名稱可以是:dev(開發環境)、prd(實際環境) 、test(測驗環境);
- 需要啟動哪個環境的配置可以用
profile屬性指定,沒有指定該屬性則默認加載application.yml檔案中的配置資料;
2.2.1 在本地檔案進行配置
server:
port: 8888 #Spring Cloud 配置服務器將要監聽的埠
spring:
application:
name: xxx-config-server #服務的名稱
profiles:
active: native #用于存盤配置的后端存盤庫(檔案系統)
cloud:
config:
server:
native:
search-locations: classpath:/config/ #【重要引數】組態檔的存盤位置路徑
2.2.2 在 git 上進行配置
- 需要事先在 github 或 gitee 等 git 工具上建立相應的的配置中心倉庫,一個簡單示例:https://gitee.com/dlhjw/config-demo;
- 其實就是把本地檔案的 config 包及包下配置放在 git 倉庫里;
server:
port: 8888 #Spring Cloud 配置服務器將要監聽的埠
spring:
application:
name: xxx-config-server #服務的名稱
cloud:
config:
server:
#使用 git 作為后端存盤庫
git:
uri: https://gitee.com/dlhjw/config-demo #組態檔所在倉庫
username: git 賬號
password: git 密碼
default-label: master #組態檔分支
search-paths: config #組態檔所在根目錄
force-pull: true #組態檔目錄
2.3 在主程式類上標注注解
@EnableConfigServer:表明該服務是個 config 配置服務器;
@SpringBootApplication:表明是一個 Spring Boot 應用;
2.4 撰寫客戶端的組態檔
在本地 src/main/resources 資源目錄下新建一個名為 config 的包,包下的組態檔為客戶端的組態檔;
-
這里可以新建這些組態檔:
- xxx-client-dev.yml:下面第 3 點將用到的客戶端配置示例;
- xxx-client-prd.yml
- xxx-client-test.yml
-
如下圖所示:

3. 客戶端獲取服務端配置示例
3.1 引入 pom.xml 依賴
<!--配置中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- 因為每個服務都會將相關配置放在配置服務器里,因此該依賴可以添加到父工程里,表示公共依賴;
3.2 修改 boostrap.yml 組態檔
- 在 boostrap.yml 下;
- 還記得 《2. 服務配置管理》中的 boostrap.yml 的特點嗎?說的就是這里,
- 即:使用 Spring Cloud Config 配置中心時,需要在 bootstrap 組態檔中添加連接到配置中心的配置屬性來加載外部配置中心的配置資訊;
- 具體來說,指以下兩個屬性:
spring.application.name:指定了客戶端的名稱(xxx-client);spring.profiles.active:指定了所需配置的環境(dev);
- 由這兩個屬性即可找到配置服務器 config 包下的 xxx-client-dev.yml 組態檔;
3.2.1 服務器使用本地檔案方式存盤配置
spring:
application:
name: xxx-client #客戶端,使用服務器里的配置
profiles:
active: dev #指定當前環境為開發環境
cloud:
config:
fail-fast: true
#通過 uri 方式獲取 config 配置服務器的位置
#uri: http://localhost:8888
discovery:
service-id: xxx-config-server #通過服務發現的方式獲取 config 配置服務器
enabled: true
profile: ${spring.profiles.active} #用于定位配置資訊,使用上面 spring.profiles.active 屬性的值 dev
label: ${spring.profiles.active} #本地存盤,該引數無用
---
spring:
profiles: dev
eureka:
instance:
prefer-ip-address: true
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 20
metadata-map:
version: v1.0
client:
serviceUrl:
defaultZone: http://localhost:1025/eureka
registry-fetch-interval-seconds: 10
---
spring:
profiles: prd
eureka:
instance:
prefer-ip-address: true
metadata-map:
version: v1.0
client:
serviceUrl:
defaultZone: http://{實際環境地址}:1025/eureka
3.2.2 服務器使用 git 方式存盤配置
spring:
application:
name: xxx-client #客戶端,使用服務器里的配置
profiles:
active: dev #指定當前環境為 dev 開發環境
cloud:
config:
fail-fast: true
#通過 uri 方式獲取 config 配置服務器的位置
uri: http://localhost:8888 #這里也可以使用服務發現機制
profile: ${spring.profiles.active} #用于定位配置資訊,使用上面 spring.profiles.active 屬性的值 dev
label: master #對應 git 的分支
---
# 下同上 3.2.1 點里的下半部分,這里省略
3.3 客戶端獲取服務端配置的流程
3.3.1 本地配置的讀取流程

- 客戶端服務啟動后,客戶端通過 uri 或服務發現機制找到配置服務器;
- 配置服務器根據客戶端的
spring.application.name與spring.profiles.active找到配置服務器的 config 包下的組態檔的 xxx-client-dev.yml;
4. 動態重繪服務的配置
4.1 使用 @RefreshScope 注解
- Spring Boot Actuator 提供了一個 @RefreshScope 注解,允許開發團隊訪問
/refresh端點,強制 Spring Boot 應用程式重新讀取應用程式配置; - 該注解加在客戶端 client 的主程式類上;
@SpringBootApplication
@RefreshScope
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
4.2 重繪微服務配置的幾種方式
- 使用 Spring Cloud Bus 的推送機制,告訴所有客戶端有配置發生更改的訊息,需要一個額外的中間件(如:RabbitMQ)運行,但 Consul 注冊中心不支持這種推送機制;
- 使用 Spring Boot Actuator 提供的 @RefreshScope 注解;
- 重新啟動所有服務器或容器;
5. 使用 Spring Cloud Config 加密敏感配置資訊
5.1 下載并安裝加密所需的 Oracle JCE jar
- 該 jar 包無法通過 Maven下載,必須從 Oracle 公司下載;
- 下載包含 JCE jar 的 zip檔案后,必須執行以下操作:
- 切換到
$JAVA_HOME/jre/lib/security檔案夾; - 將
$JAVA_HOME/jre/lib/security目錄中的 local_policy.jar 和 US_export_policy.jar 檔案備份到其他位置; - 解壓從 Oracle下載的 JCE zip檔案;
- 將 local_policy.jar 和 US_export _policy.jar 復制到
$JAVA_HOME/jre/lib/security目錄中; - 配置 Spring Cloud Config 以使用加密;
- 切換到
5.2 創建加密密鑰
- 需要始終將 ENCRYPT_KEY 環境變數設定為:
export ENCRYPT_KEY=IMSYMMETRIC; - 關于對稱密鑰,要注意以下兩點:
- 對稱密鑰的長度應該是 12 個或更多個字符,最好是一個隨機的字符集;
- 不要丟失對稱密鑰,一旦使用加密密鑰加密某些東西,如果沒有對稱密鑰就無法解密;
5.3 加密和解密屬性
- 加密
encrypt:- 使用 POST 請求發送:http://localhost:8888/encrypt,訊息體為需要加密的值 x,即可得到加密后的結果 result;
- 解密
decrypt:- 使用 POST 請求發送:http://localhost:8888/decrypt,訊息體為需要解密的值 result,即可得到解密后的結果 x;
- 使用在組態檔中替換 x 即可使用加密值:
spring.database.password:"{cipher}result";
- 默認情況下:在完成上述操作后,組態檔得到加密,但可以在配置服務器的 controller 中定義獲取組態檔的介面,該介面回傳的是經過加密、解密后的資料;
- 因此,需要《5.4 配置微服務以在客戶端使用加密》;
5.4 配置微服務以在客戶端使用加密
-
配置 Spring Cloud Config 不要在服務器端解密屬性;
spring.cloud.config.server.encrypt.enabled=false- 在客戶端服務器上設定對稱密鑰;
- 將
spring-security-rsa JAR添加到客戶端服務的pom.xml檔案中;
<dependency> <groupld>org.springframework.security</groupld> <artifactld>spring-security-rsa</artifactld> </dependency> -
這樣,呼叫配置服務器的 controller 中定義獲取組態檔的介面時,回傳的資料是加密的;
最后

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/413117.html
標籤:架構設計
下一篇:服務探活的五種方式
