上一篇springcloud(六):配置中心git示例留了一個小問題,當從新修改配置文件提交後,客戶端獲取的仍然是修改前的信息,這個問題咱們先放下,待會再講。國內不少公司都使用的svn來作代碼的版本控制,咱們先介紹如下如何使用svn+Spring Cloud Config來作配置中心。html
一樣先示例server端的代碼,基本步驟同樣。java
1 <dependencies> 2 <dependency> 3 <groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-cloud-config-server</artifactId> 5 </dependency> 6 <dependency> 7 <groupId>org.tmatesoft.svnkit</groupId> 8 <artifactId>svnkit</artifactId> 9 </dependency> 10 </dependencies>
須要多引入svnkitr包git
1 server: 2 port: 8001 3 4 spring: 5 cloud: 6 config: 7 server: 8 svn: 9 uri: http://192.168.0.6/svn/repo/config-repo 10 username: username 11 password: password 12 default-label: trunk 13 profiles: 14 active: subversion 15 application: 16 name: spring-cloud-config-server
和git版本稍有區別,須要顯示聲明subversion.github
啓動類沒有變化,添加@EnableConfigServer
激活對配置中心的支持web
1 @EnableConfigServer 2 @SpringBootApplication 3 public class ConfigServerApplication { 4 5 public static void main(String[] args) { 6 SpringApplication.run(ConfigServerApplication.class, args); 7 } 8 }
服務端測試算法
訪問:http://localhost:8001/neo-config-dev.properties
,返回:neo.hello: hello im dev
,說明服務端能夠正常讀取到svn代碼庫中的配置信息。修改配置文件neo-config-dev.properties
中配置信息爲:neo.hello=hello im dev update
,再次在瀏覽器訪問http://localhost:8001/neo-config-dev.properties
,返回:neo.hello: hello im dev update
。說明server端會自動讀取最新提交的內容spring
客戶端測試json
客戶端直接使用上一篇示例項目spring-cloud-config-client
來測試,配置基本不用變更。啓動項目後訪問:http://localhost:8002/hello,返回:
hello im dev update說明已經正確的從server端獲取到了參數。一樣修改svn配置並提交,再次訪問
http://localhost:8002/hello
``依然獲取的是舊的信息,和git版本的問題同樣。瀏覽器
如今來解決上一篇的遺留問題,這個問題在svn版本中依然存在。Spring Cloud Config分服務端和客戶端,服務端負責將git(svn)中存儲的配置文件發佈成REST接口,客戶端能夠從服務端REST接口獲取配置。但客戶端並不能主動感知到配置的變化,從而主動去獲取新的配置。客戶端如何去主動獲取新的配置信息呢,springcloud已經給咱們提供瞭解決方案,每一個客戶端經過POST方法觸發各自的/refresh
。安全
修改spring-cloud-config-client
項目已到達能夠refresh的功能。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
增長了spring-boot-starter-actuator
包,spring-boot-starter-actuator
是一套監控的功能,能夠監控程序在運行時狀態,其中就包括/refresh
的功能。
須要給加載變量的類上面加載@RefreshScope
,在客戶端執行/refresh
的時候就會更新此類下面的變量值。
1 @RestController 2 @RefreshScope // 使用該註解的類,會在接到SpringCloud配置中心配置刷新的時候,自動將新的配置更新到該類對應的字段中。 3 class HelloController { 4 5 @Value("${neo.hello}") 6 private String hello; 7 8 @RequestMapping("/hello") 9 public String from() { 10 return this.hello; 11 } 12 }
springboot 1.5.X 以上默認開通了安全認證,因此須要在配置文件application.properties
添加如下配置
management.security.enabled=false
OK 這樣就改造完了,以post請求的方式來訪問http://localhost:8002/refresh
就會更新修改後的配置文件。
咱們再次來測試,首先訪問http://localhost:8002/hello
,返回:hello im dev
,我將庫中的值修改成hello im dev update
。在win上面打開cmd執行curl -X POST http://localhost:8002/refresh
,返回["neo.hello"]
說明已經更新了neo.hello
的值。咱們再次訪問http://localhost:8002/hello
,返回:hello im dev update
,客戶端已經獲得了最新的值。
每次手動刷新客戶端也很麻煩,有沒有什麼辦法只要提交代碼就自動調用客戶端來更新呢,github的webhook是一個好的辦法。
WebHook是當某個事件發生時,經過發送http post請求的方式來通知信息接收方。Webhook來監測你在Github.com上的各類事件,最多見的莫過於push事件。若是你設置了一個監測push事件的Webhook,那麼每當你的這個項目有了任何提交,這個Webhook都會被觸發,這時Github就會發送一個HTTP POST請求到你配置好的地址。
如此一來,你就能夠經過這種方式去自動完成一些重複性工做,好比,你能夠用Webhook來自動觸發一些持續集成(CI)工具的運做,好比Travis CI;又或者是經過 Webhook 去部署你的線上服務器。下圖就是github上面的webhook配置。
Payload URL
:觸發後回調的URLContent type
:數據格式,兩種通常使用jsonSecret
:用做給POST的body加密的字符串。採用HMAC算法events
:觸發的事件列表。events事件類型 | 描述 |
---|---|
push | 倉庫有push時觸發。默認事件 |
create | 當有分支或標籤被建立時觸發 |
delete | 當有分支或標籤被刪除時觸發 |
svn也有相似的hook機制,每次提交後會觸發post-commit腳本,咱們能夠在這裏寫一些post請求
這樣咱們就能夠利用hook的機制去觸發客戶端的更新,可是當客戶端愈來愈多的時候hook支持的已經不夠優雅,另外每次增長客戶端都須要改動hook也是不現實的。其實Spring Cloud給了咱們更好解決方案,後面文章來介紹。