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,解決上述問題,實現配置自動更新。==

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM