介紹完服務的容錯保護處理,接下來咱們來了解下關於分佈式配置中心的相關知識和使用。衆所周知,隨着項目的愈來愈多,日益龐大,每一個子項目都會伴隨着不一樣的配置項,於此也就多了不少的配置文件。假若某些配置信息修改,可能就會伴隨着一系列配置文件的更新和相應服務的重啓操做了。這對於實施而言,也是噩夢通常的存在,增長了一系列運維成本,也會無形中提升出錯的機率。因此在微服務愈來愈多時,就會引入今天要講解的分佈式配置中心,它就是來解決此類問題的。話很少說,開始吧~html
在寫這篇文章以前,在公衆號裏有推送了一篇《爲何須要分佈式配置中心》的文章。裏面也大體說明了,你們能夠看一看。簡單來講,就是隨着業務的發展、微服務架構的升級,服務的數量、程序的配置日益增多(各類微服務、各類服務器地址、各類參數),傳統的配置文件方式和數據庫的方式已沒法知足開發人員對配置管理的要求,即java
安全性:配置跟隨源代碼保存在代碼庫中,容易形成配置泄漏;git
時效性:修改配置,須要重啓服務才能生效;github
侷限性:沒法支持動態調整:例如日誌開關、功能開關;web
其實說白了,就是當業務需求有變動時,能夠經過修改配置文件或者參數的形式,可以自動更新配置。減小沒必要要的重啓服務的操做。正常狀況下,通常的業務系統都有個參數配置表的,裏面記錄着不一樣業務參數,以此來應對不一樣的需求場景,也就是需求口中常說的:要能靈活配置。spring
而在微服務中,因爲每一個微服務都是獨立的數據庫,傳統的配置沒法知足了。因此纔出現了分佈式配置中心服務,專門來解決此類問題的。數據庫
在微服務架構中,微服務的統一配置管理通常有如下需求:json
綜上所述,對於微服務架構而言,一個通用的配置管理機制必不可少,常見作法是使用配置服務器管理配置。目前市面上開源的配置中心有不少,如bootstrap
具體的能夠看看以前說的文章《爲何須要分佈式配置中心》,這裏就不過多闡述了。緩存
Spring Cloud Config
爲分佈式系統外部化配置提供了服務端和客戶端的支持,它包括Config Server
和Config Client
兩部分。目前支持git
、svn
、vault
、jdbc
和本地
幾種存儲方式。
最經常使用的存儲方式就是git
了。
簡單來講,各客戶端程序經過訪問服務端獲取相應的配置信息。接下來咱們看看下面這張圖
從上圖能夠看出,Config Server
巧妙地經過git clone
將配置信息存於本地,起到了緩存的做用,即便當Git
服務端沒法訪問的時候,依然能夠取Config Server
中的緩存內容進行使用。
這裏以git爲例,作個簡單示例。 首先,在github中建立一個目錄:spring-cloud-config-repo
,來存放配置文件信息。
my-config-client-dev.properties
config=this is dev!
my-config-client-dev.properties
config=this is test!
注意:由於存在多個項目都是用配置中心問題,而每一個項目的應用名稱是不盡相同的,因此配置文件的命名方式即爲: 應用名
+環境變量(profile)
的命名方式。所以,每一個應用理應設置應用名稱,是個好習慣。具體的映射規則,在Server端
會進行說明的。
建立工程:spring-cloud-confg-server
0.引入pom依賴。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency>
1.啓動類加入@EnableConfigServer註解,聲明是ConfigServer
。
@SpringBootApplication @EnableConfigServer @Slf4j public class SpringCloudConfigServerApplication { public static void main(String[] args) throws Exception { SpringApplication.run(SpringCloudConfigServerApplication.class, args); log.info("spring-cloud-config-server啓動!"); } }
2.配置文件,添加git倉庫相關信息。
spring.application.name=spring-cloud-config-server server.port=5678 #配置文件git配置 spring.cloud.config.server.git.uri=https://github.com/xie19900123/spring-cloud-learning.git # 搜索路徑,即配置文件的目錄,可配置多個,逗號分隔。默認爲根目錄。 spring.cloud.config.server.git.searchPaths=spring-cloud-config-repo # git用戶名和密碼 針對私有倉庫而言須要填寫 spring.cloud.config.server.git.username= spring.cloud.config.server.git.password=
3.啓動應用,訪問http://127.0.0.1:5678/my-config-client-dev.properties ,返回了配置文件的信息,說明已經讀取到遠程倉庫信息了。
咱們能夠經過訪問配置信息的URL與配置文件的映射關係,獲取相應的配置信息。
/{application}/{profile}[/{label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.properties
url會映射{application}-{profile}.properties對應的配置文件, 其中{label}對應Git上不一樣的分支,默認爲master。咱們能夠嘗試構造不一樣的url來訪問不一樣的配置內容, 好比: 要訪問master
分支,my-config-client
應用的dev環境
http://127.0.0.1:5678/my-config-client/dev/master
返回的信息:
{ "name": "my-config-client", "profiles": ["dev"], "label": "master", "version": "51d81a5aacce45b97af6db2482769fe02873c548", "state": null, "propertySources": [{ "name": "https://github.com/xie19900123/spring-cloud-learning.git/spring-cloud-config-repo/my-config-client-dev.properties", "source": { "config": "this is dev!" } }] }
此時,查看控制檯,能夠獲悉本地也保存着一份配置信息。
2018-10-09 23:32:46.833 INFO 988 --- [nio-5678-exec-2] o.s.c.c.s.e.NativeEnvironmentRepository : Adding property source: file:/C:/Users/xiede/AppData/Local/Temp/config-repo-7233984840222622045/spring-cloud-config-repo/my-config-client-dev.properties 2018-10-09 23:32:46.834 INFO 988 --- [nio-5678-exec-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@66e76432: startup date [Tue Oct 09 23:32:46 CST 2018]; root of context hierarchy
查看本地倉庫目錄:
此時,修改遠程的配置文件,再次訪問能夠看見返回的參數是最新修改後的參數值了,你們能夠自行試試。
建立一個客戶端:spring-cloud-confg-client
。固然也能夠改造原來的應用了,只需加入相應pom文件和配置文件便可。 0.加入pom依賴。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
1.建立啓動類,就是一個正常的web應用。
/** * Spring Cloud Config client 示例 * @author oKong * */ @SpringBootApplication @Slf4j public class SpringCloudConfigClientApplication { public static void main(String[] args) throws Exception { SpringApplication.run(SpringCloudConfigClientApplication.class, args); log.info("spring-cloud-config-client啓動!"); } }
2.配置文件添加:bootstrap.properties
和常規的application.properties
。
bootstrap.properties
# 設置分支 spring.cloud.config.label=master # 環境變量 spring.cloud.config.profile=dev # 是否使用註冊中心方式進行獲取 後續會進行講解 #spring.cloud.config.discovery.enabled=false # 服務端地址 # 在不使用註冊中心模式下 直接填寫實際地址 spring.cloud.config.uri=http://127.0.0.1:5678 # 註冊中心應用id 下一章節會進行講解 #spring.cloud.config.discovery.service-id=
application.properties
# 設置應用名稱,須要和配置文件匹配 spring.application.name=my-config-client server.port=5666
這裏須要注意:
spring-cloud-config
相關的屬性必須配置在bootstrap.properties
中,config部份內容才能被正確加載。由於config的相關配置會先於application.properties
,而bootstrap.properties
的加載也是先於application.properties
。
3.編寫一個控制層,利用@Value
進行參數測試。
/** * config client 簡單示例 * @author oKong * */ @RestController public class DemoController { @Value("${config}") String config; @GetMapping("/") public String demo() { return "返回的config參數值爲:" + config; } }
4.啓動應用,訪問:http://127.0.0.1:5666/ ,能夠看見配置信息已經被正確返回了。
自此,一個簡單的配置中心示例就結束了。 目前爲止,咱們尚未手動去修改遠程的配置文件參數值,能夠試試,在修改後,客戶端去返回相應的參數值,會發現仍是舊的,並無進行更新操做。由於配置文件是是在應用啓動的時候進行加載的,並且遠程倉庫修改了配置文件,客戶端並不知道已經修改了,不會發起請求的。關於配置參數自動更新相關知識點,會在下一章節進行講解的。
本章節主要講解了常規操做下,如何使用
SpringCloudConfig
進行統一參數配置管理。針對配置動態刷新,實時生效相關知識點,會在下一章節進行單獨講解的,本章節先讓你們有個直觀的認識,瞭解下SpringCloudConfig
實現的一些機制。本文僅僅是講解了git
示例,有興趣的同窗能夠試試其餘的,好比svn
或者本地資源庫
等形式。都是相似配置,就不加以說明了。
目前互聯網上大佬都有分享
SpringCloud
系列教程,內容可能會相似,望多多包涵了。原創不易,碼字不易,還但願你們多多支持。若文中有錯誤之處,還望提出,謝謝。
499452441
lqdevOps
我的博客:http://blog.lqdev.cn
源碼示例:https://github.com/xie19900123/spring-cloud-learning
原文地址:http://blog.lqdev.cn/2018/10/10/SpringCloud/chapter-seven/