1. 程式人生 > 實用技巧 >使用 Spring Cloud Config 統一管理微服務配置

使用 Spring Cloud Config 統一管理微服務配置

使用 Spring Cloud Config 統一管理微服務配置

Spring Cloud Config 伺服器是一個統一管理分散式系統的配置中心。通過其中的應用和服務,可以部署、訪問和管理所有的執行時配置屬性項。Spring Config 伺服器也支援配置屬性的版本控制。

Spring Config 將屬性值儲存在一個有版本控制的倉庫中,如 Git 或 SVN。Git 庫可以是本地或者遠端的。

一、簡單使用

1、建立 Config Server

  • 建立新的 Spring 啟動專案,選擇 Config Server 和 Actuator。

  • 建立 Git 庫。

  • 修改 Spring 啟動專案的 application.properties 內容

    spring.application.name=configServer
    spring.cloud.config.server.git.uri=https://gitee.com/zolmk/train-ms-spring-config-server.git
    spring.cloud.config.server.git.username=username
    spring.cloud.config.server.git.password=password
    

    配置 Git Uri 和 使用者名稱、密碼。

  • 新增開啟服務註解

    @SpringBootApplication
    @EnableConfigServer
    public class ConfigserverApplication
    {
    
        public static void main (String[] args)
        {
            SpringApplication.run(ConfigserverApplication.class, args);
        }
    
    }
    
    
  • Spring Config 伺服器就配置完成,點選啟動就可以了。

2、建立 Config Client

  • 建立 Spring Cloud Config Client 應用

  • 在 pom.xml 中新增下列依賴

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-config-client</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    

    如果使用了最新版的 Spring Boot 則還需新增

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-bootstrap</artifactId>
    	<version>3.0.0-M5</version>
    </dependency>
    

    文章 《最新 SpringCould 專案使用 Config 配置中心》中有提到。

  • 配置 bootstrap.yml 檔案

    spring:
      application:
        name: user-register-server # 微服務名稱
      cloud:
        config:
          uri: localhost:port
          profile: ${spring.profiles.active}
          label: master
    
    
  • 啟動專案,即可從 Config Server 獲取 user-register-server-profile.yml 檔案

二、進階使用

1、不指定 Config Server Uri ,從註冊中心獲取 Config Server 資訊

這裡,只需要改變 bootstrap.yml 配置即可

spring:
  application:
    name: user-register-server
  cloud:
    config:
      discovery:
        enabled: true
        service-id: config-center-server
      profile: ${spring.profiles.active}
      label: master
eureka:
  client:
    service-url:
      defaultZone: http://zolmk:zolmk@${client.desktop}:8761/eureka/,http://zolmk:zolmk@${client.desktop}:8762/eureka/
    register-with-eureka: true
    fetch-registry: true
  instance:
    prefer-ip-address: true
client:
  desktop: 192.168.1.9
  notebook: eureka-node-a

2、Config Server 的 Git 倉庫配置詳解

1)佔位符支援

Config Server 支援的佔位符有 {application}、{profile} 和 {label}。

示例:

server:
	port: 8080
spring:
	application:
		name: microservice
	cloud:
		config:
			server:
				git:
					uri: https://git.net/zolmk/{application}

2)模式匹配

模式匹配指的是帶有萬用字元 {application}/{profile} 名稱的列表。如果 {application}/{profile} 不匹配任何模式,它將會使用 spring.cloud.config.server.git.uri 定義的 URI。

通過 pattern 來指定匹配 {application}/{profile}

spring:
	cloud:
		server:
			git:
				uri: uri
				repos:
					simple: https://simple/config-repo
					special:
						pattern: special*/dev*,*special*/dev*
						uri: https://github.com/special/config-repo
					local:
						pattern: local*
						uri: file:/home/configsvc/config-repo

simple 倉庫未指定 pattern,uri 預設為 simple 後面的欄位,simple 只會匹配所有配置檔案中名為 simple 的應用程式。

Config Server 可以通過該方式指定多個 git 倉庫,並且支援為每個倉庫定義各自的訪問規則。

3)搜尋目錄

可以通過指定 search-path 來指定 搜尋目錄,search-path 支援佔位符

server:
  port: 8793
spring:
  application:
    name: config-center-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/zolmk/spring-cloud-learn-config-server.git
          username: zolmk
          password: password
          skip-ssl-validation: true
          default-label: master
          search-paths: config/**
          clone-on-start: true

search-paths 可以指定多個目錄,config/** 表示搜尋 config 目錄下的所有子目錄,config/foo* 表示搜尋 config 目錄下以 foo 開頭的所有子目錄。

4)啟動時載入配置檔案

通過配置 spring.cloud.config.server.git.clone-on-start=truespring.cloud.config.server.git.repos.team-a.clone-on-start=true

3、配置內容的加解密

這部分需配置在 bootstrap.yml 中(Spring Boot 版本 2.4.0)

1)準備工作

Config Server 的加解密功能依賴 Java Cryptography Extension ( JCE )。所以我們首先需要為 JDK 安裝 JCE。

2) 對稱加密

  • 配置 bootstrap.yml

    encrypt:
    	key: key
    
  • 使用 POST 工具 post 加密內容到 localhost:port/encrypt,即可得到加密後的資料,這裡的加密內容要放到 body 內

  • 使用 POST 工具 post 解密內容到localhost:port/decrypt,即可得到解密後的資料,這裡的解密內容要放到 body 內

  • 使用在 config server 中,先用 localhost:port/encrypt 介面得到需要 加密的字串內容,然後將配置檔案中的文字進行替換,如下

    spring:
    	datasource:
    		username: dbuser
    		password: '{cipher}加密後的內容'
    

    spring.datasource.password 這裡的 {cipher} 是一個標記符,用來標記該欄位是否已加密。

    aplication.properties 中的寫法如下:

    spring.datasource.username=dbuser
    spring.datasource.password={cipher}加密後的內容
    

3)非對稱加密

  • 先使用 keytool 生成一個金鑰對,具體方法在https://www.cnblogs.com/zolmk/p/14101544.html

  • 將生成的 *.jks 檔案複製到專案的 classpath 下

  • 在 bootstrap.yml 中新增如下內容

    encrypt:
      key-store:
        alias: config-server-key # alias
        location: classpath:config-server-key.jks # jks classpath:filename.jks
        password: password # storepass
        secret: comzolmk # keypass
    
  • 接下來的方法和上小結對稱加密方法一致

4、重新整理配置

使用 /refresh 端點手動重新整理配置