springcloud 總集:www.tapme.top/blog/detail…java
在開發普通的 web 應用中,咱們一般是將配置項寫在單獨的配置文件中,好比application.yml
,application.properties
,可是在微服務架構中,可能會出現數百個微服務,若是每一個微服務將配置文件寫在自身的配置文件中,會致使配置文件的管理很是複雜。所以集中式的配置管理是很是有必要的,每一個服務啓動時從集中式的存儲庫中讀取須要的配置信息。其模型以下:git
簡單來講就是以下幾點:github
因爲本系列爲 spring cloud,因此使用Spring Cloud Config
來構建配置管理,固然還有不少其餘優秀的解決方案(Etcd,Eureka,Consul...)。web
spring cloud 是創建在 spring boot 的基礎上的,所以須要有 spring boot 的構建基礎。spring
pom 主要依賴以下(篇幅緣由列出主要內容,完整代碼請到 github 上查看),spring boot 版本和 spring cloud 版本以下,以後不在贅述:數據庫
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.4.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Camden.SR5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
複製代碼
只需在 spring boot 啓動類上加入一個@EnableConfigServer
註解便可。json
這裏是給配置服務使用的配置文件,用於聲明端口,存儲庫類別等信息,並非給其餘微服務使用的配置。配置以下(使用文件存儲配置信息):bootstrap
server:
port: 8888
spring:
profiles:
# 使用文件系統來存儲配置信息,須要設置爲native
active: native
cloud:
config:
server:
native:
# 使用文件來存放配置文件,爲每一個應用程序提供用逗號分隔的文件夾列表
searchLocations: file:///D:/configFolder/licensingservice
複製代碼
經過上面的searchLocations
可知目前有一個名爲 licensingservice 的應用程序,在對應目錄下建立以下三個配置文件:springboot
server:
port: 10010
spring:
application:
name: licensingservice
複製代碼
server:
port: 10011
複製代碼
server:
port: 10012
複製代碼
配置文件命名約定爲:應用程序名稱-環境名稱.yml
。如今啓動應用便能經過 http 請求來獲取配置了。服務器
請求localhost:8888/licensingservice/default,返回結果以下:
{
"name": "licensingservice",
"profiles": ["default"],
"label": null,
"version": null,
"state": null,
"propertySources": [
{
"name": "file:///D:/configFolder/licensingservice/licensingservice.yml",
"source": {
"server.port": 10001,
"spring.application.name": "licensingservice"
}
}
]
}
複製代碼
請求localhost:8888/licensingservice/dev,返回結果以下:
{
"name": "licensingservice",
"profiles": ["dev"],
"label": null,
"version": null,
"state": null,
"propertySources": [
{
"name": "file:///D:/configFolder/licensingservice/licensingservice-dev.yml",
"source": {
"server.port": 10011
}
},
{
"name": "file:///D:/configFolder/licensingservice/licensingservice.yml",
"source": {
"server.port": 10001,
"spring.application.name": "licensingservice"
}
}
]
}
複製代碼
上面寫了如何使用 spring cloud config 構建配置服務,這一節來構建 licensingserivce 服務,使用上面的配置服務來獲取配置文件。
建立 springboot 項目 licensingservice,主要依賴以下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
複製代碼
共兩個配置文件,application.yml
,bootstrap.yml
application.yml
本配置文件用於存放留在本地配置信息,若是存在同名配置,本地的會被覆蓋,不會生效
server:
port: 10099
複製代碼
bootstrap.yml
給 spring cloud config client 讀取的配置文件,根據該配置向配置中心請求
spring:
application:
#指定名稱,以便spring cloud config客戶端知道查找哪一個配置
name: licensingservice
profiles:
#指定環境(default,dev,prod)
active: dev
cloud:
config:
#指定config server地址
uri: http://localhost:8888
複製代碼
PS:若是想要覆蓋 bootstrap.yml 的配置可在啓動命令加上-d 參數,如:
java -Dsptring.cloud.config.uri=.... -Dspring.profiles.active=prod xxxxx.jar
啓動 licensingservice 能夠發現啓動端口爲 10011,說明遠程讀取配置生效了。
在 github 某個倉庫下建立配置文件,好比在github.com/FleyX/demo-…倉庫下的springcloud/config目錄下建立 licengingservice 服務的配置文件。
修改 confsvr 中的 application.yml
server:
port: 8888
spring:
profiles:
# 使用文件系統來存儲配置信息,須要設置爲native,git設置爲git
active: git
application:
name: test
cloud:
config:
server:
native:
# 使用文件來存放配置文件,爲每一個應用程序提供用逗號分隔的文件夾列表
searchLocations: file:///D:/configFolder/licensingservice
git:
uri: https://github.com/FleyX/demo-project
# 查找配置文件路徑(,分隔)
search-paths: springcloud/config/licensingservice
#若是爲公開倉庫,用戶名密碼可不填寫
username:
password:
#配置git倉庫的分支
label: master
複製代碼
從新啓動,便可發現配置成功生效。
使用 spring cloud 配置服務器時,有一個問題是如何在屬性變化時動態刷新應用程序。spring cloud 配置服務始終提供最新版本的屬性,對低層存儲庫屬性的更改將會是最新的。可是 config client 並不會知道配置的變動,所以不會自動刷新屬性。
Spring Boot Actuator 提供了一個@RefreshScope
屬性來從新讀取應用程序配置信息,開發人員可經過/refresh
進行刷新。該註釋須要註釋在啓動入口類上。注意:只會加載自定義 Spring 屬性,例如數據庫,端口等配置不會從新加載。
本篇只是用到了 spring-cloud-config 這個來進行配置集中管理,並無涉及到微服務,在下一篇將開始微服務的學習。 本篇兩個項目代碼存放於:點擊跳轉