Spring Cloud Config:外部集中化配置管理

SpringBoot實戰電商項目mall(20k+star)地址:github.com/macrozheng/…java

摘要

Spring Cloud Config 能夠爲微服務架構中的應用提供集中化的外部配置支持,它分爲服務端和客戶端兩個部分,本文將對其用法進行詳細介紹。git

Spring Cloud Config 簡介

Spring Cloud Config 分爲服務端和客戶端兩個部分。服務端被稱爲分佈式配置中心,它是個獨立的應用,能夠從配置倉庫獲取配置信息並提供給客戶端使用。客戶端能夠經過配置中心來獲取配置信息,在啓動時加載配置。Spring Cloud Config 的配置中心默認採用Git來存儲配置信息,因此自然就支持配置信息的版本管理,而且可使用Git客戶端來方便地管理和訪問配置信息。github

在Git倉庫中準備配置信息

因爲Spring Cloud Config 須要一個存儲配置信息的Git倉庫,這裏咱們先在Git倉庫中添加好配置文件再演示其功能,Git倉庫地址爲:gitee.com/macrozheng/…web

配置倉庫目錄結構

master分支下的配置信息

  • config-dev.yml:
config:
 info: "config info for dev(master)"
複製代碼
  • config-test.yml:
config:
 info: "config info for test(master)"
複製代碼
  • config-prod.yml:
config:
 info: "config info for prod(master)"
複製代碼

dev分支下的配置信息

  • config-dev.yml:
config:
 info: "config info for dev(dev)"
複製代碼
  • config-test.yml:
config:
 info: "config info for test(dev)"
複製代碼
  • config-prod.yml:
config:
 info: "config info for prod(dev)"
複製代碼

建立config-server模塊

這裏咱們建立一個config-server模塊來演示Spring Cloud Config 做爲配置中心的功能。spring

在pom.xml中添加相關依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
複製代碼

在application.yml中進行配置

server:
 port: 8901
spring:
 application:
 name: config-server
 cloud:
 config:
 server:
 git: #配置存儲配置信息的Git倉庫
 uri: https://gitee.com/macrozheng/springcloud-config.git
 username: macro
 password: 123456
 clone-on-start: true #開啓啓動時直接從git獲取配置
eureka:
 client:
 service-url:
 defaultZone: http://localhost:8001/eureka/
複製代碼

在啓動類上添加@EnableConfigServer註解來啓用配置中心功能

@EnableConfigServer
@EnableDiscoveryClient
@SpringBootApplication
public class ConfigServerApplication {

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

}
複製代碼

經過config-server獲取配置信息

這裏咱們經過config-server來演示下如何獲取配置信息。bootstrap

獲取配置文件信息的訪問格式

# 獲取配置信息
/{label}/{application}-{profile}
# 獲取配置文件信息
/{label}/{application}-{profile}.yml
複製代碼

佔位符相關解釋

  • application:表明應用名稱,默認爲配置文件中的spring.application.name,若是配置了spring.cloud.config.name,則爲該名稱;
  • label:表明分支名稱,對應配置文件中的spring.cloud.config.label;
  • profile:表明環境名稱,對應配置文件中的spring.cloud.config.profile。

獲取配置信息演示

建立config-client模塊

咱們建立一個config-client模塊來從config-server獲取配置。架構

在pom.xml中添加相關依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
複製代碼

在bootstrap.yml中進行配置

server:
 port: 9001
spring:
 application:
 name: config-client
 cloud:
 config: #Config客戶端配置
 profile: dev #啓用配置後綴名稱
 label: dev #分支名稱
 uri: http://localhost:8901 #配置中心地址
 name: config #配置文件名稱
eureka:
 client:
 service-url:
 defaultZone: http://localhost:8001/eureka/
複製代碼

添加ConfigClientController類用於獲取配置

/** * Created by macro on 2019/9/11. */
@RestController
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo() {
        return configInfo;
    }
}
複製代碼

演示從配置中心獲取配置

config info for dev(dev)
複製代碼

獲取子目錄下的配置

咱們不只能夠把每一個項目的配置放在不一樣的Git倉庫存儲,也能夠在一個Git倉庫中存儲多個項目的配置,此時就會用到在子目錄中搜索配置信息的配置。

  • 首先咱們須要在config-server中添加相關配置,用於搜索子目錄中的配置,這裏咱們用到了application佔位符,表示對於不一樣的應用,咱們從對應應用名稱的子目錄中搜索配置,好比config子目錄中的配置對應config應用;
spring:
 cloud:
 config:
 server:
 git: 
 search-paths: '{application}'
複製代碼
config info for config dir dev(dev)
複製代碼

刷新配置

當Git倉庫中的配置信息更改後,咱們能夠經過SpringBoot Actuator的refresh端點來刷新客戶端配置信息,如下更改都須要在config-client中進行。

  • 在pom.xml中添加Actuator的依賴:
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
複製代碼
  • 在bootstrap.yml中開啓refresh端點:
management:
 endpoints:
 web:
 exposure:
 include: 'refresh'
複製代碼
  • 在ConfigClientController類添加@RefreshScope註解用於刷新配置:
/** * Created by macro on 2019/9/11. */
@RestController
@RefreshScope
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo() {
        return configInfo;
    }
}
複製代碼
  • 從新啓動config-client後,調用refresh端點進行配置刷新:

update config info for config dir dev(dev)
複製代碼

配置中心添加安全認證

咱們能夠經過整合SpringSecurity來爲配置中心添加安全認證。

建立config-security-server模塊

  • 在pom.xml中添加相關依賴:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
複製代碼
  • 在application.yml中進行配置:
server:
 port: 8905
spring:
 application:
 name: config-security-server
 cloud:
 config:
 server:
 git:
 uri: https://gitee.com/macrozheng/springcloud-config.git
 username: macro
 password: 123456
 clone-on-start: true #開啓啓動時直接從git獲取配置
 security: #配置用戶名和密碼
 user:
 name: macro
 password: 123456
複製代碼
  • 啓動config-security-server服務。

修改config-client的配置

  • 添加bootstrap-security.yml配置文件,主要是配置了配置中心的用戶名和密碼:
server:
 port: 9002
spring:
 application:
 name: config-client
 cloud:
 config:
 profile: dev #啓用配置後綴名稱
 label: dev #分支名稱
 uri: http://localhost:8905 #配置中心地址
 name: config #配置文件名稱
 username: macro
 password: 123456
複製代碼
config info for dev(dev)
複製代碼

config-sever集羣搭建

在微服務架構中,全部服務都從配置中心獲取配置,配置中心一旦宕機,會發生很嚴重的問題,下面咱們搭建一個雙節點的配置中心集羣來解決該問題。

  • 啓動兩個config-server分別運行在8902和8903端口上;

  • 添加config-client的配置文件bootstrap-cluster.yml,主要是添加了從註冊中心獲取配置中心地址的配置並去除了配置中心uri的配置:

spring:
 cloud:
 config:
 profile: dev #啓用環境名稱
 label: dev #分支名稱
 name: config #配置文件名稱
 discovery:
 enabled: true
 service-id: config-server
eureka:
 client:
 service-url:
 defaultZone: http://localhost:8001/eureka/
複製代碼
  • 以bootstrap-cluster.yml啓動config-client服務,註冊中心顯示信息以下:

config info for config dir dev(dev)
複製代碼

使用到的模塊

springcloud-learning
├── eureka-server -- eureka註冊中心
├── config-server -- 配置中心服務
├── config-security-server -- 帶安全認證的配置中心服務
└── config-client -- 獲取配置的客戶端服務
複製代碼

項目源碼地址

github.com/macrozheng/…

公衆號

mall項目全套學習教程連載中,關注公衆號第一時間獲取。

公衆號圖片
相關文章
相關標籤/搜索