分佈式配置中心
爲何要有用分佈式配置中心這玩意兒?如今這微服務大軍已經覆蓋了各類大小型企業,每一個服務的粒度相對較小,所以系統中會出現大量的服務,每一個服務都要有本身都一些配置信息,或者相同的配置信息,可能不一樣環境每一個服務也有單獨的一套配置,這種狀況配置文件數量比較龐大,維護起來至關費勁,舉個栗子:
在開發的過程當中,通常數據庫是開發環境數據庫,全部服務DB的IP配置爲:92.168.0.1,忽然老大說,開發環境換了,DB的IP要修改,這下可很差受了,全部模塊挨個修改DB的配置,就問你難受不難受?
這個時候分佈式配置中心就發揮了很大的優點,只須要修改配置中心配置,全部服務便可自動生效,爽不爽!java
<!-- more -->git
Spring Cloud Config
官網地址:http://cloud.spring.io/spring-cloud-config/spring
簡介
Spring Cloud Config
爲服務端和客戶端提供了分佈式系統的外部化配置支持。配置服務器爲各應用的全部環境提供了一箇中心化的外部配置。它實現了對服務端和客戶端對Spring Environment
和PropertySource
抽象的映射,因此它除了適用於Spring構建的應用程序,也能夠在任何其餘語言運行的應用程序中使用。做爲一個應用能夠經過部署管道來進行測試或者投入生產,咱們能夠分別爲這些環境建立配置,而且在須要遷移環境的時候獲取對應環境的配置來運行。數據庫
置服務器默認採用git來存儲配置信息,這樣就有助於對環境配置進行版本管理,而且能夠經過git客戶端工具來方便的管理和訪問配置內容。固然他也提供本地化文件系統的存儲方式。json
使用 spring Cloud 進行集中式配置管理,將以往的配置文件從項目中摘除後放到Git 或svn中集中管理,並在須要變動的時候,能夠通知到各應用程序,應用程序刷新配置不須要重啓。bootstrap
實現原理
其實這個實現原理相對比較簡單一些,基於git的交互操做。springboot
- 咱們把配置文件存放到git上面
- Spring Cloud Config配置中心服務鏈接git
- 客戶端須要配置配置信息從配置中心服務獲取
- 當客戶端啓動,會從配置中心獲取git上面的配置信息
配置中心服務端
pom.xml添加依賴服務器
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <!-- spring cloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Application啓動類添加註解app
添加@EnableConfigServer
註解,啓用配置中心:分佈式
package com.qianxunclub; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; /** * @author chihiro.zhang */ @SpringBootApplication @EnableConfigServer public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
配置文件
在application.yml
或者application.properties
添加配置信息:
spring: cloud: config: server: git: uri: https://gitee.com/qianxunclub/spring-boot-config-repo default-label: master search-paths: /** basedir: target/config
- spring.cloud.config.server.git.uri:配置git倉庫地址
- spring.cloud.config.server.git.search-paths:倉庫文件夾目錄,若是是
/**
,就是全部目錄全部文件 - spring.cloud.config.server.git.default-label:配置倉庫的分支
- spring.cloud.config.server.git.basedir:配置文件拉去到本地的目錄位置
啓動測試
首先在git裏面添加一個application-dev.yml
配置文件,內容如此下:
test: 我是配置中心配置信息
已經配置完成了,啓動一波試試,看效果咋樣,正常狀況下是能夠正常啓動的,而後獲取配置文件試試
訪問地址:http://localhost:8888/test/dev
若是返回以下,就是成功了:
{ "name":"test", "profiles":[ "dev" ], "label":null, "version":"64e7882a8f280641724e454a2db5a3da7b44d3d4", "state":null, "propertySources":[ { "name":"https://gitee.com/qianxunclub/spring-boot-config-repo/application-dev.yml", "source":{ "test":"配置中心的配置信息" } } ] }
http請求地址和資源文件映射以下:
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
配置中心客戶端使用
pom.xml添加依賴
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <!-- spring cloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Edgware.SR3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
配置文件
建立bootstrap.yml
文件,切記,是bootstrap.yml
文件bootstrap.yml
文件,我就由於寫到了application.yml
這個裏面,各類出現問題啊,添加以下配置:
spring: cloud: config: name: application profile: dev label: master uri: http://localhost:8888/
- spring.cloud.config.label:指明遠程倉庫的分支
- spring.cloud.config.profile:指定不一樣環境配置文件,和git倉庫的
application-dev.yml
對應 - spring.cloud.config.name:配置名稱,通常和git倉庫的
application-dev.yml
對應 - spring.cloud.config.uri:上面的配置中心服務地址
啓動測試
先添加一個獲取配置信息的類:
/** * @author chihiro.zhang */ @Configuration @EnableAutoConfiguration public class DemoConfiguration { @Value("${test}") private String test; }
找個地方隨便調用一下,輸出這個test,就會打印上面git裏面配置的信息了,爽不!
說說中間遇到的坑
- 服務端git配置死活獲取不了git倉庫配置文件
spring: cloud: config: server: git: uri: https://gitee.com/qianxunclub/spring-boot-config-repo default-label: master search-paths: /** basedir: target/config
當時這個uri
配置的是公司的git倉庫,公司的git倉庫訪問是須要開代理纔能有權限訪問的,代理也開了,但是一直報錯:
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Wed Jun 06 11:10:56 CST 2018 There was an unexpected error (type=Not Found, status=404). Cannot clone or checkout repository: http://xxx.com:5080/framework/config-repo
很鬱悶,不知道爲啥,但是就在剛剛,就剛剛,寫博客的時候,有測試了一下,通了。。。。日了狗了,不知道啥緣由,等研究出來了再來補充。
- 客戶端配置必定要配置在
bootstrap.yml
裏面uri
默認會調用端口爲8888
的地址http://localhost:8888/
啓動的時候,會加載label
和uri
,profile
配置,profile
能夠在啓動參數添加,profile
也能夠加在application.yml
添加
name
也能夠加在application.yml
添加
demo
配置中心服務端:https://gitee.com/qianxunclub/qianxunclub-springboot-config
配置git倉庫:https://gitee.com/qianxunclub/qianxunclub-springboot-config
配置客戶端使用:https://gitee.com/qianxunclub/qianxunclub-starter-demo
客戶端主要配置在:https://gitee.com/qianxunclub/qianxunclub-starter-parent/tree/master/qianxunclub-starter-config