1. 程式人生 > >Spring Cloud 應用篇 之 Spring Cloud Config(配置中心)

Spring Cloud 應用篇 之 Spring Cloud Config(配置中心)

為了方便儲存,轉自:https://blog.csdn.net/hubo_88/article/details/80692156

從前幾篇文章中我們就可以看出,在分散式系統中,服務數量會很多,如果要修改服務的配置檔案,會很麻煩,這個時候,我們想把配置檔案放在一個地方統一管理,實時更新,Spring Cloud 就給我們提供了這樣一個元件——Spring Cloud Config。

(一)簡介

Spring Cloud Config 支援配置檔案放在遠端倉庫中,例如 Git、SVN,也可以掛載到本地。Spring Cloud Config 和 Spring Boot Admin 有一點類似,它也由服務端和客戶端組成,即 server、client。

(二)基於 server-client 構建專案

2.1 建立 server 

2.1.1 新建一個 module(spring-cloud-config)

2.1.2 pom 檔案新增相關依賴

 
  1. <dependency>

  2. <groupId>org.springframework.cloud</groupId>

  3. <artifactId>spring-cloud-config-server</artifactId>

  4. </dependency>

2.1.3 啟動類添加註解 @EnableConfigServer 開啟配置中心的功能

 
  1. @SpringBootApplication

  2. @EnableConfigServer

  3. public class SpringCloudConfigApplication {

  4.  
  5. public static void main(String[] args) {

  6. SpringApplication.run(SpringCloudConfigApplication.class,args);

  7. }

  8. }

2.1.4 新增配置檔案

 
  1. server:

  2. port: 8888

  3.  
  4. spring:

  5. cloud:

  6. config:

  7. server:

  8. git:

  9. uri: https://github.com/shmilyah/cloud-config-samples.git

  10. search-paths: '{application}'

  11. application:

  12. name: spring-cloud-config

spring.cloud.config.server.git.uri:配置git倉庫地址

spring.cloud.config.server.git.searchPaths:配置倉庫路徑,這裡的配置會根據傳入的應用名動態查詢

由於我這裡配置的 git 倉庫為公開的,所以不需要配置使用者名稱和密碼,如果你配置的是私有倉庫,還需要配置使用者名稱和密碼

(spring.cloud.config.server.git.username 和 spring.cloud.config.server.git.password)

2.1.5 建立倉庫裡的配置檔案

本例為了測試,我在 https://github.com/shmilyah/cloud-config-samples.git 倉庫裡建立了一個資料夾 config-client,資料夾下建立了一個配置檔案 config-client-dev.yaml,內容如下

hello: world

2.1.6 啟動 spring-cloud-config 服務,訪問 http://localhost:8888/config-client/dev/master

 
  1. {"name":"config-client","profiles":["dev"],"label":"master",

  2. "version":"15a6b2770f282a7d12790ea4d03a548fe1fea664","state":null,

  3. "propertySources":[{"name":"https://github.com/shmilyah/cloud-config-samples.git/config-client/config-client-dev.yaml","source":{"hello":"world"}}]}

訪問配置中心獲取配置資訊成功,這裡的請求路徑對映為:/{application}/{profile}[/{label}],還有一些其他路徑的對映,詳細資訊可以網上檢視相關文件。

2.2 建立客戶端 client

2.2.1 建立新的 module(spring-cloud-client)

 

2.2.2 新增 pom 依賴

 
  1. <dependency>

  2.     <groupId>org.springframework.cloud</groupId>

  3. <artifactId>spring-cloud-starter-config</artifactId>

  4. </dependency>

  5.  
  6. <dependency>

  7. <groupId>org.springframework.boot</groupId>

  8. <artifactId>spring-boot-starter-web</artifactId>

  9. </dependency>

2.2.3 新增配置檔案 application.yaml

 
  1. server:

  2. port: 8989

  3.  
  4. spring:

  5. application:

  6. name: config-client

  7. cloud:

  8. config:

  9. uri: http://localhost:8888/

  10. profile: dev

  11. label: master

spring.cloud.config.uri 配置要連線的配置中心的地址

spring.cloud.config.profile 配置獲取哪個環境的配置檔案

一個專案一般會有開發(dev)、測試(test)、生產(pro)環境,還有一些公司的定義不同,還有 dat、uat 環境等,這裡我們配置的是開發環境 dev 

spring.cloud.config.lable 配置連線遠端倉庫的分支,這裡我們是 master

這裡的 spring.application.name 配置要和 git 倉庫的資料夾名稱一致,因為配置中心配置了 search-paths 是通過應用名查詢對應的路徑

2.2.4 寫一個測試介面,程式碼如下:

 
  1. @SpringBootApplication

  2. @RestController

  3. public class ConfigClientApplication {

  4.  
  5. public static void main(String[] args) {

  6. SpringApplication.run(ConfigClientApplication.class, args);

  7. }

  8.  
  9. @Value("${hello}")

  10. private String hello;

  11.  
  12. @RequestMapping("hello")

  13. public String hello() {

  14. return hello;

  15. }

  16. }

訪問 http://localhost:8989/hello

這說明我們的 config-client 已經成功獲取了配置中心裡的配置檔案,下面我們介紹基於 eureka 來使用配置中心。

(三)基於 Eureka 構建專案

如(二)的配置,我們需要為每個服務配置指定 git 的 uri,但我們基於 Eureka 來使用,就可以省略這一步,把配置中心和其他服務都註冊到 eureka server,這個時候,服務會自動獲取 eureka 裡的 config,去獲取自己配置的需要的配置檔案。

3.1 修改 spring-cloud-config 服務

3.1.1 pom 檔案新增 Eureka 的依賴

 
  1. <dependency>

  2. <groupId>org.springframework.cloud</groupId>

  3. <artifactId>spring-cloud-config-server</artifactId>

  4. </dependency>

  5. <dependency>

  6. <groupId>org.springframework.cloud</groupId>

  7. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

  8. </dependency>

3.1.2 啟動類添加註解

 
  1. @SpringBootApplication

  2. @EnableEurekaClient

  3. @EnableConfigServer

  4. public class SpringCloudConfigApplication {

  5.  
  6. public static void main(String[] args) {

  7. SpringApplication.run(SpringCloudConfigApplication.class,args);

  8. }

  9. }

3.1.3 配置檔案新增 eureka 的配置

 
  1. server:

  2. port: 8888

  3.  
  4. spring:

  5. cloud:

  6. config:

  7. server:

  8. git:

  9. uri: https://github.com/shmilyah/cloud-config-samples.git

  10. search-paths: '{application}'

  11. application:

  12. name: spring-cloud-config

  13. eureka:

  14. client:

  15. service-url:

  16. defaultZone: http://localhost:8761/eureka/

3.1.4 依次啟動 eureka server、spring-cloud-config,訪問 http://localhost:8888/config-client/dev/master

3.2 重構 spring-cloud-config-client 服務

3.2.1 新增 pom 依賴

 
  1. <dependency>

  2. <groupId>org.springframework.cloud</groupId>

  3. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

  4. </dependency>

  5. <dependency>

  6. <groupId>org.springframework.cloud</groupId>

  7. <artifactId>spring-cloud-starter-config</artifactId>

  8. </dependency>

  9. <dependency>

  10. <groupId>org.springframework.boot</groupId>

  11. <artifactId>spring-boot-starter-web</artifactId>

  12. </dependency>

3.2.2 啟動類添加註解

 
  1. @SpringBootApplication

  2. @RestController

  3. @EnableEurekaClient

  4. public class ConfigClientApplication {

  5.  
  6. public static void main(String[] args) {

  7. SpringApplication.run(ConfigClientApplication.class, args);

  8. }

  9.  
  10. @Value("${hello}")

  11. private String hello;

  12.  
  13. @RequestMapping("hello")

  14. public String hello() {

  15. return hello;

  16. }

  17. }

3.2.3 修改配置檔案

 
  1. server:

  2. port: 8989

  3.  
  4. spring:

  5. application:

  6. name: config-client

  7. cloud:

  8. config:

  9. # uri: http://localhost:8888/

  10. profile: dev

  11. label: master

  12. discovery:

  13. enabled: true

  14. service-id: spring-cloud-config

  15. eureka:

  16. client:

  17. service-url:

  18. defaultZone: http://localhost:8761/eureka

這種方式,我們通過 spring.cloud.config.discovery 的配置,通過 service-id 向註冊中心查詢配置中心,這個 service-id 和配置中心的 application.name 一致

3.2.4 啟動 spring-cloud-config-client 服務

訪問 http://localhost:8989/hello,雖然我們沒有配置 git 的 uri,這裡依然獲取到了配置資訊,因為我們從註冊中心裡拿到了配置中心

至此,我們的配置中心就已經搭建成功了,後續就可以把其他服務的配置檔案都放到配置中心指定的遠端倉庫中統一管理了

不過這裡我們沒有還沒有實現配置中心檔案實時重新整理,這個後續會講

其實還有一個問題,這裡面有一個坑,可能有人已經發現了,當你配置的配置中心的 server.port 不是 8888 的時候,其他服務就起不來了,從日誌中可以發現,服務啟動的時候,Fetching config from server at: http://localhost:8888,時間有限,這個問題下一篇來說吧!

 

原始碼下載:https://github.com/shmilyah/spring-cloud-componets

--------------------- 作者:hubo_88 來源:CSDN 原文:https://blog.csdn.net/hubo_88/article/details/80692156?utm_source=copy 版權宣告:本文為博主原創文章,轉載請附上博文連結!