為Spring Cloud Config插上管理的翅膀

最近一致在更新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僅需要通過一些簡單的配置,或者遷移工具就能將原來正在使用的配置中心統一的管理起來。

項目地址

如果您覺得該項目對您有用,歡迎Star、Follow支持我們!

架構概覽

本項目采用了前后端分離的架構,通過core模塊抽象了前端需要的操作,再通過persistence和discovery模塊隔離不同的配置倉庫和不同的服務注冊中心,從而達到前端程序不需要關心到底使用了什么存儲配置以及使用了什么注冊中心,這樣用戶可以根據自己的需要自由的組合不同的配置存儲和服務治理機制,盡可能的匹配大部分Spring Cloud用戶的需求。

WechatIMG126.jpeg

部署方式

由于SCCA的架構對各個功能模塊做了比較細致的拆分,所以它存在多種不同模式的部署方式,所以它既可以為已經在使用Spring Cloud Config提供服務,也可以為從零開始使用Spring Cloud Config的用戶。

在SCCA中我們的可部署內容自底向上分為三個部分:

  • Spring Cloud 配置中心:基于Spring Cloud Config構建的配置中心服務端。
  • SCCA REST 服務端:SCCA的核心模塊,實現了SCCA配置管理的持久化內容以及所有的管理操作API。
  • SCCA UI 服務端:SCCA的前端模塊,實現了可視化的配置管理操作界面。

下面我們來看看SCCA支持哪些多樣的部署方式。

全分離模式

全分離模式就是將上述三個部分都以獨立的進程進行部署,每一個部分都可以做高可用,具體部署結構可以如下圖所示:

scca-deploy-1.png

這種模式既可以適用于已經在使用Spring Cloud Config的用戶,也適用于正準備開始適用的用戶。其中,位于最底層的Spring Cloud配置中心就是一個最原始的Spring Cloud Config Server。所以,對于已經在使用Spring Cloud Config的用戶只需要再部署一套SCCA REST 服務端SCCA UI 服務端,并做一些配置就可以使用SCCA來管理所有的配置信息了。

案例

半分離模式

所謂的半分離模式就是將上述的三個模塊中的兩個進行組合部署,以降低復雜度的部署方式。
SCCA UI模塊與SCCA REST模塊合并

如下圖所示,我們可以將SCCA UI服務端SCCA REST服務端組合在一個程序中來部署,這樣可以有效的降低全分離模式的部署復雜度,同時對于已經在使用Spring Cloud Config的用戶來說非常友好,已經部署的配置中心可以繼續沿用。

scca-deploy-2.png

案例

注意:對接不同存儲配置中心的配置參考分離部署中兩個SCCA REST服務端的不同配置內容進行調整。

All-In-One模式

最后介紹一種比較暴力的使用模式,SCCA支持將所有三個模塊整合在一起使用和部署,在一個Spring Boot應用中同時包含:Spring Cloud 配置中心SCCA REST 服務端以及SCCA UI 服務端,具體如下所示:

scca-deploy-4.png

案例

配置詳解

本章節分別對三個核心模塊的構建方式以及核心的配置內容。下面所有的構建都是基于Spring Boot構建的,所以您需要對Spring Boot項目的構建有基本的認識,這里不做介紹。

Spring Cloud配置中心的構建與配置

在SCCA的架構中,配置中心的核心完全采用Spring Cloud Config,所以如何構建一個配置中心完全遵循Spring Cloud Config的使用方法。由于目前SCCA的REST模塊主要實現了對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=

這種模式下不同的項目會對應的不同的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存儲模式

在使用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設置為jdbc,同時指定獲取配置的SQL,用戶直接復制采用一樣的配置即可。
  • 指定存儲配置的DB連接信息,除了mysql之外也可以使用其他主流關系型數據庫。

這里需要注意的,使用的DB要與后續介紹的SCCA REST模塊采用同一個DB

案例:Spring Cloud 配置中心(DB存儲)

SCCA REST服務端的構建與配置

在構建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-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內部邏輯的存儲庫數據源信息

案例:SCCA REST 服務端(對接Git存儲的配置中心)

Db存儲模式

當對接的配置中心采用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模塊在訪問配置中心的時候基于服務發現的話還需要引入對應的支持依賴和配置

與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/

更多相關配置請參與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的相關配置,比如:

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服務端的構建與配置

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服務端信息。

![user-guilder-2.png](https://upload-images.jianshu.io/upload_images/1447174-3c2629f8a8b1f448.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

如上圖所示,通過“新增環境”按鈕可以添加一個部署環境。當我們使用了Eureka、Consul等注冊中心時,只需要配置注冊中心的訪問地址和配置中心的服務名以及配置中心訪問的前綴,后續就可以方便的使用這個環境的配置中心來進行加密解密、拉取配置等一系列的操作了。

如果不采用服務發現的機制取找到配置中心,也可以將注冊中心地址留空,配置中心服務名一欄直接配置訪問注冊中心的URL即可。

環境參數配置

環境參數配置主要用來配置每個環境所屬的一些特有配置信息,比如:redis的地址,eureka的地址等等。這些配置信息將用戶后續為各項目在各個環境配置的時候給予參考和快捷的替換操作提供元數據。

加密管理

加密管理主要用來維護一些通常需要加密的Key,這樣可以在后續編輯配置內容的時候,方便的進行批量加密操作。

配置中心

在完成了上面的系統配置之后,用戶就可以進入配置中心模塊,這里會提供具體的管理配置內容的功能。目前主要有兩部分組成:項目管理和配置管理。

項目管理

項目管理主要用來維護需要在各個環境部署的應用的配置信息,這里可以維護這個項目需要部署在什么環境,有多少配置的版本。

user-guilder-4.png

這里的三個基本概念與Spring Cloud Config的幾個概念的對應關系如下:

  • 項目名稱:application
  • 部署環境:profile
  • 配置版本:label

這里配置版本(label),我們會默認采用master。需要同時存在多個配置版本,實現灰度配置的時候,用戶也可以自己添加label。

配置管理

配置管理功能是SCCA的核心,在這里用戶可以方便對各個應用、各個環境、各個版本的配置進行編輯、加密等操作。同時,也提供了一些快捷的操作,比如:根據環境參數配置一鍵替換、根據加密Key清單實現一鍵加密、通過配置中心可以加載到的配置信息等(更多便捷功能持續添加中...)

user-guilder-5.png

客戶端接入

本頁主要提供給沒有使用過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中維護元素的對應關系如下:

  • spring.application.name:對應scca中的項目名
  • spring.cloud.config.profile:項目配置的環境名
  • spring.cloud.config.label:項目配置的版本名
  • spring.cloud.config.uri:配置中心的訪問絕對地址

服務發現接入

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.application.name:對應scca中的項目名
  • spring.cloud.config.profile:項目配置的環境名
  • spring.cloud.config.label:項目配置的版本名
  • spring.cloud.config.discovery.enabled:開啟服務發現功能
  • spring.cloud.config.discovery.serviceId:配置中心的服務名

讀取配置

通過上面的兩種方式從配置中心拉取配置之后,在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配置中心和客戶端接入方式

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容