1. 程式人生 > >SpringCloud系列------Config-Server

SpringCloud系列------Config-Server

prop 資源 true pts width commit 服務項目 .config guest

關於Config-Server的那些事&踩過的坑!

一、概述

在一個相對成熟,高可用的Spring cloud項目中,都會配置一個配置中心去管理各個服務的配置文件,而往往配置文件不會放到本地配置中心,一般都會放到Git,GitHub,SVN上,

本文以GitHub遠程倉庫為例,這裏首先介紹一下Config-Server服務如何配置搭建,以及其他微服務的配置,以及如何從配置中心讀取文件和服務如何實現動態加載配置

首先:

我們要單獨創建一個Config-Server的服務

技術分享圖片

它依賴的包:

 1 <dependencies>
 2         <dependency>
 3
<groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-cloud-config-server</artifactId> 5 </dependency> 6 <!-- bus總線 --> 7 <dependency> 8 <groupId>org.springframework.cloud</groupId> 9
<artifactId>spring-cloud-starter-bus-amqp</artifactId> 10 </dependency> 11 <!-- 動態刷新的支持 --> 12 <dependency> 13 <groupId>org.springframework.boot</groupId> 14 <artifactId>spring-boot-starter-actuator</artifactId> 15
</dependency> 16 <!-- 為了方便,將服務註冊到註冊中,引入依賴包 --> 17 <dependency> 18 <groupId>org.springframework.cloud</groupId> 19 <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 20 </dependency> 21 </dependencies>

為了項目後期的靈活,我這裏關於config-server的配置文件是如下結構:···-dev開發環境;···-prod正式環境;···-uat發布環境,這裏以開發環境為例:

技術分享圖片

1. application.properties文件配置如下:

1 spring.application.name=Config-Service
2 spring.profiles.active=dev
spring.application.name  :服務名

spring.profiles.active :服務運行的環境

2. application-dev.properties文件配置如下:

 1 #config-server
 2 server.port=10003
 3 
 4 #eureka
 5 eureka.client.service-url.defaultZone=http://localhost:10001/eureka/,http://localhost:10011/eureka/,http://localhost:10111/eureka/
 6 eureka.instance.prefer-ip-address=false
 7 eureka.instance.lease-renewal-interval-in-seconds=10
 8 eureka.instance.lease-expiration-duration-in-seconds=20
 9 
10 #config-server
11 #配置文件所在的分支
12 spring.cloud.config.label=master
13 #遠程配置文件所在的Github倉庫的地址,用戶名,密碼
14 spring.cloud.config.server.git.uri=https://github.com/zhz12311/QiWuIOT.git
15 spring.cloud.config.server.git.username=XXXX
16 spring.cloud.config.server.git.password=xxxxxxx
17 spring.cloud.config.server.git.clone-on-start=true
18 #配置文件所在的目錄
19 spring.cloud.config.server.git.search-paths=Consumers,Providers,Zuul
20 # 對於使用git,svn做為後端配置,從遠程庫獲取配置文件,需要存儲到本地文件
21 spring.cloud.config.server.git.basedir=/application-dev
22 # 配置中心通過git從遠程git庫,有時本地的拷貝被汙染,這時配置中心無法從遠程庫更新本地配置,設置force-pull=true,則強制從遠程庫中更新本地庫
23 spring.cloud.config.server.git.force-pull=true
24 # 自定義配置文件路徑
25 spring.cloud.config.server.native.search-locations=
26 # native:啟動從本地讀取配置文件,必須指定active的值,才可以使用本地文件配置模式,如果使用本地系統配置,則此值必須是native
27 spring.profiles.active=
28 #RabbitMQ
29 spring.rabbitmq.host=localhost
30 spring.rabbitmq.port=5672
31 spring.rabbitmq.username=guest
32 spring.rabbitmq.password=guest
33 #動態刷新配置 ---需要忽略權限攔截
34 #關閉刷新安全認證
35 management.endpoints.web.exposure.include=*
36 # 開啟消息跟蹤
37 spring.cloud.bus.trace.enabled=true

PS:這裏需要重點說一下一個配置(也是踩的一個坑):在完成配置,項目也成功啟動,進行測試的時候,可以拉取到遠程的配置倉庫中的指定配置的時候,在沒有任何報錯的情況下,卻不能實現動態刷新,RabbitMQ上也接收不到消息,經過將近兩天的時間終於被我找到原因,成功解決:

33 #動態刷新配置 ---需要忽略權限攔截
34 #關閉刷新安全認證
35 management.endpoints.web.exposure.include=*

在1.5.x版本中通過management.security.enabled=false來暴露所有端點,Spring Boot 2.x中的management.security.enabled=false無效問題

解決這個問題一般有兩種方式:(參考:https://blog.csdn.net/qq_27385301/article/details/82899303)

方式1:

  # 啟用端點 env
  management.endpoint.env.enabled=true

  # 暴露端點 env 配置多個,隔開
  management.endpoints.web.exposure.include=env
方式2:

  方式1中的暴露方式需要一個一個去開啟需要暴露的端點,方式2直接開啟和暴露所有端點

  management.endpoints.web.exposure.include=*
我這裏都是采用方式二,問題也就解決了!還有一定要記住在啟動Config-server之前一定要先啟動RabbitMQ,我就不解釋為什麽了

好了,回來繼續,GitHub遠程倉庫中的目錄如下:

技術分享圖片

進行拉去配置測試:

操作如下:(以application-pro-previlige-dev.properties為例)

技術分享圖片

啟動Config-Server,然後在瀏覽器中訪問:http://localhost:10003/application-pro-previlige-dev.properties 會看到如下頁面,說明config-server配置成功,可以拉去配置

技術分享圖片

PS:http請求地址和資源文件映射如下:
* /{application}/{profile}[/{label}]
* /{application}-{profile}.yml
* /{label}/{application}-{profile}.yml
* /{application}-{profile}.properties
* /{label}/{application}-{profile}.properties

接下來要對Providers中的微服務項目進行修改:

1、pom.xml

 1 <!--拉取配置-->
 2         <dependency>
 3             <groupId>org.springframework.cloud</groupId>
 4             <artifactId>spring-cloud-starter-config</artifactId>
 5         </dependency>
 6         <!--消息總線-->
 7         <dependency>
 8             <groupId>org.springframework.cloud</groupId>
 9             <artifactId>spring-cloud-starter-bus-amqp</artifactId>
10         </dependency>
11         <dependency>
12             <groupId>org.springframework.amqp</groupId>
13             <artifactId>spring-rabbit</artifactId>
14         </dependency>
15         <dependency>
16             <groupId>org.springframework.boot</groupId>
17             <artifactId>spring-boot-starter-actuator</artifactId>
18         </dependency>
19 
20         <!-- 重試功能依賴 -->
21         <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
22         <dependency>
23             <groupId>org.springframework.boot</groupId>
24             <artifactId>spring-boot-starter-aop</artifactId>
25         </dependency>
26         <!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
27         <dependency>
28             <groupId>org.springframework.retry</groupId>
29             <artifactId>spring-retry</artifactId>
30         </dependency>

2、將原來的application.properties文件改成bootstrap.properties,具體配置如下:

 1 server.port=60018
 2 spring.application.name=Pro-PreviligeSvr
 3 
 4 # 遠程倉庫的分支
 5 spring.cloud.config.label=master
 6 #github上的文件名
 7 spring.cloud.config.name=application-pro-previlige
 8 # dev 開發環境配置文件 |  test 測試環境  |  pro 正式環境
 9 # 和git裏的文件名對應
10 spring.cloud.config.profile=dev
11 #spring.cloud.config.profile=test
12 # 指明配置服務中心的網址
13 spring.cloud.config.uri= http://localhost:10003/
14 # true: 如果訪問配置中心失敗,則停止啟動服務
15 spring.cloud.config.fail-fast=true
16 # 配置重試,默認是重試6次,最初是延遲1s再次重試,如果再失敗,則延遲1.1*1s、1.1*1.1*1s、… 。可以使用這個配置
17 # 第一次失敗,延遲多久重試
18 spring.cloud.config.retry.initial-interval=2000
19 # 最多重試次數
20 spring.cloud.config.retry.max-attempts=6
21 # 最大重試間隔
22 spring.cloud.config.retry.max-interval=4000
23 # 每次重試時間是之前的倍數
24 spring.cloud.config.retry.multiplier=1.2
25 # 開啟消息跟蹤
26 spring.cloud.bus.trace.enabled=true
27 #動態刷新配置 ---需要忽略權限攔截
28 #開啟監控端點
29 management.endpoints.web.exposure.include=*

然後啟動該服務查看控制臺

技術分享圖片

在瀏覽器訪問之前的註冊中心的任意一個發現服務註冊成功,說明拉取遠程配置倉庫中的配置成功!

技術分享圖片

但是這裏只能說是解決的80%的問題,最大的作用還沒有展示出來,下面介紹一下如何通過bus總線和RabbitMQ來完成動態加載最新的配置:

在GitHub倉庫找到需要修改的配置文件

技術分享圖片

首先我們同樣是啟動Providers中的Pro-Role這個微服務,通過註冊中心,查看是否成功註冊:

技術分享圖片

然後我們可以根據服務中提供的接口,在瀏覽器中進行訪問:當成功有返回說明,Config-Server 的使用到目前為止處於理想狀態

技術分享圖片

然後,我們在GitHub倉庫中找到該服務的指定配置,進行一些修改操作:

技術分享圖片

成功修改完配置,Commit changes之後需要進行一步操作,不然沒有效果,使用PostMan工具發送一個Post請求:http://localhost:10003/actuator/bus-refresh 如下圖,當返回是空白,說明修改成功!

技術分享圖片

然後我們再回到瀏覽器中訪問原來的路徑,發現已經報了JDBC數據庫連接錯誤如下:

技術分享圖片

然後我們再進行一次重復的操作用,先把數據庫密碼改回root,提交後,發送POST請求,再次刷新上面的頁面,我們會看到:

技術分享圖片

說明我們的Config-Server這個配置完成,支持動態刷新,更新配置,拉取GitHub倉庫中的配置文件,同事當我們發送POST請求後,查看RabbitMQ 的客戶端,會發現如下變動,同樣也說明成功調用了Bus總線,發送和處理了消息

技術分享圖片

總結Spring Cloud Bus做配置更新的步驟:

1.提交代碼,發送POST請求給actuator/bus-refresh

2.server端接收到請求,並發送給Spring Cloud Bus

3.Spring Cloud Bus接收到消息並通知給其他客戶端

4.其他客戶端接收到通知,請求server端獲取最新的配置

5.全部客戶端都獲取到最新的配置。

SpringCloud系列------Config-Server