天天看點

微服務架構 | 2.1 使用 Spring Cloud Config 管理服務配置項

目錄

  • 前言
  • 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 為微服務架構中的微服務提供集中化的外部配置支援,配置伺服器為各個不同微服務應用的所有環境提供了一個中心化的外部配置;

特點:

  • 非分布式鍵值存儲;
  • 提供對 Spring 及非 Spring 服務的緊密內建;
  • 可以使用多個後端來存儲配置資料;
  • 易于搭建和部署使用;
  • 與 Spring Boot 緊密內建,可以使用注解完成配置;

  • server 端為分布式配置中心,是一個獨立的微服務應用;
  • client 端為分布式系統中的基礎設定或微服務應用,通過指定配置中心來管理相關的配置;

  • Spring Cloud Config 支援将配置存儲在:git、資料庫、svn 以及本地檔案;

  • dev:開發環境;
  • prd:實際環境;
  • test:測試環境;
  • 一般測試環境是實際環境的 copy;

  • 将維護環境的責任放在開發人員身上;

  • 集中管理配置檔案;
  • 不同環境不同配置,動态化的配置更新,分環境部署,如:dev/test/prod/beta/release;
  • 運作期間動态調整配置,不再需要在每個服務部署的機器上編寫配置檔案,服務會向配置中心統一拉取配置自己的資訊;
  • 當配置發生變動時,服務不需要重新開機即可感覺到配置的變化并應用新的配置;
  • 将配置資訊以REST接口的形式暴露;

<!--配置中心服務-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
           

resources 包下的 boostrap.yaml,為配置伺服器自己的配置檔案;
  • 應用程式配置檔案的命名約定是 應用程式名稱-環境名稱.yml;
    • 其中環境名稱可以是:dev(開發環境)、prd(實際環境) 、test(測試環境);
  • 需要啟動哪個環境的配置可以用

    profile

    屬性指定。沒有指定該屬性則預設加載

    application.yml

    檔案中的配置資料;

server:
  port: 8888 #Spring Cloud 配置伺服器将要監聽的端口
spring:
  application:
    name: xxx-config-server #服務的名稱
  profiles:
    active: native #用于存儲配置的後端存儲庫(檔案系統)
  cloud:
    config:
      server:
        native:
          search-locations: classpath:/config/ #【重要參數】配置檔案的存儲位置路徑
           

  • 需要事先在 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 #配置檔案目錄
           

@EnableConfigServer:表明該服務是個 config 配置伺服器;

@SpringBootApplication:表明是一個 Spring Boot 應用;

在本地 src/main/resources 資源目錄下建立一個名為 config 的包,包下的配置檔案為用戶端的配置檔案;
  • 這裡可以建立這些配置檔案:
    • xxx-client-dev.yml:下面第 3 點将用到的用戶端配置示例;
    • xxx-client-prd.yml
    • xxx-client-test.yml
  • 如下圖所示:
微服務架構 | 2.1 使用 Spring Cloud Config 管理服務配置項

<!--配置中心-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
           
  • 因為每個服務都會将相關配置放在配置伺服器裡,是以該依賴可以添加到父工程裡,表示公共依賴;

  • 在 boostrap.yml 下;
  • 還記得 《2. 服務配置管理》中的 boostrap.yml 的特點嗎?說的就是這裡。
    • 即:使用 Spring Cloud Config 配置中心時,需要在 bootstrap 配置檔案中添加連接配接到配置中心的配置屬性來加載外部配置中心的配置資訊;
    • 具體來說,指以下兩個屬性:
      • spring.application.name

        :指定了用戶端的名稱(xxx-client);
      • spring.profiles.active

        :指定了所需配置的環境(dev);
    • 由這兩個屬性即可找到配置伺服器 config 包下的 xxx-client-dev.yml 配置檔案;

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
           

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 點裡的下半部分,這裡省略
           

微服務架構 | 2.1 使用 Spring Cloud Config 管理服務配置項
  • 用戶端服務啟動後,用戶端通過 uri 或服務發現機制找到配置伺服器;
  • 配置伺服器根據用戶端的

    spring.application.name

    spring.profiles.active

    找到配置伺服器的 config 包下的配置檔案的 xxx-client-dev.yml;

  • Spring Boot Actuator 提供了一個 @RefreshScope 注解,允許開發團隊通路

    /refresh

    端點,強制 Spring Boot 應用程式重新讀取應用程式配置;
  • 該注解加在用戶端 client 的主程式類上;
@SpringBootApplication
@RefreshScope
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
           

  • 使用 Spring Cloud Bus 的推送機制,告訴所有用戶端有配置發生更改的消息。需要一個額外的中間件(如:RabbitMQ)運作,但 Consul 注冊中心不支援這種推送機制;
  • 使用 Spring Boot Actuator 提供的 @RefreshScope 注解;
  • 重新啟動所有伺服器或容器;

  • 該 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 以使用加密;

  • 需要始終将 ENCRYPT_KEY 環境變量設定為:

    export ENCRYPT_KEY=IMSYMMETRIC

  • 關于對稱密鑰,要注意以下兩點:
    • 對稱密鑰的長度應該是 12 個或更多個字元,最好是一個随機的字元集;
    • 不要丢失對稱密鑰。一旦使用加密密鑰加密某些東西,如果沒有對稱密鑰就無法解密;

  • 加密

    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 配置微服務以在用戶端使用加密》;

  • 配置 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 中定義擷取配置檔案的接口時,傳回的資料是加密的;

新人制作,如有錯誤,歡迎指出,感激不盡!

歡迎關注公衆号,會分享一些更日常的東西!

如需轉載,請标注出處!

微服務架構 | 2.1 使用 Spring Cloud Config 管理服務配置項