為Spring Cloud Config插上管理的翅膀
最近一致在更新Spring Cloud Config的相關(guān)內(nèi)容,主要也是為這篇埋個伏筆,相信不少調(diào)研過Spring Cloud Config的用戶都會吐槽它的管理能力太弱。因此,就有了下面為講推薦的這個開源項目,希望對已經(jīng)入坑Spring Cloud Config的童鞋們有所幫助!
簡介
在Spring Cloud的微服務(wù)架構(gòu)方案中雖然提供了Spring Cloud Config來擔(dān)任配置中心的角色,但是該項目的功能在配置的管理層面還是非常欠缺的。初期我們可以依賴選取的配置存儲系統(tǒng)(比如:Gitlab、Github)給我們提供的配置管理界面來操作所有的配置信息,但是這樣的管理還是非常粗粒度的,因此這個項目的目的就是解決這個問題,通過此項目,我們將提供一套基于Spring Cloud Config配置中心的可視化管理系統(tǒng)。
在該項目中,我們對于服務(wù)治理、配置存儲、可視化操作都做了抽象,只要目的就是為了盡可能的兼容所有Spring Cloud Config的用戶。任何Spring Cloud Config僅需要通過一些簡單的配置,或者遷移工具就能將原來正在使用的配置中心統(tǒng)一的管理起來。
項目地址
Github: https://github.com/dyc87112/spring-cloud-config-admin
Gitee:https://gitee.com/didispace/spring-cloud-config-admin
前端Github: https://github.com/stone-jin/spring-cloud-config-admin-web
前端Gitee: https://gitee.com/stone-jin/spring-cloud-config-admin-web
架構(gòu)概覽
本項目采用了前后端分離的架構(gòu),通過core模塊抽象了前端需要的操作,再通過persistence和discovery模塊隔離不同的配置倉庫和不同的服務(wù)注冊中心,從而達到前端程序不需要關(guān)心到底使用了什么存儲配置以及使用了什么注冊中心,這樣用戶可以根據(jù)自己的需要自由的組合不同的配置存儲和服務(wù)治理機制,盡可能的匹配大部分Spring Cloud用戶的需求。
部署方式
由于SCCA的架構(gòu)對各個功能模塊做了比較細(xì)致的拆分,所以它存在多種不同模式的部署方式,所以它既可以為已經(jīng)在使用Spring Cloud Config提供服務(wù),也可以為從零開始使用Spring Cloud Config的用戶。
在SCCA中我們的可部署內(nèi)容自底向上分為三個部分:
- Spring Cloud 配置中心:基于Spring Cloud Config構(gòu)建的配置中心服務(wù)端。
- SCCA REST 服務(wù)端:SCCA的核心模塊,實現(xiàn)了SCCA配置管理的持久化內(nèi)容以及所有的管理操作API。
- SCCA UI 服務(wù)端:SCCA的前端模塊,實現(xiàn)了可視化的配置管理操作界面。
下面我們來看看SCCA支持哪些多樣的部署方式。
全分離模式
全分離模式就是將上述三個部分都以獨立的進程進行部署,每一個部分都可以做高可用,具體部署結(jié)構(gòu)可以如下圖所示:
這種模式既可以適用于已經(jīng)在使用Spring Cloud Config的用戶,也適用于正準(zhǔn)備開始適用的用戶。其中,位于***層的Spring Cloud配置中心就是一個最原始的Spring Cloud Config Server。所以,對于已經(jīng)在使用Spring Cloud Config的用戶只需要再部署一套SCCA REST 服務(wù)端和SCCA UI 服務(wù)端,并做一些配置就可以使用SCCA來管理所有的配置信息了。
案例
SCCA REST 服務(wù)端(對接DB存儲的配置中心)
SCCA REST 服務(wù)端(對接Git存儲的配置中心)
半分離模式
所謂的半分離模式就是將上述的三個模塊中的兩個進行組合部署,以降低復(fù)雜度的部署方式。
SCCA UI模塊與SCCA REST模塊合并
如下圖所示,我們可以將SCCA UI服務(wù)端與SCCA REST服務(wù)端組合在一個程序中來部署,這樣可以有效的降低全分離模式的部署復(fù)雜度,同時對于已經(jīng)在使用Spring Cloud Config的用戶來說非常友好,已經(jīng)部署的配置中心可以繼續(xù)沿用。
案例
注意:對接不同存儲配置中心的配置參考分離部署中兩個SCCA REST服務(wù)端的不同配置內(nèi)容進行調(diào)整。
All-In-One模式
***介紹一種比較暴力的使用模式,SCCA支持將所有三個模塊整合在一起使用和部署,在一個Spring Boot應(yīng)用中同時包含:Spring Cloud 配置中心、SCCA REST 服務(wù)端以及SCCA UI 服務(wù)端,具體如下所示:
案例
配置詳解
本章節(jié)分別對三個核心模塊的構(gòu)建方式以及核心的配置內(nèi)容。下面所有的構(gòu)建都是基于Spring Boot構(gòu)建的,所以您需要對Spring Boot項目的構(gòu)建有基本的認(rèn)識,這里不做介紹。
Spring Cloud配置中心的構(gòu)建與配置
在SCCA的架構(gòu)中,配置中心的核心完全采用Spring Cloud Config,所以如何構(gòu)建一個配置中心完全遵循Spring Cloud Config的使用方法。由于目前SCCA的REST模塊主要實現(xiàn)了對Git存儲和DB存儲的綜合管理,所以對于Spring Cloud Config的使用也只能支持這兩種模式。下面分別介紹兩種配置中心的搭建與配置。
Git存儲模式
這里主要介紹幾種主要的并且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=
這種模式下不同的項目會對應(yīng)的不同的Git倉庫,如果項目中spring.application.name=user-service,那么它的配置倉庫會定位到https://github.com/dyc87112/user-service.git倉庫下的配置。配置文件按application-{profile}.properties的格式存儲,{profile}代表環(huán)境名。
第二種:多個項目公用一個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=
這種模式下不同的項目會對應(yīng)到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}代表環(huán)境名。
Db存儲模式
在使用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
主要分為兩個部分:
- 激活采用DB存儲的模式:將spring.profiles.active設(shè)置為jdbc,同時指定獲取配置的SQL,用戶直接復(fù)制采用一樣的配置即可。
- 指定存儲配置的DB連接信息,除了mysql之外也可以使用其他主流關(guān)系型數(shù)據(jù)庫。
這里需要注意的,使用的DB要與后續(xù)介紹的SCCA REST模塊采用同一個DB
SCCA REST服務(wù)端的構(gòu)建與配置
在構(gòu)建SCCA REST服務(wù)端的時候針對對接不同的配置存儲有一些不同的配置要求,所以下面按目前支持的存儲模式做不同的介紹。
Git存儲模式
當(dāng)對接的配置中心采用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:配置文件的命名規(guī)則
SCCA內(nèi)部邏輯的存儲庫數(shù)據(jù)源信息
案例:SCCA REST 服務(wù)端(對接Git存儲的配置中心)
Db存儲模式
當(dāng)對接的配置中心采用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
需要注意,當(dāng)配置中心采用DB存儲的時候,這里的數(shù)據(jù)源需要一致
案例:SCCA REST 服務(wù)端(對接DB存儲的配置中心)
服務(wù)發(fā)現(xiàn)支持
如果SCCA REST模塊在訪問配置中心的時候基于服務(wù)發(fā)現(xiàn)的話還需要引入對應(yīng)的支持依賴和配置
與Eureka的整合
如果使用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/
更多相關(guān)配置請參與Spring Cloud Netflix Eureka的配置文檔。
與Consul的整合
如果使用consul,那么需要引入如下依賴:
- <!-- scca discovery dependency-->
- <dependency>
- <groupId>com.didispace</groupId>
- <artifactId>scca-discovery-consul</artifactId>
- <version>1.0.0-RELEASE</version>
- </dependency>
并且在配置中加入consul的相關(guān)配置,比如:
- spring.cloud.consul.host=localhost
- spring.cloud.consul.port=8500
更多相關(guān)配置請參與Spring Cloud Consul的配置文檔。
公共配置
SCCA REST模塊還有一個特別的配置scca.rest.context-path=/xhr,該配置主要用來配置所有SCCA REST模塊接口的前綴,該接口主要用于與SCCA UI模塊對接時候使用,兩邊必須對接一致才能順利對接。
SCCA UI服務(wù)端的構(gòu)建與配置
SCCA UI服務(wù)端需要引入以下核心依賴:
- <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
基于服務(wù)發(fā)現(xiàn)的配置:
- scca.ui.rest-server-name=scca-rest-server
除了上面的配置之后,還需要引入eureka或consul的依賴以及做對應(yīng)的配置
***,還有一個scca.ui.rest-server-context-path=/xhr配置,用來描述要訪問的SCCA REST模塊接口的前綴,與SCCA REST服務(wù)端的scca.rest.context-path=/xhr配置相對應(yīng)。
管理功能
通過之前介紹的任何一個部署方式搭建了配置中心和管理端之后,我們就可以打開瀏覽器訪問我們的UI模塊實現(xiàn)對配置中心的管理了。
訪問地址為:http://localhost:10032/admin/,ip與端口根據(jù)實際部署UI模塊的情況進行調(diào)整。
系統(tǒng)配置
在管理各個項目的配置之前,我們需要先做一些基礎(chǔ)配置,比如:環(huán)境的配置、環(huán)境所屬的參數(shù)配置,加密相關(guān)的配置等。
環(huán)境配置
環(huán)境配置主要用來維護要使用SCCA統(tǒng)一管理的環(huán)境以及對應(yīng)的Spring Cloud Config服務(wù)端信息。
環(huán)境配置
如上圖所示,通過“新增環(huán)境”按鈕可以添加一個部署環(huán)境。當(dāng)我們使用了Eureka、Consul等注冊中心時,只需要配置注冊中心的訪問地址和配置中心的服務(wù)名以及配置中心訪問的前綴,后續(xù)就可以方便的使用這個環(huán)境的配置中心來進行加密解密、拉取配置等一系列的操作了。
如果不采用服務(wù)發(fā)現(xiàn)的機制取找到配置中心,也可以將注冊中心地址留空,配置中心服務(wù)名一欄直接配置訪問注冊中心的URL即可。
環(huán)境參數(shù)配置
環(huán)境參數(shù)配置主要用來配置每個環(huán)境所屬的一些特有配置信息,比如:redis的地址,eureka的地址等等。這些配置信息將用戶后續(xù)為各項目在各個環(huán)境配置的時候給予參考和快捷的替換操作提供元數(shù)據(jù)。
環(huán)境參數(shù)配置
加密管理
加密管理主要用來維護一些通常需要加密的Key,這樣可以在后續(xù)編輯配置內(nèi)容的時候,方便的進行批量加密操作。
加密管理
配置中心
在完成了上面的系統(tǒng)配置之后,用戶就可以進入配置中心模塊,這里會提供具體的管理配置內(nèi)容的功能。目前主要有兩部分組成:項目管理和配置管理。
項目管理
項目管理主要用來維護需要在各個環(huán)境部署的應(yīng)用的配置信息,這里可以維護這個項目需要部署在什么環(huán)境,有多少配置的版本。
項目管理
這里的三個基本概念與Spring Cloud Config的幾個概念的對應(yīng)關(guān)系如下:
- 項目名稱:application
- 部署環(huán)境:profile
- 配置版本:label
這里配置版本(label),我們會默認(rèn)采用master。需要同時存在多個配置版本,實現(xiàn)灰度配置的時候,用戶也可以自己添加label。
配置管理
配置管理功能是SCCA的核心,在這里用戶可以方便對各個應(yīng)用、各個環(huán)境、各個版本的配置進行編輯、加密等操作。同時,也提供了一些快捷的操作,比如:根據(jù)環(huán)境參數(shù)配置一鍵替換、根據(jù)加密Key清單實現(xiàn)一鍵加密、通過配置中心可以加載到的配置信息等(更多便捷功能持續(xù)添加中…)
配置管理
客戶端接入
本頁主要提供給沒有使用過Spring Cloud Config的用戶閱讀。如果您已經(jīng)使用過Spring Cloud Config,那么客戶端如何通過Spring Cloud Config的配置中心加載配置相信已經(jīng)掌握,在使用本項目的時候,無非就是搭建SCCA-REST模塊和SCCA-UI模塊來幫助管理您目前的配置內(nèi)容。
客戶端加載
通過前面幾節(jié)內(nèi)容,如果您已經(jīng)完成了SCCA中幾個要素的搭建,下面就來看看如何創(chuàng)建一個Spring Boot項目并通過配置中心來加載配置信息。
絕對地址接入
1. 創(chuàng)建一個基本的Spring Boot項目,并在pom.xml中引入依賴
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-config</artifactId>
- </dependency>
2. 創(chuàng)建應(yīng)用主類
- @SpringBootApplication
- public class Application {
- public static void main(String[] args) {
- new SpringApplicationBuilder(Application.class).web(true).run(args);
- }
- }
3. 創(chuàng)建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
上述配置參數(shù)與scca中維護元素的對應(yīng)關(guān)系如下:
- spring.application.name:對應(yīng)scca中的項目名
- spring.cloud.config.profile:項目配置的環(huán)境名
- spring.cloud.config.label:項目配置的版本名
- spring.cloud.config.uri:配置中心的訪問絕對地址
服務(wù)發(fā)現(xiàn)接入
1. 創(chuàng)建一個基本的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. 創(chuàng)建應(yīng)用主類
- @EnableDiscoveryClient
- @SpringBootApplication
- public class Application {
- public static void main(String[] args) {
- new SpringApplicationBuilder(Application.class).web(true).run(args);
- }
- }
3. 創(chuàng)建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
上述配置參數(shù)與scca中維護元素的對應(yīng)關(guān)系如下:
- spring.application.name:對應(yīng)scca中的項目名
- spring.cloud.config.profile:項目配置的環(huán)境名
- spring.cloud.config.label:項目配置的版本名
- spring.cloud.config.discovery.enabled:開啟服務(wù)發(fā)現(xiàn)功能
- spring.cloud.config.discovery.serviceId:配置中心的服務(wù)名
讀取配置
通過上面的兩種方式從配置中心拉取配置之后,在Spring Boot項目中就可以輕松的使用所有配置內(nèi)容了,比如:
- @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端點實現(xiàn)動態(tài)刷新
【本文為51CTO專欄作者“翟永超”的原創(chuàng)稿件,轉(zhuǎn)載請通過51CTO聯(lián)系作者獲取授權(quán)】