天天看點

【夯實Spring Cloud】Spring Cloud分布式配置中心詳解

本文屬于【夯實Spring Cloud】系列文章,該系列旨在用通俗易懂的語言,帶大家了解和學習Spring Cloud技術,希望能給讀者帶來一些幹貨。系列目錄如下:

【夯實Spring Cloud】Dubbo沉睡5年,Spring Cloud開始崛起!

【夯實Spring Cloud】Spring Cloud中基于maven的分布式項目架構的搭建

【夯實Spring Cloud】Spring Cloud中的Eureka服務注冊與發現詳解

【夯實Spring Cloud】Spring Cloud中如何完善Eureka中的服務資訊

【夯實Spring Cloud】Spring Cloud中使用Eureka叢集搭建高可用服務注冊中心

【夯實Spring Cloud】Spring Cloud中的Eureka和Zookeeper的差別在哪?

【夯實Spring Cloud】Spring Cloud中使用Ribbon實作負載均衡詳解(上)

【夯實Spring Cloud】Spring Cloud中使用Ribbon實作負載均衡詳解(下)

【夯實Spring Cloud】Spring Cloud中自定義Ribbon負載均衡政策

【夯實Spring Cloud】Spring Cloud中使用Feign實作負載均衡詳

【夯實Srping Cloud】Spring Cloud中使用Hystrix實作斷路器原理詳解(上)

【夯實Srping Cloud】Spring Cloud中使用Hystrix實作斷路器原理詳解(下)

【夯實Spring Cloud】Spring Cloud中使用Zuul實作路由網關詳解

【夯實Spring Cloud】Spring Cloud分布式配置中心詳解

【夯實Spring Cloud】未完待續

前面把 Spring Cloud 中的一些知識點都做了相應的介紹,相信讀者對 Spring Cloud 的知識體系也有了一定的認識,這篇文章主要來介紹一下 Spring Cloud 中的分布式配置中心。

1. 分布式系統面臨的問題

微服務意味着要将單體應用中的業務拆分成一個個子服務,每個服務的粒度相對較小,是以系統中會出現大量的服務,由于每個服務都需要必要的配置資訊才能運作,是以一套集中式的、動态的配置管理是必不可少的。

Spring Cloud 提供了 ConfigServer 來解決這個問題。

2. Spring Cloud Config 是什麼?

Spring Cloud Config 分為兩個部分:Config Server 和 Config Client。我們先來看一下整個 Spring Cloud Config 的一個流程。

【夯實Spring Cloud】Spring Cloud分布式配置中心詳解

Config Server:服務端也稱為分布式配置中心,它是一個獨立的微服務應用。用來連接配接配置伺服器并為 Spring Client 用戶端提供配置資訊。

Config Client:客戶但通過指定的配置中心來管理應用資源、以及業務相關的配置内容,并在啟動的時候從配置中心擷取和加載配置資訊。

配置伺服器預設的是采用 git 來存儲配置資訊,這樣有助于對環境配置進行版本管理,并且可以通過 git 用戶端工具來友善的管理和通路配置内容。

下面來詳細介紹下 Config Server 和 Config Client。

3. Config Server 與 GitHub 通信

由上圖可知,Config Server 是與 GitHub 之間通信的,去 GitHub 讀取配置資訊。那麼如何和 GitHub 通信呢?

1)在 GitHub 上建立一個 repository,我們命名為:microservice-config。

2)将該 repository 的東東 clone 到本地(git 指令啥的我就不說了)。

3)在本地新建立一個 application.yml 檔案(儲存格式必須是 UTF-8),并推送到 GitHub 上。application.yml 内容如下:

spring:
  profiles:
    active:
      - dev
---
spring:
  profiles: dev
  application:
    name: microservice-config-client-dev
---
spring:
  profiles: test
  application:
    name: microservice-config-client-test
           

相當于我們寫了三個配置,指定的是 dev 的配置,推送到 GitHub 之後,那麼配置資訊就搞好了,等下我們來讀取這些配置資訊。

4)在本地建立一個 model 項目:microservice-config,用作 Spring Cloud 的配置中心子產品。導入依賴:

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

主啟動類需要添加

@EnableConfigServer

注解。

@SpringBootApplication
@EnableConfigServer
public class MicroserviceConfig {
    public static void main(String[] args) {
        SpringApplication.run(MicroserviceConfig.class, args);
    }
}
           

項目的配置檔案:application.yml(跟上面的 application.yml 不是一個檔案,上面的是推送到 GitHub 倉庫的檔案,這裡是這個項目工程中的配置檔案)。

server:
  port: 5555

spring:
  application:
    name: microservice-config
  cloud:
    config:
      server:
        git:
          uri: https://github.com/eson15/microservice-config.git
           

端口号我們定為 5555,服務名稱為:microservice-config。最重要的就是 spring.cloud.config.server.git.uri 這個值了,該值就是我們剛剛建立的 repository 的對應 git 位址。這樣 Config Server 端就知道從哪擷取配置資訊了。

5)測試一下

啟動該配置中心,在浏覽器輸入:http://localhost:5555/application-dev.yml 可以擷取如下資訊:

spring:
  application:
    name: microservice-config-client-dev
  profiles:
    active:
    - dev
           

再輸入:http://localhost:5555/application-test.yml 可以擷取如下資訊:

spring:
  application:
    name: microservice-config-client-test
  profiles:
    active:
    - dev
           

說明 Config Server 和 GitHub 通信成功,可以擷取相應的配置資訊,接下來我們就要來搞一下 Config Client 端了。

3. Conifg Client 通過 Config Server 與 GitHub 通信

之前我們寫代碼,用戶端都是直接通過 application.yml 配置檔案,擷取相關的配置,也就是說,配置資訊都寫在服務本身的 application.yml 裡了。現在用戶端通過上面的Config Server(即配置中心),能否擷取到我們傳在 GitHub 上的配置呢?

我們建立一個用戶端的 model 工程,取名為:microservice-config-client。導入 config 依賴:

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

然後在 resource 目錄下建立一個 bootstrap.yml 檔案,application.yml 是使用者級的資源配置項,bootstrap.yml 是系統級的,優先級更高。

Spring Cloud 會建立一個

Bootstrap Context

,作為 Spring 應用的

Application Context

的父上下文,初始化的時候,

Bootstrap Context

負責從外部資源加載配置屬性并解析配置。這兩個上下文共享一個從外部擷取的

Environment

是以新增一個 bootstrap.yml 檔案,保證

bootstrap Context

application Context

配置的分離。

spring:
  cloud:
    config:
      uri: http://10.5.128.98:5555  # 服務啟動後,去找5555服務
      name: microservice-config  # 從github上讀取的資源名稱,不要加 .yml字尾
      label: master # master分支
      profile: dev  # dev配置
           

解釋:啟動該服務,表示去 5555 服務找配置,5555 服務連了 GitHub。

Spring.cloud.config.name: microservice-config

表示讀取 GitHub 上 microservice-config.yml 檔案内容

Spring.cloud.config.label: master

表示讀取 master 分支

Spring.cloud.config.profile: dev

表示讀取 profile 為 dev 的配置

綜合:表示讀取 GitHub 上 master 分支下的 microservice-config.yml 檔案中的 dev 分支裡面的配置檔案。

寫一個Controller測試一下:

@RestController
@RequestMapping("/config")
public class ClientController {

    @Value("${spring.application.name}")
    private String springApplicationName;

    @Value("${server.port}")
    private String serverPort;

    @Value("${eureka.client.service-url.defaultZone}")
    private String defaultEurekaZone;

    @GetMapping("/test")
    public String getConfig() {
        return "applicationName=" + springApplicationName
                + "; serverPort=" + serverPort
                + "; defaultEurekaZone=" + defaultEurekaZone;
    }
}
           

啟動5555服務,再啟動該服務,在浏覽器輸入http://localhost:8881/config/test

即可出現:

applicationName=microservice-config-client; serverPort=8881; defaultEurekaZone=http://eureka01:7001/eureka/

說明配置讀取完成。

源碼下載下傳位址:https://gitee.com/eson15/springcloud_study

更多優質文章請關注我的微信公衆号【武哥聊程式設計】,回複“資源”、“架構”、“履歷”等關鍵詞,可以領取海量優質的視訊學習資源。大家共同進步。

【夯實Spring Cloud】Spring Cloud分布式配置中心詳解

繼續閱讀