最近一致在更新Spring Cloud Config的相關內容,主要也是爲這篇埋個伏筆,相信很多調研過Spring Cloud Config的用戶都會吐槽它的管理能力太弱。所以,就有了下面爲講推薦的這個開源項目,但願對已經入坑Spring Cloud Config的童鞋們有所幫助!
在Spring Cloud的微服務架構方案中雖然提供了Spring Cloud Config來擔任配置中心的角色,可是該項目的功能在配置的管理層面仍是很是欠缺的。初期咱們能夠依賴選取的配置存儲系統(好比:Gitlab、Github)給咱們提供的配置管理界面來操做全部的配置信息,可是這樣的管理仍是很是粗粒度的,所以這個項目的目的就是解決這個問題,經過此項目,咱們將提供一套基於Spring Cloud Config配置中心的可視化管理系統。前端
在該項目中,咱們對於服務治理、配置存儲、可視化操做都作了抽象,只要目的就是爲了儘量的兼容全部Spring Cloud Config的用戶。任何Spring Cloud Config僅須要經過一些簡單的配置,或者遷移工具就能將原來正在使用的配置中心統一的管理起來。java
項目地址mysql
若是您以爲該項目對您有用,歡迎Star、Follow支持咱們!
本項目採用了先後端分離的架構,經過core模塊抽象了前端須要的操做,再經過persistence和discovery模塊隔離不一樣的配置倉庫和不一樣的服務註冊中心,從而達到前端程序不須要關心到底使用了什麼存儲配置以及使用了什麼註冊中心,這樣用戶能夠根據本身的須要自由的組合不一樣的配置存儲和服務治理機制,儘量的匹配大部分Spring Cloud用戶的需求。git
因爲SCCA的架構對各個功能模塊作了比較細緻的拆分,因此它存在多種不一樣模式的部署方式,因此它既能夠爲已經在使用Spring Cloud Config提供服務,也能夠爲從零開始使用Spring Cloud Config的用戶。github
在SCCA中咱們的可部署內容自底向上分爲三個部分:web
Spring Cloud 配置中心
:基於Spring Cloud Config構建的配置中心服務端。SCCA REST 服務端
:SCCA的核心模塊,實現了SCCA配置管理的持久化內容以及全部的管理操做API。SCCA UI 服務端
:SCCA的前端模塊,實現了可視化的配置管理操做界面。下面咱們來看看SCCA支持哪些多樣的部署方式。redis
全分離模式就是將上述三個部分都以獨立的進程進行部署,每個部分均可以作高可用,具體部署結構能夠以下圖所示:spring
這種模式既能夠適用於已經在使用Spring Cloud Config的用戶,也適用於正準備開始適用的用戶。其中,位於最底層的Spring Cloud配置中心
就是一個最原始的Spring Cloud Config Server。因此,對於已經在使用Spring Cloud Config的用戶只須要再部署一套SCCA REST 服務端
和SCCA UI 服務端
,並作一些配置就可使用SCCA來管理全部的配置信息了。sql
案例數據庫
所謂的半分離模式就是將上述的三個模塊中的兩個進行組合部署,以下降複雜度的部署方式。
SCCA UI模塊與SCCA REST模塊合併
以下圖所示,咱們能夠將SCCA UI服務端
與SCCA REST服務端
組合在一個程序中來部署,這樣能夠有效的下降全分離模式的部署複雜度,同時對於已經在使用Spring Cloud Config的用戶來講很是友好,已經部署的配置中心能夠繼續沿用。
案例
注意:對接不一樣存儲配置中心的配置參考分離部署中兩個SCCA REST服務端的不一樣配置內容進行調整。
最後介紹一種比較暴力的使用模式,SCCA支持將全部三個模塊整合在一塊兒使用和部署,在一個Spring Boot應用中同時包含:Spring Cloud 配置中心
、SCCA REST 服務端
以及SCCA UI 服務端
,具體以下所示:
案例
本章節分別對三個核心模塊的構建方式以及核心的配置內容。下面全部的構建都是基於Spring Boot構建的,因此您須要對Spring Boot項目的構建有基本的認識,這裏不作介紹。
在SCCA的架構中,配置中心的核心徹底採用Spring Cloud Config,因此如何構建一個配置中心徹底遵循Spring Cloud Config的使用方法。因爲目前SCCA的REST模塊主要實現了對Git存儲和DB存儲的綜合管理,因此對於Spring Cloud Config的使用也只能支持這兩種模式。下面分別介紹兩種配置中心的搭建與配置。
這裏主要介紹幾種主要的而且SCCA可以比較好支持的配置模式:
第一種:多個項目使用多個不一樣Git倉庫存儲的模式
spring.cloud.config.server.git.uri=https://github.com/dyc87112/{application}.git spring.cloud.config.server.git.username= spring.cloud.config.server.git.password=
這種模式下不一樣的項目會對應的不一樣的Git倉庫,若是項目中spring.application.name=user-service
,那麼它的配置倉庫會定位到https://github.com/dyc87112/user-service.git
倉庫下的配置。配置文件按application-{profile}.properties
的格式存儲,{profile}
表明環境名。
第二種:多個項目公用一個Git倉庫不一樣目錄的存儲模式
spring.cloud.config.server.git.uri=https://github.com/dyc87112/config-repo.git spring.cloud.config.server.git.search-paths=/{application} spring.cloud.config.server.git.username= spring.cloud.config.server.git.password=
這種模式下不一樣的項目會對應到https://github.com/dyc87112/config-repo.git
倉庫下的不一樣目錄,若是項目中spring.application.name=user-service
,那麼它的配置倉庫會定位到https://github.com/dyc87112/config-repo.git
倉庫下的/user-service
目錄。配置文件按application-{profile}.properties
的格式存儲,{profile}
表明環境名。
案例: Spring Cloud 配置中心(Git存儲)
在使用Db存儲模式的時候,必須使用Spring Cloud的Edgware版本以上。好比,能夠採用下面的配置:
# config server with jdbc spring.profiles.active=jdbc spring.cloud.config.server.jdbc.sql=SELECT `p_key`, `p_value` FROM property a, project b, env c, label d where a.project_id=b.id and a.env_id=c.id and a.label_id=d.id and b.name=? and c.name=? and d.name=? # Datasource, share with scca-rest-server spring.datasource.url=jdbc:mysql://localhost:3306/config-db spring.datasource.username=root spring.datasource.password= spring.datasource.driver-class-name=com.mysql.jdbc.Driver
主要分爲兩個部分:
spring.profiles.active
設置爲jdbc,同時指定獲取配置的SQL,用戶直接複製採用同樣的配置便可。這裏須要注意的,使用的DB要與後續介紹的SCCA REST模塊採用同一個DB
案例: Spring Cloud 配置中心(DB存儲)
在構建SCCA REST服務端的時候針對對接不一樣的配置存儲有一些不一樣的配置要求,因此下面按目前支持的存儲模式作不一樣的介紹。
當對接的配置中心採用Git存儲的時候,須要引入如下核心依賴:
<dependency> <groupId>com.didispace</groupId> <artifactId>scca-rest</artifactId> <version>1.0.0-RELEASE</version> </dependency> <!-- scca persistence dependency --> <dependency> <groupId>com.didispace</groupId> <artifactId>scca-persistence-git</artifactId> <version>1.0.0-RELEASE</version> </dependency>
須要按以下配置:
# if config server use git, need config these properties scca.git.username= scca.git.password= scca.git.repo-uri=https://github.com/dyc87112/{application}.git scca.git.base-path= scca.git.file-pattern=application-{profile}.properties # Datasource spring.datasource.url=jdbc:mysql://localhost:3306/config-db spring.datasource.username=root spring.datasource.password= spring.datasource.driver-class-name=com.mysql.jdbc.Driver
主要兩部分:
對接的git存儲的配置:
scca.git.username
:訪問git的用戶名scca.git.password
:訪問git的密碼scca.git.repo-uri
:配置git倉庫的地址,與配置中心的spring.cloud.config.server.git.uri
配置一致scca.git.base-path
:配置文件存儲的相對路徑,與配置中心的spring.cloud.config.server.git.search-paths
配置一致scca.git.file-pattern
:配置文件的命名規則案例: SCCA REST 服務端(對接Git存儲的配置中心)
當對接的配置中心採用Git存儲的時候,須要引入如下核心依賴:
<dependency> <groupId>com.didispace</groupId> <artifactId>scca-rest</artifactId> <version>1.0.0-RELEASE</version> </dependency> <!-- scca persistence dependency --> <dependency> <groupId>com.didispace</groupId> <artifactId>scca-persistence-db</artifactId> <version>1.0.0-RELEASE</version> </dependency>
須要按以下配置:
# Datasource spring.datasource.url=jdbc:mysql://localhost:3306/config-db spring.datasource.username=root spring.datasource.password= spring.datasource.driver-class-name=com.mysql.jdbc.Driver
須要注意,當配置中心採用DB存儲的時候,這裏的數據源須要一致
案例: SCCA REST 服務端(對接DB存儲的配置中心)
若是SCCA REST模塊在訪問配置中心的時候基於服務發現的話還須要引入對應的支持依賴和配置
若是使用eureak,那麼須要引入以下依賴:
<!-- scca discovery dependency--> <dependency> <groupId>com.didispace</groupId> <artifactId>scca-discovery-eureka</artifactId> <version>1.0.0-RELEASE</version> </dependency>
而且在配置中加入eureka的配置,好比:
eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/
更多相關配置請參與Spring Cloud Netflix Eureka的配置文檔。
若是使用consul,那麼須要引入以下依賴:
<!-- scca discovery dependency--> <dependency> <groupId>com.didispace</groupId> <artifactId>scca-discovery-consul</artifactId> <version>1.0.0-RELEASE</version> </dependency>
而且在配置中加入consul的相關配置,好比:
spring.cloud.consul.host=localhost spring.cloud.consul.port=8500
更多相關配置請參與Spring Cloud Consul的配置文檔。
SCCA REST模塊還有一個特別的配置scca.rest.context-path=/xhr
,該配置主要用來配置全部SCCA REST模塊接口的前綴,該接口主要用於與SCCA UI模塊對接時候使用,兩邊必須對接一致才能順利對接。
SCCA UI服務端須要引入如下核心依賴:
<dependency> <groupId>com.didispace</groupId> <artifactId>scca-ui</artifactId> <version>1.0.0-RELEASE</version> </dependency>
另外,還須要在配置中指定具體要訪問的SCCA REST模塊的位置,主要有兩種模式:
scca.ui.rest-server-url=http://localhost:10130
scca.ui.rest-server-name=scca-rest-server
除了上面的配置以後,還須要引入eureka或consul的依賴以及作對應的配置
最後,還有一個scca.ui.rest-server-context-path=/xhr
配置,用來描述要訪問的SCCA REST模塊接口的前綴,與SCCA REST服務端的scca.rest.context-path=/xhr
配置相對應。
案例: SCCA UI 服務端
經過以前介紹的任何一個部署方式搭建了配置中心和管理端以後,咱們就能夠打開瀏覽器訪問咱們的UI模塊實現對配置中心的管理了。
訪問地址爲:http://localhost:10032/admin/
,ip與端口根據實際部署UI模塊的狀況進行調整。
在管理各個項目的配置以前,咱們須要先作一些基礎配置,好比:環境的配置、環境所屬的參數配置,加密相關的配置等。
環境配置主要用來維護要使用SCCA統一管理的環境以及對應的Spring Cloud Config服務端信息。
](https://upload-images.jianshu...
如上圖所示,經過「新增環境」按鈕能夠添加一個部署環境。當咱們使用了Eureka、Consul等註冊中心時,只須要配置註冊中心的訪問地址和配置中心的服務名以及配置中心訪問的前綴,後續就能夠方便的使用這個環境的配置中心來進行加密解密、拉取配置等一系列的操做了。
若是不採用服務發現的機制取找到配置中心,也能夠將註冊中心地址留空,配置中心服務名一欄直接配置訪問註冊中心的URL便可。
環境參數配置主要用來配置每一個環境所屬的一些特有配置信息,好比:redis的地址,eureka的地址等等。這些配置信息將用戶後續爲各項目在各個環境配置的時候給予參考和快捷的替換操做提供元數據。
加密管理主要用來維護一些一般須要加密的Key,這樣能夠在後續編輯配置內容的時候,方便的進行批量加密操做。
在完成了上面的系統配置以後,用戶就能夠進入配置中心模塊,這裏會提供具體的管理配置內容的功能。目前主要有兩部分組成:項目管理和配置管理。
項目管理主要用來維護須要在各個環境部署的應用的配置信息,這裏能夠維護這個項目須要部署在什麼環境,有多少配置的版本。
這裏的三個基本概念與Spring Cloud Config的幾個概念的對應關係以下:
這裏配置版本(label),咱們會默認採用
master
。須要同時存在多個配置版本,實現灰度配置的時候,用戶也能夠本身添加label。
配置管理功能是SCCA的核心,在這裏用戶能夠方便對各個應用、各個環境、各個版本的配置進行編輯、加密等操做。同時,也提供了一些快捷的操做,好比:根據環境參數配置一鍵替換、根據加密Key清單實現一鍵加密、經過配置中心能夠加載到的配置信息等(更多便捷功能持續添加中...)
本頁主要提供給沒有使用過Spring Cloud Config的用戶閱讀。若是您已經使用過Spring Cloud Config,那麼客戶端如何經過Spring Cloud Config的配置中心加載配置相信已經掌握,在使用本項目的時候,無非就是搭建SCCA-REST模塊和SCCA-UI模塊來幫助管理您目前的配置內容。
經過前面幾節內容,若是您已經完成了SCCA中幾個要素的搭建,下面就來看看如何建立一個Spring Boot項目並經過配置中心來加載配置信息。
1. 建立一個基本的Spring Boot項目,並在pom.xml中引入依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
2. 建立應用主類
@SpringBootApplication public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } }
3. 建立bootstrap.properties
配置文件(也可使用yaml能夠)
spring.application.name=config-client server.port=12000 spring.cloud.config.uri=http://localhost:10032/scca-config-server spring.cloud.config.profile=stage spring.cloud.config.label=master
上述配置參數與scca中維護元素的對應關係以下:
1. 建立一個基本的Spring Boot項目,並在pom.xml中引入依賴
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>
上面以經過eureka作註冊中心的依賴,若是用consul,只須要將spring-cloud-starter-eureka
換成spring-cloud-starter-consul-discovery
便可。
2. 建立應用主類
@EnableDiscoveryClient @SpringBootApplication public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } }
3. 建立bootstrap.properties
配置文件(也可使用yaml能夠)
spring.application.name=config-client server.port=12000 spring.cloud.config.discovery.enabled=true spring.cloud.config.discovery.serviceId=config-server spring.cloud.config.profile=stage spring.cloud.config.label=master
上述配置參數與scca中維護元素的對應關係以下:
經過上面的兩種方式從配置中心拉取配置以後,在Spring Boot項目中就能夠輕鬆的使用全部配置內容了,好比:
@RefreshScope @RestController public class TestController { @Value("${a.b.c}") private String abc; @RequestMapping("/abc") public String abc() { return this.abc; } }
兩個主要註解的說明:
@Value("${a.b.c}")
:讀取配置key爲a.b.c
的value值@RefreshScope
:下面的配置信息能夠經過/refresh
端點實現動態刷新若是您還不瞭解Spring Cloud Config,您也能夠閱讀下面的幾篇瞭解一下最原始的Spring Cloud Config配置中心和客戶端接入方式