Spring Cloud Config(配置中心)java
你們好,有一段時間沒有寫技術博客了。因爲工做上的事情,這方面很難分配時間。近幾年隨着服務化的興起,一批服務化的框架應運而生,像dubbo,thrift,spring-cloud等。在國內使用dubbo的公司很是多,dubbo也是java程序員面試時必備知識點,並且它的官方文檔寫的很是清晰易懂,這都使得dubbo的普及很是容易。thrift是apache貢獻的,彷佛也流行了一段時間,小編對這個框架不是很瞭解。隨後spring-cloud一經推出,便在技術圈流行起來,這段時間小編也在學習spring-cloud,將學到的東西和你們分享一下,若是有不對的地方,還請你們多多指正。mysql
1、簡介git
Spring Cloud Config爲分佈式系統中的外部配置提供服務器和客戶端支持。使用Config Server,您能夠爲全部環境中的應用程序管理其外部屬性。它很是適合spring應用,也可使用在其餘語言的應用上。隨着應用程序經過從開發到測試和生產的部署流程,您能夠管理這些環境之間的配置,並肯定應用程序具備遷移時須要運行的一切。服務器存儲後端的默認實現使用git,所以它輕鬆支持標籤版本的配置環境,以及能夠訪問用於管理內容的各類工具。程序員
Spring Cloud Config服務端特性github
Config客戶端的特性(特指Spring應用)面試
入門示例:spring
只要classpath下有Spring Boot Actuator和Spring Config Client,Spring Boot應用就會嘗試鏈接配置服務http://localhost:8888,這個地址是spring.cloud.config.uri的默認地址。若是你想修改這個地址,你能夠在bootstrap.[yml或properties]中設置spring.cloud.config.uri或者經過系統屬性或者經過環境變量。sql
@Configuration
@EnableAutoConfiguration
@RestController
public class Application {
@Value("${config.name}")
String name = "World";
@RequestMapping("/")
public String home() {
return "Hello " + name;
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
上面例子中的config.name能夠來自本地的配置文件,也能夠來自遠程的配置服務。默認狀況下,遠程的配置服務將優先使用。apache
爲了運行你本身的配置服務中心,你可使用spring-cloud-config-server依賴,和@EnableConfigServer註解。若是你設置了spring.config.name=configserver,應用將會運行在8888端口,而且從一個樣本倉庫提供數據。你須要設置spring.cloud.config.server.git.uri來指定你本身的配置數據。默認的,它是一個git倉庫,也能夠配置成本地的文件系統。bootstrap
2、Spring Cloud Config服務端
服務器爲外部配置(鍵稱值對或等效的YAML內容)提供了基於資源的HTTP。它能夠在Spring Boot應用中使用@EnableConfigServer內嵌。例子以下:
@SpringBootApplication
@EnableConfigServer
public class SpringCloudConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudConfigServerApplication.class, args);
}
}
像全部的Spring Boot應用同樣,它默認運行在8080端口,你能夠經過多種方式將其切換到8888端口。最簡單的能夠設置spring.config.name=configserver(在Config Server的jar包有一個configserver.yml),它設置了一個默認的配置倉庫。另一種方式是使用你本身的application.properties,這也是小編推薦的方式:
server.port: 8888
spring.cloud.config.server.git.uri: git地址
git地址中是你的YAML或者properties文件。
環境倉庫
你想在哪裏存儲配置數據?支持這種行爲的策略是EnvironmentRepository,它服務於Environment實例。這個Environment是Spring Environment的一個淺副本。Environment經過3個變量被參數化。
倉庫的實現一般表現的像Spring boot加載配置文件同樣,"spring.config.name"等於{application}參數, "spring.profiles.active" 等於{profile}參數。profiles的優先規則和正常的規則是同樣的,活動的profiles優於默認的。若是有多個profiles,則最後一個勝出。
客戶端的配置實例:
spring:
application:
name: foo
profiles:
active: dev,mysql
在Spring Boot應用中,這些參數也能夠經過環境變量或者命令行參數設置。
git後端
EnvironmentRepository的默認實現是使用git後端,它對管理更新、物理環境和審覈更改很是的方便。要改變倉庫的地址,你能夠在配置服務端設置"spring.cloud.config.server.git.uri"屬性(在application.properties文件中)。若是你用file:開頭設置它,它將從本地倉庫運行,這樣能夠在沒有服務端的狀況下很是快速和簡單的啓動。這種狀況,服務端將直接在本地倉庫中運行。爲了擴展配置服務並使它高可用,你須要把服務的全部實例指向同一個倉庫,所以只有共享文件系統能夠工做。即便在這種狀況下,最好使用共享文件系統存儲庫的ssh:協議,以便服務器能夠將其克隆並使用本地工做副本做爲緩存。
該倉庫的實現將HTTP資源中的{label}參數映射到git的標籤(提交id、分支名稱或者tag)。若是git分支或者tag名稱中包含「/」,則HTTP URL中的label要使用特殊字符「(_)」代替。例如:若是分支的名稱是foo/bar,則HTTP中的label的格式爲foo(_)bar。這個特殊字符也能夠用到{application}參數中。
git URI中的佔位符
Spring Cloud Config Server支持在git URL中使用佔位符,使用{application} 和 {profile}(若是使用{label},請記住它是使用在git標籤中的)。所以你能夠輕鬆的支持「一個應用一個倉庫」的原則。以下:
spring:
cloud:
config:
server:
git:
uri: https://github.com/myorg/{application}
或者一個環境一個倉庫的原則,使用{profile}代替{application}。另外在{application}參數中使用特殊字符"(_)"能夠支持多組織。
spring:
cloud:
config:
server:
git:
uri: https://github.com/{application}
{application}參數的格式爲"organization(_)application"。
模式匹配和多倉庫
在{application}和{profile}參數中使用模式匹配能夠支持更多複雜的需求。模式的格式是一組逗號分隔的{application}/{profile},其中的參數可使用通配符。例如:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
repos:
simple: https://github.com/simple/config-repo
special:
pattern: special*/dev*,*special*/dev*
uri: https://github.com/special/config-repo
local:
pattern: local*
uri: file:/home/configsvc/config-repo
若是{application}/{profile}沒有匹配到任何模式,它將使用默認的倉庫地址:spring.cloud.config.server.git.uri。上面的例子中,"simple"倉庫匹配的是「simple/*」(它僅僅匹配一個倉庫simple,在全部的環境下)。"local"倉庫將匹配全部{application}的名字以「local」開頭的,而且也是在全部的環境下。「/*」前綴自動添加到全部沒有設置{profile}的模式中。
每個倉庫也能夠在子目錄下存儲配置文件,模式匹配也能夠用於搜索這些目錄,須要制定searchPaths,以下:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
searchPaths: foo,bar*
上面的例子中,將在foo和以bar開頭的目錄中,搜索配置文件。
默認地,服務器在第一次請求配置文件時克隆遠程的倉庫,服務器也能夠配置在啓動的時候克隆倉庫,以下:
spring:
cloud:
config:
server:
git:
uri: https://git/common/config-repo.git
repos:
team-a:
pattern: team-a-*
cloneOnStart: true
uri: http://git/team-a/config-repo.git
team-b:
pattern: team-b-*
cloneOnStart: false
uri: http://git/team-b/config-repo.git
team-c:
pattern: team-c-*
uri: http://git/team-a/config-repo.git
在上面的例子team-a的倉庫將在服務端啓動時進行克隆,其餘的倉庫將在第一次請求時克隆。
認證
若是遠程的git倉庫須要用戶名和密碼,能夠參照下面的例子
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
username: trolley
password: strongpassword
到此,Spring Cloud Config服務端就介紹到這裏,還有一些不經常使用的功能在這裏就不介紹了,你們能夠參照spring cloud官網。Spring Cloud Config服務端的代碼示例能夠參照個人GitHub地址:https://github.com/bigbugliu/spring-cloud-config-server。
3、Spring Cloud Config 客戶端
Spring Boot應用能夠當即使用Spring Config Server。只要在classpath中有Spring Cloud Config Client的jar包,這個應用就會請求配置的服務端。他將使用綁定的配置服務器(spring.cloud.config.uri中配置的)的屬性初始化spring環境。
在某些狀況下,若是服務沒法鏈接到配置服務器,則可能但願啓動服務失敗。若是這是所需的行爲,請設置引導配置屬性spring.cloud.config.failFast=true
,客戶端將以異常中止。
若是您但願配置服務器在您的應用程序啓動時可能偶爾不可用,您能夠要求它在發生故障後繼續嘗試。首先,您須要設置spring.cloud.config.failFast=true,而後您須要將spring-retry和spring-boot-starter-aop添加到您的類路徑中。默認行爲是重試6次,初始退避間隔爲1000ms,指數乘數爲1.1,用於後續退避。您可使用spring.cloud.config.retry.*配置屬性配置這些屬性(和其餘)。
詳細代碼請參考個人GitHub:https://github.com/bigbugliu/spring-boot-demo。
Spring Cloud Config就介紹完了,歡迎你們在評論區討論。