springcloud 總集:https://www.tapme.top/blog/detail/2019-02-28-11-33java
在開發普通的 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 某個倉庫下建立配置文件,好比在https://github.com/FleyX/demo-project倉庫下的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 這個來進行配置集中管理,並無涉及到微服務,在下一篇將開始微服務的學習。
本篇兩個項目代碼存放於:點擊跳轉