1. 程式人生 > >SpringCloud進擊 | 一深入:高可用的分散式配置中心(Spring Cloud Config)【Finchley版本】

SpringCloud進擊 | 一深入:高可用的分散式配置中心(Spring Cloud Config)【Finchley版本】


1.前言

上一節:SpringCloud進擊 | 七淺出:服務閘道器 - 過濾器(Zuul Filter)【Finchley版本】

通常情況下,Config Server 與 Eureka 服務註冊中心一樣,也需要將其架構成高可用的叢集。所以,我們來改進一下,以一種更為簡單的方式 -- 把 Config Server 也註冊為服務。這樣,所有客戶端就能以服務的方式進行訪問,通過這種方法,只需要啟動多個指向同一 Git 倉庫位置的 Config Server 就能實現高可用的分散式配置中心。

基礎實現見淺出系列第五節SpringCloud進擊 | 五淺出:配置中心(Git配置與更新)【Finchley版本】

 

2.準備

先來回顧一下前面淺出部分我們都完成了什麼:

  • 構建 服務註冊中心:wei-eureka-server,埠號:8090
  • 建立 服務提供者:wei-service-provider,埠號:8010
  • 建立 服務消費者:wei-consumer-ribbon,埠號:8020 和 wei-consumer-feign,埠號:8030
  • 實現 Spring Cloud Netflix Hystrix 斷路器 的融斷機制
  • 實現 服務配置中心:wei-config-server,埠號:8040 和 wei-config-client,埠號:8050
  • 實現 服務閘道器的對映和過濾器:wei-gateway-zuul,埠號:8060

這裡我們繼續使用上一節的程式碼來進行相應改造:

  1. Eureka 註冊中心:wei-eureka-server (無需改造)
  2. Config Server:wei-config-server (需要改造)
  3. Config Client:wei-config-client (需要改造)

 

3.進擊

3.1.Config Server 服務端改造

3.1.1.pom 依賴改造

pom.xml 檔案新增以下依賴:

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

完整的 pom 檔案依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wei</groupId>
    <artifactId>wei-config-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>wei-config-server</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <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>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.1.2.application 配置改造

application.yml 檔案完整配置: 

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8090/eureka/    # 指定進行服務註冊的地址。高可用配置中心-服務端服務化
server:
  port: 8040
spring:
  application:
    name: wei-config-server
  cloud:
    config:
      label: master    # 對應 Git 上不同的分支,預設為 master
      server:
        git:
          username:
          password:
          uri: https://github.com/itanping/wei-springcloud     # 配置 Git 倉庫地址
          search-paths: wei-config/config-profile            # Git倉庫地址下的相對地址,可以配置多個,用,分割

3.1.3.啟動類

啟動類與上節保持一致,不需要改造。

 

這樣,Config Server 服務端的改造就完成了。

 

3.2.Config Client 客戶端改造

3.2.1.pom 依賴改造

pom.xml 檔案新增以下依賴:

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

完整的 pom 依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wei</groupId>
    <artifactId>wei-config-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>wei-config-client</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.SR1</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.2.2.配置檔案改造

application.yml 檔案新增配置項:eureka.client.service-url.defaultZone,設定指向配置中心的地址。

server:
  port: 8050

bootstrap.yml 檔案配置:

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8090/eureka/    # 指定進行服務註冊的地址。高可用配置中心實現
spring:
  application:
    name: wei-config-client
  cloud:
    config:
      name: config-client     # 對應配置檔名 config-client-dev.properties 的 {application} 部分
      profile: dev            # 對應配置檔名 config-client-dev.properties 的 {profile} 部分
      label: master           # 使用 {label} 對應 Git 的分支名,如果配置中心使用的是本地儲存,則該引數無用
      discovery:
        enabled: true                    # 開啟 Config 服務發現支援
        service-id: wei-config-server    # 高可用配置中心實現需要將uri配置去掉,使用service-id直接指向Server端地址

bootstrap.yml 主要是去掉了 spring.cloud.config.uri 配置,使用 service-id 直接指向 Server 端地址。因這 uri 好設定,但是不具有微服務的靈活性。

另外需要增加配置:

  • spring.cloud.config.discovery.enabled:開啟 Config 服務發現支援
  • spring.cloud.config.discovery.serviceId:指定 Server 端的 name,也就是 Server 端 spring.application.name 的值

這兩個配置檔案都需要放到 bootstrap.yml 的配置中。

3.2.3.啟動類

啟動類與上節保持一致,不需要改造。

 

如此,Config Client 客戶端的改造也完成了。

 

4.測試

依次做以下準備:

  1. 啟動 Eureka 註冊中心:wei-eureka-server,埠 8090
  2. 啟動 Config Server:為了模擬生產環境,我們分別以埠號 8040、8041 啟動兩個 wei-config-server 做叢集,以此來提供高可用的支援
  3. 啟動 Config Client:wei-config-client,埠:8050

依次啟動完了後,去註冊中心看看:http://localhost:8090/

如圖,可以看到會有 8040、8041 兩個 Config Server 端同時提供配置中心服務,這樣可以防止某一臺服務掛掉之後影響整個系統的使用。Config Client 端也已經註冊了到註冊中心。

以上,測試就緒。

 

4.1.Config 服務端驗證

我們分別訪問URL:http://localhost:8040/config-client/dev 和 http://localhost:8041/config-client/dev

是不是?瀏覽器列印了相同資訊:

{
    "name": "config-client", 
    "profiles": [
        "dev"
    ], 
    "label": null, 
    "version": "a66db4adfd79df7a91cd148e73eef572a9378d3d", 
    "state": null, 
    "propertySources": [
        {
            "name": "https://github.com/itanping/wei-springcloud/wei-config/config-profile/config-client-dev.properties", 
            "source": {
                "config.tip": "Demo for Spring Cloud config", 
                "config.env": "dev for update"
            }
        }
    ]
}

說明兩個服務配置中心都正常讀取到了配置資訊。服務端OK。

 

4.2.Config 客戶端驗證

我們再來訪問:http://localhost:8050/demo/info

瀏覽器列印:

[Config Client] dev for update, 錯誤配置屬性config.tips測試,此處應該為config.tip

說明客戶端已經讀取到了 Config Server 端的內容。客戶端OK。

 

4.3.Config 服務端叢集驗證

我們再隨機停掉一臺 Config Server 端的服務,就停掉 8041吧。然後再次訪問:http://localhost:8050/demo/info

瀏覽器還是會列印:

[Config Client] dev for update, 錯誤配置屬性config.tips測試,此處應該為config.tip

說明高可用的分散式配置中心已經在正常運作。

 

5.總結

此時的架構:

原始碼:

參考:
https://springcloud.cc/spring-cloud-netflix.html
https://blog.csdn.net/forezp/article/details/81041045
https://windmt.com/2018/04/19/spring-cloud-8-config-with-eureka/

 

6.系列

SpringCloud進擊 | 一淺出:服務註冊與發現(Eureka)【Finchley版本】
SpringCloud進擊 | 二淺出:服務消費者(Ribbon+REST)【Finchley版本】
SpringCloud進擊 | 三淺出:服務消費者(Feign)【Finchley版本】
SpringCloud進擊 | 四淺出:斷路器與容錯(Hystrix)【Finchley版本】
SpringCloud進擊 | 五淺出:配置中心(Git配置與更新)【Finchley版本】
SpringCloud進擊 | 六淺出:服務閘道器 - 路由(Zuul Router)【Finchley版本】
SpringCloud進擊 | 七淺出:服務閘道器 - 過濾器(Zuul Filter)【Finchley版本】


下一節,請繼續關注