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也可以訪問最新的了。