分佈式配置中心:Spring Cloud Config

構建配置中心

  • 建立一個基礎Spring Boot工程,命名爲config-server,並在pom.xml中引入如下依賴:
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
  • 在程序主類中添加@EnableConfigServer註解
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}
  • 在application.properties文件中添加配置服務的基本信息和git倉庫的相關信息
spring.application.name=config-server
server.port=7001
#git路徑,精確到具體倉庫位置
spring.cloud.config.server.git.uri=https://gitee.com/dongspace/config-file/
#git uri下的相對搜索位置,能夠配置多個,以","分隔
spring.cloud.config.server.git.search-paths=config-client,demo
spring.cloud.config.server.git.username=***
spring.cloud.config.server.git.password=***

Git配置倉庫

  • 新建一個倉庫,命名爲config-file
  • 新建兩個文件夾,分別命名爲config-client和demo
  • 在config-client下新建配置文件application.properties、application-stg1.properties,並添加以下配置java

    from=master
    #stg1中的配置
    from=master-stg1
  • 在demo文件夾下新建dongspace.properties、dongspace-stg1.properties,並添加以下配置git

    from=dong-master
    #stg1中的配置
    from=dong-master-stg1

配置規則詳解

配置信息的URL與配置文件的映射關係以下:spring

  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties
  • /{application}/{profile}/[/{label}]

上面的URL對應{application}-{profile}.properties,其中{application}對應配置文件名,{label}對應代碼分支,默認爲default
以上經過瀏覽器訪問的路徑對應爲:bootstrap

客戶端配置

  • 建立一個基礎Spring Boot工程,命名爲config-client,並在pom.xml中引入如下依賴:
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
  • 在bootstrap.properties中加入如下配置:
server.port=7002
spring.application.name=config-client
spring.cloud.config.profile=stg1
spring.cloud.config.label=master
spring.cloud.config.uri=http://localhost:7001/
  • 建立一個測試類
@RestController
public class TestConfigController {

    @Value("${from}")
    private String from;
    
    @RequestMapping("/testConfig")
    public Object testConfig() {
        return from;
    }
}

服務端的佔位符配置

實現多個服務對應一個倉庫中的不一樣目錄瀏覽器

spring.cloud.config.server.git.uri=https://gitee.com/dongspace/config-file/
#{application}對應訪問服務的應用名
spring.cloud.config.server.git.search-paths={application}

實現一個服務對應目錄下的一個倉庫安全

spring.cloud.config.server.git.uri=https://gitee.com/dongspace/{application}-conf

基礎架構

config-server架構圖

客戶端應用從config-server中獲取配置信息聽從下面的執行流程:網絡

  1. 應用啓動時,根據bootstrap.properties中配置的{application}、{profile}、{label},向Config Server請求獲取配置信息。
  2. Config Server根據本身維護的Git倉庫信息和客戶端傳遞過來的配置定位信息去查找配置信息。
  3. 經過git clone命令將找到的配置信息下載到Config Server的文件系統中。
  4. Config Server建立Spring的ApplicationContext實例,並從Git本地倉庫中加載配置文件,返回給客戶端使用。
  5. 客戶端應用得到外部配置信息後,加載到客戶端的ApplicationContext實例。該配置內容的優先級高於Jar包內部的配置內容,在jar包中重複的內容將不會被加載。

健康監測

當使用佔位符配置URI時,Config Server會默認加載application爲app的倉庫,根據以前的配置規則,服務端的健康檢測器會不斷檢查https://gitee.com/dongspace/a... 倉庫是否能夠連通,這時訪問配置中心的/health端點時返回的服務狀態爲"DOWN",當服務化配置中心時,將影響它的可用性判斷,此時有兩種解決方案:1.建立名爲app-config的倉庫;2.改變健康監測的配置以下架構

spring.cloud.config.server.health.repositories.check.name=app2
spring.cloud.config.server.health.repositories.check.label=master
spring.cloud.config.server.health.repositories.check.profiles=default

服務化配置中心

config-server改造

在pom.xml文件中添加eureka依賴,以加入Eureka的服務治理體系。app

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

在入口類上添加@EnableDiscoveryClient註解,表示這是一個Eureka客戶端。ide

@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
public class ConfigServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

在application.properties中配置eureka註冊中心地址。

spring.application.name=config-server
server.port=7001
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/

#spring.cloud.config.server.git.uri=https://gitee.com/dongspace/{application}-conf
spring.cloud.config.server.git.uri=https://gitee.com/dongspace/config-file/
#git uri下的相對搜索位置,能夠配置多個
spring.cloud.config.server.git.search-paths={application}
spring.cloud.config.server.git.username=416974870@qq.com
spring.cloud.config.server.git.password=a1991122911
# 從新設定git倉庫鏈接性檢測的地址,需新建命名爲app2的倉庫
#spring.cloud.config.server.health.repositories.check.name=app2
#spring.cloud.config.server.health.repositories.check.label=master
#spring.cloud.config.server.health.repositories.check.profiles=default

config-client改造

前兩步同config-server的改造,最後修改bootstrap.properties配置文件

server.port=7002
spring.application.name=config-client

eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
spring.cloud.config.profile=stg1
spring.cloud.config.label=master
# 開啓經過服務名來訪問配置中心
spring.cloud.config.discovery.enabled=true
# 配置中心服務名爲config-server
spring.cloud.config.discovery.service-id=config-server
#spring.cloud.config.uri=http://localhost:7001/

測試

分別啓動eureka-server、config-server、config-client,訪問http://localhost:1111,能夠看到兩個應用已經成功註冊:

圖片描述

測試config-client的/testConfig接口,結果以下:

圖片描述

失敗快速響應

config-client在啓動時,若是訪問不到config-server會報錯,若是不作任務額外配置,客戶端的響應較慢,在報錯時已經打印出不少日誌。
添加以下配置,可讓客戶端在啓動時優先檢查配置中心的鏈接狀況:

spring.cloud.config.fail-fast=true

重試機制

config-client啓動沒法鏈接配置中心時,咱們但願客戶端能重試鏈接幾回,這樣能夠避免因網絡抖動而致使應用沒法啓動的狀況。
首先確保客戶端的快速響應機制打開,再添加以下重試配置:

# 配置重試次數,默認爲6
spring.cloud.config.retry.max-attempts=6
# 間隔乘數,默認1.1,如第一次間隔爲1000ms,則第二次間隔爲1100ms
spring.cloud.config.retry.multiplier=1.1
# 初始重試間隔時間,默認1000ms
spring.cloud.config.retry.initial-interval=1000
# 最大間隔時間,默認2000ms
spring.cloud.config.retry.max-interval=2000

動態刷新配置

其餘配置

安全保護

在Config Server中引入Spring Security便可實現配置中心的密碼訪問。
首先在pom.xml文件中添加依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

而後在application.properties中配置用戶名密碼:

security.user.name=admin
security.user.password=admin

最後在配置中心客戶端配置用戶名和密碼:

security.user.name=admin
security.user.password=admin

加密與解密

出現的問題

1、初始提交碼雲時報push to origin/master was rejected錯誤

解決方案以下:

1.切換到本身項目所在的目錄,右鍵選擇GIT BASH Here,Idea中可以使用Alt+F12

2.在terminl窗口中依次輸入命令:

git pull

git pull origin master

git pull origin master --allow-unrelated-histories

3.在idea中從新push本身的項目,成功!!!

參考資料

1.《Spring Cloud微服務實戰》

相關文章
相關標籤/搜索