1. 程式人生 > >spring cloud config 實現配置檔案的動態重新整理

spring cloud config 實現配置檔案的動態重新整理

1. 先構建一個配置中心,並註冊到註冊中心

1)首先我們來構建一個配置中心,方式很簡單,建立一個普通的Spring Boot專案,叫做config-server,建立好之後,新增如下依賴:(21-springcloud-config-center)

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.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> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</
groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--新增配置中心的依賴--> <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> <!--新增服務註冊和發現依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.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>

2)在入口類上新增@EnableConfigServer註解,表示開啟配置中心服務端功能,如下:

@EnableDiscoveryClient  // 服務註冊與發現
@EnableConfigServer
@SpringBootApplication
public class ConfigCenterApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigCenterApplication.class, args);
    }
}
3)在application.properties中配置一下git倉庫的資訊以及服務註冊的地址:
server.port=2007
spring.application.name=config-server
#向服務註冊中心註冊服務
eureka.client.service-url.defaultZone=http://localhost:1110/eureka/
#倉庫配置中心的配置資訊
#uri表示配置中心所在倉庫的位置
spring.cloud.config.server.git.uri=https://github.com/lihy2018/newRepo.git
#search-paths表示倉庫下的子目錄
spring.cloud.config.server.git.search-paths=config-repo
#username表示你的GitHub使用者名稱
spring.cloud.config.server.git.username=******
#password表示你的GitHub密碼
spring.cloud.config.server.git.password=*******
#更改本地倉庫clone的配置檔案資訊的路徑
spring.cloud.config.server.git.basedir=D:\\localGitRepo\\
#配置中心服務端健康監測器
spring.cloud.config.server.health.repositories.check.name=app
spring.cloud.config.server.health.repositories.check.label=master
spring.cloud.config.server.health.repositories.check.profiles=prod
#安全保護
security.user.name=*******
security.user.password=*****
通過本地的git命令, 向github遠端倉庫上提交配置檔案:
****-PC MINGW64 ~ (master)
$ cd  config-repo/

****-PC MINGW64 ~/config-repo (master)
$ ll
total 4
-rw-r--r-- 1 lihy 197121 20 六月 10 12:12 app.properties
-rw-r--r-- 1 lihy 197121 16 六月 10 12:13 app-dev.properties
-rw-r--r-- 1 lihy 197121 30 六月 20 16:46 app-prod.properties
-rw-r--r-- 1 lihy 197121 45 六月 11 19:01 app-test.properties  

提交遠端倉庫github上:

$ cat  app-prod.properties
sang=prod config first !!!

$ git  add  config-repo/

$ git  commit config-repo/   -m  "first"

$ git push  

2.構建一個配置客戶端

1)首先建立一個普通的Spring Boot工程config-client,建立成功之後新增如下依賴:(21-springcloud-config-client)

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.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>
</properties>

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

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

    <!--新增config 客戶端的依賴-->
<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>

    <!--新增服務註冊和發現依賴-->
<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>


    <!--新增  重試機制 的依賴
    因網路的抖動等原因導致config-client在啟動時候訪問config-server沒有訪問成功從而報錯,
    希望config-client能重試幾次,故重試機制
    -->
<dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>


    <!-- 動態重新整理配置
      更新了Git倉庫中的配置檔案,那如何讓config-client能夠及時感知到呢?
      動態重新整理配置
   -->
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.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>

2)建立bootstrap.properties檔案,來獲取配置資訊,注意這些資訊一定要放在bootstrap.properties檔案中才有效,檔案內容如下:
spring.application.name=app-client
#配置客戶端資訊
spring.cloud.config.profile=prod
spring.cloud.config.label=master#服務註冊發現配置
eureka.client.service-url.defaultZone=http://localhost:1110/eureka/
#表示開啟通過服務名來訪問config-server
spring.cloud.config.discovery.enabled=true
#表示註冊中心config-server的服務名
spring.cloud.config.discovery.service-id=config-server
#啟動失敗時能夠快速響應
spring.cloud.config.fail-fast=true
#安全保護
spring.cloud.config.username=****
spring.cloud.config.password=****
#動態重新整理配置 ---需要忽略許可權攔截
management.security.enabled=false

3)在application.properties中配置埠和重試機制

server.port=2008
#和重試機制相關的配置有如下四個:
# 配置重試次數,預設為6
spring.cloud.config.retry.max-attempts=6
# 間隔乘數,預設1.1
spring.cloud.config.retry.multiplier=1.1
# 初始重試間隔時間,預設1000ms
spring.cloud.config.retry.initial-interval=1000
# 最大間隔時間,預設2000ms
spring.cloud.config.retry.max-interval=2000

4)在入口類上新增@EnableDiscoveryClient註解,表示開啟服務註冊與發現功能,如下:

@EnableDiscoveryClient
@SpringBootApplication
public class ConfigClientApplication {

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

5)編寫controller

@RestController
@RefreshScope
public class HelloController {

    @Value("${sang}")
    private   String  sang;

    @Autowired
private Environment environment ;

    @RequestMapping("/hello1")
    public  String   getHello(){
        return  this.sang;
    }

    @RequestMapping("/hello2")
    public  String   getHello2() {
        return environment.getProperty("sang", "未定義");
    }
}

3.  依程式啟動服務註冊中心,配置中心config-server , 配置客戶端app-client(啟動兩個服務,埠分別為2008 , 2009 )

4.訪問服務 http://localhost:2009/hello2  或者 http://localhost:2008/hello2  


然後使用本地的git 修改配置檔案app-prod.properties ,然後提交、push到遠端倉庫Github上。

繼續訪問服務 http://localhost:2009/hello2  或者 http://localhost:2008/hello2 ,此時訪問的結果會不是最新的, 需要使用postman post請求訪問 http://localhost:2009/refresh


然後再訪問http://localhost:2009/hello2 時,可以看到是最新的修改結果。

然後再訪問http://localhost:2008/hello2 時,可以看到是仍然是的原來的舊的結果。 config 的動態更新,需要手動重新整理每一個服務。

使用postman post請求訪問 http://localhost:2008/refresh 重新整理後就可以看到http://localhost:2008/hello2也可以訪問最新的了。