這一節來說說配置中心。
在搭建配置中心的時候,有刷到說倉庫可以在本地搭建,不過當然不會這么low,而且本地搭建哪來的版本控制呢?所以這里用到的是 git,如果作為一個程序猿,連 git 都沒有的麻煩先去拿根面條上上吊。
在說 Config Server 之前,先說清楚URL與配置文件的映射關系:
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
label
就是分支的名稱;application
就是應用的名稱;profile
就是應用的小名,如果應用有小版本,比如測試,灰度發布之類的會用得著。(我這么說真是太客氣了,你用不著也得用,就是這么霸道總裁=。=
由于用到 git,那我先在 git 那里創建一個名為 configserver 的倉庫,然后里面有個 springCloudConfig 文件夾,文件夾里面當然是文件啦。
git 里面的文件只有一個叫 from 的屬性,后面會用得著。<strong>同時請注意路徑的名字,啟動時有異常很有可能不是你代碼有錯而是 git 的路徑錯了 ,包括找不到屬性,請檢查 git。</strong>
我這里先創建一個配置中心,應用名( 即 spring.application.name 屬性 )叫 SleepCare-ConfigServer,來份 pom.xml:
<dependencies>
<!-- spring boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 配置中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<!-- eureka 客戶端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
然后是配置,圖片說它不太好意思見人,我就給它臉上打碼了。
注意這些配置是寫在 bootstrap.properties 里面的,<strong>因為 bootstrap.properties 的加載比 application.properties 要早</strong>,沒有就自己新建一份。
其中說明一下,search-paths
就是在這個倉庫內你那份配置文件的路徑,比如現在是 configserver 倉庫下 springCloudConfig/SleepCare-TestingServices-1.properties,那么很明顯這個屬性值就是 springCloudConfig 啦。
然后啟動類那里加上@EnableConfigServer
注解。
注意到沒有,當你啟動之后,其實這個 config server 也會當成一個客戶端去注冊服務,如此一來其他服務訪問配置中心的時候直接寫 application name 就行了。
接下來要用到服務注冊-EurekaServer (一)配置好的客戶端,客戶端這里也是要寫一份 bootstrap.properties ,內容如下:
哦,記得先給客戶端的 pom.xml 加菜:
<!-- 配置中心客戶端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
URL與配置文件的映射關系還記得不?
- profile&label ---> 映射關系,忘記的自己回顧上面
- discovery.enabled ---> 告訴客戶端要去找配置中心拿東西
- discovery.service-id ---> 告訴客戶端配置中心叫啥名字
另外,在之前配客戶端的時候,eureka.client.serviceUrl.defaultZone
是在 application.properties 配置的,<strong>現在必須寫在 bootstrap.properties</strong>,不然你會感受到一次又一次的挫敗。(受虐狂請忽略我的話
功成名就的一步,寫個類:
from 就是我在倉庫那個文件寫的屬性,屬性值寫啥你說了算。然后 @Value
注解是配置屬性值的,運行時客戶端會去找配置中心要值并注入,接下來才是重點,簡直就是敲黑板了好嗎!<strong>看到沒有,麻煩在類上面加上@RefreshScope
注解</strong>。
當你谷歌 RefreshScope 時,其中有一篇 blog 是這么說的。
默認情況下已經注入類的配置是不會更改的,這個注解是告訴 spring 重新把新的配置注入到類里面。
last one , 在配置里面加上management.security.enabled = false
,否則請求 /refresh 或者 /bus/refresh( 消息總線的接口,這是后話 ) 時會要求身份驗證。
到這里,都跑起來吧,記得先讓配置中心起來再跑客戶端,然后訪問客戶端的 /testing/config 就會看到 git 上面寫的值啦。
然后改一下 git 里面 from 的屬性值,再請求客戶端的接口。
是不是沒反應?
現在客戶端調用一下 /refresh 之后再繼續調用接口,你會看到值變化了。
當然在實際開發上,是不可能這么玩的,多個系統之間這樣玩,很容易鬧出人命,一般都是上消息總線,后續文章會說怎么搭建消息總線。