1. 程式人生 > 實用技巧 >SpringCloud Config 配置中心

SpringCloud Config 配置中心

Config 簡介

分散式系統中,由於服務數量非常多,配置檔案分散在不同微服務專案中,管理極其不方便。為了方便配置檔案集中管理,需要分散式配置中心元件。在Spring Cloud中,提供了Spring Cloud Config,它支援配置檔案放在配置服務的本地,也支援配置檔案放在遠端倉庫Git(GitHub、碼雲)。配置中心本質上是一個微服務,同樣需要註冊到Eureka服務中心!

一句話概括:統一管理所有微服務配置檔案的一個微服務

配置中心,也是一個微服務,需要註冊到註冊中心

【配置中心的架構圖】

配置中心整合步驟

  1. 配置檔案集中放在碼雲

  2. 配置中心獲取碼雲配置檔案

  3. 使用者服務獲取配置中心檔案

Git配置管理

遠端Git倉庫

  • 知名的Git遠端倉庫有國外的GitHub和國內的碼雲(gitee);

  • GitHub主服務在外網,訪問經常不穩定,如果希望服務穩定,可以使用碼雲;

  • 碼雲訪問地址:http://gitee.com

建立遠端倉庫

  1. 首先使用碼雲上的git倉庫需要先註冊賬戶

  2. 賬戶註冊完成,然後使用賬戶登入碼雲控制檯並建立公開倉庫

  3. 配置倉庫 名稱和路徑

建立配置檔案

1. 在新建的倉庫中建立需要被統一配置管理的配置檔案

  • 配置檔案的命名方式:{application}-{profile}.yml或{application}-{profile}.properties

  • application為應用名稱

  • profile用於區分開發環境dev,測試環境test,生產環境pro等

    • 開發環境 user-dev.yml

    • 測試環境 user-test.yml

    • 生產環境 user-pro.yml

2. 將user-service工程裡的配置檔案application.yml內容複製作為user-dev.yml檔案內容

3. 建立完user-dev.yml配置檔案之後,gitee中的倉庫如下:

搭建配置中心微服務

實現步驟:

  1. 建立配置中心SpringBoot專案config-server

  2. 勾選Starter:配置中心,Eureka客戶端

  3. 在啟動引導類上加@EnableConfigServer註解

  4. 修改配置檔案:埠,應用名稱,註冊中心地址,碼雲倉庫地址

  5. 啟動測試,測試配置檔案實時同步

實現過程:

1. 建立配置中心SpringBoot專案config-server

2. pom.xml 配置檔案

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zyu</groupId>
    <artifactId>config-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>config-service</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <!--SpringCloud所有依賴管理的座標-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR3</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. 啟動類:建立配置中心工程config_server的啟動類ConfigServerApplication

@SpringBootApplication
@EnableDiscoveryClient//開啟Eureka客戶端發現功能
@EnableConfigServer //開啟配置服務支援
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class,args);
    }
}

4. 配置檔案:建立配置中心工程config_server的配置檔案application.yml

server:
  port: 12000

spring:
  # 應用名稱
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/zyulike/zyu-spring-cloud-config.git

# 註冊中心地址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
  • 注意:上述spring.cloud.config.server.git.uri是在碼雲建立的倉庫地址

5. 啟動測試:啟動eureka註冊中心和配置中心;

  • 訪問http://localhost:12000/user-dev.yml檢視能否輸出碼雲端儲存管理的user-dev.yml檔案
  • 並且可以在gitee上修改user-dev.yml,然後重新整理上述測試地址也能及時更新資料

服務去獲取配置中心配置

關於application.yml和bootstrap.yml檔案的說明:
  • bootstrap.yml檔案是SpringBoot的預設配置檔案,而且其載入時間相比於application.yml更早。
  • bootstrap.yml和application.yml都是預設配置檔案,但定位不同
    • bootstrap.yml相當於專案啟動的引導檔案
    • application.yml檔案是微服務的常規配置引數,變化比較頻繁
  • 搭配spring-cloud-config使application.yml的配置可以動態替換。

目標:改造user-service工程,配置檔案不再由微服務專案提供,而是從配置中心獲取。

實現步驟:

  1. 在user_service服務中,新增Config的starter依賴

  2. 刪除application.yml配置檔案,新增bootstrap.yml配置檔案

  3. 配置bootstrap.yml配置檔案:

    • 配置中心相關配置(配置檔案字首、字尾,倉庫分支,是否開啟配置中心)

    • 註冊中心地址

  4. 啟動服務,測試效果

實現過程:

1. 新增依賴

<!--spring cloud 配置中心-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

2.修改配置

  • 刪除user-service工程的application.yml檔案

  • 建立user-service工程bootstrap.yml配置檔案,配置內容如下

# 註冊中心地址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
# 配置中心相關配置
# 使用配置中心
spring:
  cloud:
    config:
      discovery:
        enabled: true
        service-id: config-server    # 配置中心服務id
      name: user  # 與遠端倉庫中的配置檔案的application和profile保持一致,{application}-{profile}.yml
      profile: dev
      label: master   # 遠端倉庫中的分支保持一致

啟動測試:

  • 依次啟動:註冊中心、配置中心、使用者中心user-service

  • 如果啟動沒報錯,其實已經使用上配置中心內容了

  • 可以在服務中心檢視也可以檢驗user-service的服務

配置中心存在的問題

復現問題步驟:

1. 修改遠端Git配置

  • 修改在碼雲上的user-dev.yml檔案,新增一個屬性test.name

2.修改UserController

@RestController
@RequestMapping("/user")
public class UserController {

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

    @Value("${test.name}")
    private String name;

    @Autowired
    UserService userService;

    //根據id查詢
    @RequestMapping("/findById")
    public User findById(Integer id) {
        System.out.println("服務【"+port+"】被呼叫");
        User user = userService.findById(id);
        user.setNote("服務【"+port+"】被呼叫");
        user.setName(name);
        return user;
    }
}

測試:

  • 依次啟動Eureka,配置中心,使用者微服務;

  • 訪問使用者微服務,檢視輸出內容。我們修改的user-dev.yml並沒有發生立即發生變化。但是配置中心的配置檔案內容發生了變化。

結論:通過瀏覽器輸出結果發現,我們對於Git倉庫中的配置檔案的修改,並沒有及時更新到user-service微服務,只有重啟使用者微服務才能生效。

==SpringCloud Bus,解決上述問題,實現配置自動更新。==