springcloud 使用git作為配置中心
首先,需要明確一個配置中心提供的核心功能應該有什麼
- 提供服務端和客戶端支援
- 集中管理各環境的配置檔案
- 配置檔案修改之後,可以快速的生效
- 可以進行版本管理
- 支援大的併發查詢
- 支援各種語言
Spring Cloud Config可以完美的支援以上所有的需求。
Spring Cloud Config專案是一個解決分散式系統的配置管理方案。它包含了Client和Server兩個部分,server提供配置檔案的儲存、以介面的形式將配置檔案的內容提供出去,client通過介面獲取資料、並依據此資料初始化自己的應用。Spring cloud使用git或svn存放配置檔案,本專案以git做為示例。
git配置中心
建立git倉庫,存放配置檔案
首先,在git中建立一個倉庫,存放我們的配置檔案,如下:建立了一個倉庫叫做:spring-cloud-demo,建立一個資料夾:config-repo,存放兩個配置檔案:config-dev.properties,config-test.properties
比如,我們經常需要配置我們的資料來源,我們配置了兩個資料來源,生產環境的配置儲存在config-dev.properties中:
同樣的,在測試環境的配置儲存在config-test.properties中。
提供端
新增依賴:
在server端中新增依賴,(當然了,spring-boot的依賴也得要的)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
本地配置
首先,新增如下配置:
eureka: client: service-url: defaultZone: http://localhost:9999/eureka/ #將服務註冊到那個註冊中心去 server: port: 7777 spring: application: name: demo-provider cloud: config: server: git: uri: https://github.com/aBreaking/spring-cloud-demo/ #github 倉庫地址 search-paths: config-repo #配置中心 username: github賬號 password: github密碼
啟動類註解
在啟動類中新增@EnableConfigServer註解
@SpringBootApplication
@EnableConfigServer
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
啟動provider
這裡的地址為:ip:port/配置檔名。可看到如下:
你會看到如下:你的配置中心的資訊
即配置中心搭建成功。
使用端
新增依賴
在client端中新增依賴:(當然了,spring-boot的依賴也得要的)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
本地配置
此時,有兩種呼叫方式,一種是直接根據server端的地址(ip:port)來進行配置呼叫,第二種是server端作為provider註冊到註冊中心去。很明顯,第二種方式的配置要優於第一種,因為server端的地址一旦改變的話,那麼client端還得做配置的修改,很麻煩,此外,為了保證保證高可用,可以配置多個server端,如果某一臺server掛掉,也不會有影響。
1、直接使用server端
新增一個配置檔案:bootstrap.properties。spring初始化時會先載入該配置檔案,載入順序優於applicaiton.properties。新增內容如下:
spring.cloud.config.name=config
spring.cloud.config.profile=test
spring.cloud.config.uri=http://localhost:7777
spring.cloud.config.label=master
同樣application.properties中也得有配置:
spring.application.name=demo-consumer
server.port=8888
2、從註冊中心中獲取
那麼,首先,需要將server註冊到註冊中心去,正常的服務註冊操作即可。可參考
server端註冊到註冊中心後,client端bootstrap.properties進行配置:
spring.cloud.config.name=config
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true
spring.cloud.config.discovery.service-id=demo-provider #server端的應用名
eureka.client.service-url.defaultZone=http://localhost:9999/eureka/ #註冊中心的地址
建立controller
接下來直接使用即可。建立一個controller,如下:
@RestController
public class ClientController {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@RequestMapping("/test")
public String test(){
return "測試環境資料來源連線資訊:url:"+url+",username:"+username+",password:"+password;
}
}
啟動專案
動態重新整理
一個問題
配置中心就這樣能夠搭建成功。那麼一個問題來了:
我們修改一下配置檔案,再push到遠端倉庫,這時,我們再次訪問server端:http://localhost:7777/config-dev.properties,OK,你會發現,server端正常重新整理了資料,即跟遠端倉庫的資料是同步的,沒問題。這時,我們再訪問下client端:http://localhost:8888/test,發現client端並沒有動態重新整理資料,還是老的資料。所以,我們還得需要為client端動態重新整理。
新增依賴
只需要對client端進行操作即可,新增spring-boot-starter-actuator依賴。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
Controller添加註解
還得需要對client端具體的Controller新增@RefreshScope註解,使用該註解的類,會在接到SpringCloud配置中心配置重新整理的時候,自動將新的配置更新到該類對應的欄位中。
@RestController
@RefreshScope // 使用該註解的類,會在接到SpringCloud配置中心配置重新整理的時候,自動將新的配置更新到該類對應的欄位中。
public class ClientController {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@RequestMapping("/ds")
public String ds(){
return "測試環境資料來源連線資訊:url:"+url+",username:"+username+",password:"+password;
}
refresh重新整理
正常啟動專案後,每次配置檔案資料修改後,client要想同步,需要以post的方式訪問url:http://localhost:8888/refresh這個地址,才能進行同步,如下:
後記
如果consumer啟動出現如下異常:java.lang.IllegalArgumentException: Could not resolve placeholder 'jdbc.url' in value "${jdbc.url}"。
確保consumer專案中沒有spring-cloud-config-server依賴