白話SpringCloud | 第七章:分佈式配置中心的使用

前言

介紹完服務的容錯保護處理,接下來咱們來了解下關於分佈式配置中心的相關知識和使用。衆所周知,隨着項目的愈來愈多,日益龐大,每一個子項目都會伴隨着不一樣的配置項,於此也就多了不少的配置文件。假若某些配置信息修改,可能就會伴隨着一系列配置文件的更新和相應服務的重啓操做了。這對於實施而言,也是噩夢通常的存在,增長了一系列運維成本,也會無形中提升出錯的機率。因此在微服務愈來愈多時,就會引入今天要講解的分佈式配置中心,它就是來解決此類問題的。話很少說,開始吧~html

一點知識

爲何要統一管理微服務配置

在寫這篇文章以前,在公衆號裏有推送了一篇《爲何須要分佈式配置中心》的文章。裏面也大體說明了,你們能夠看一看。簡單來講,就是隨着業務的發展、微服務架構的升級,服務的數量、程序的配置日益增多(各類微服務、各類服務器地址、各類參數),傳統的配置文件方式和數據庫的方式已沒法知足開發人員對配置管理的要求,即java

  • 安全性:配置跟隨源代碼保存在代碼庫中,容易形成配置泄漏;git

  • 時效性:修改配置,須要重啓服務才能生效;github

  • 侷限性:沒法支持動態調整:例如日誌開關、功能開關;web

其實說白了,就是當業務需求有變動時,能夠經過修改配置文件或者參數的形式,可以自動更新配置。減小沒必要要的重啓服務的操做。正常狀況下,通常的業務系統都有個參數配置表的,裏面記錄着不一樣業務參數,以此來應對不一樣的需求場景,也就是需求口中常說的:要能靈活配置。spring

而在微服務中,因爲每一個微服務都是獨立的數據庫,傳統的配置沒法知足了。因此纔出現了分佈式配置中心服務,專門來解決此類問題的。數據庫

在微服務架構中,微服務的統一配置管理通常有如下需求:json

  • 集中管理配置:一個使用微服務架構的應用系統可能會包括成千上萬個微服務,所以集中管理配置是很是有必要的。
  • 不一樣環境不一樣配置:數據源配置在不一樣的環境(開發、測試、預發佈、生產等)中是不一樣的。
  • 運行期間可動態調整:可根據各個微服務的負載狀況,動態調整數據源鏈接池大小或熔斷閾值,而且在調整配置時不重啓微服務。
  • 配置修改後自動更新:如配置內容發生變化,微服務可以自動更新配置。

綜上所述,對於微服務架構而言,一個通用的配置管理機制必不可少,常見作法是使用配置服務器管理配置。目前市面上開源的配置中心有不少,如bootstrap

  • Apollo(阿波羅):攜程框架部門研發的分佈式配置中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性,適用於微服務配置管理場景。
  • Qconf:一個分佈式配置管理工具,360出品。
  • Disconf:專一於各類「分佈式系統配置管理」的「通用組件」和「通用平臺」, 提供統一的「配置管理服務」。

具體的能夠看看以前說的文章《爲何須要分佈式配置中心》,這裏就不過多闡述了。緩存

Spring-Cloud-config實踐

何爲SpringCloudConfig

Spring Cloud Config爲分佈式系統外部化配置提供了服務端和客戶端的支持,它包括Config ServerConfig Client兩部分。目前支持gitsvnvaultjdbc本地幾種存儲方式。

最經常使用的存儲方式就是git了。

簡單來講,各客戶端程序經過訪問服務端獲取相應的配置信息。接下來咱們看看下面這張圖

  • 遠程Git倉庫:存儲配置文件。
  • ConfigServer:分佈式配置管理中心,會於維護本身的git倉庫信息。
  • 本地Git倉庫:在ConfigServer中,每次客戶端請求獲取配置信息時,都會從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端會進行說明的。

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 ,返回了配置文件的信息,說明已經讀取到遠程倉庫信息了。

my-config-client-dev

咱們能夠經過訪問配置信息的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

查看本地倉庫目錄: 本地倉庫

此時,修改遠程的配置文件,再次訪問能夠看見返回的參數是最新修改後的參數值了,你們能夠自行試試。

Client端

建立一個客戶端: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/ ,能夠看見配置信息已經被正確返回了。


自此,一個簡單的配置中心示例就結束了。 目前爲止,咱們尚未手動去修改遠程的配置文件參數值,能夠試試,在修改後,客戶端去返回相應的參數值,會發現仍是舊的,並無進行更新操做。由於配置文件是是在應用啓動的時候進行加載的,並且遠程倉庫修改了配置文件,客戶端並不知道已經修改了,不會發起請求的。關於配置參數自動更新相關知識點,會在下一章節進行講解的。


參考資料

  1. https://cloud.spring.io/spring-cloud-static/Finchley.SR1/single/spring-cloud.html#_spring_cloud_config

  2. 爲何須要分佈式配置中心?

總結

本章節主要講解了常規操做下,如何使用SpringCloudConfig進行統一參數配置管理。針對配置動態刷新,實時生效相關知識點,會在下一章節進行單獨講解的,本章節先讓你們有個直觀的認識,瞭解下SpringCloudConfig實現的一些機制。本文僅僅是講解了git示例,有興趣的同窗能夠試試其餘的,好比svn或者本地資源庫等形式。都是相似配置,就不加以說明了。

最後

目前互聯網上大佬都有分享SpringCloud系列教程,內容可能會相似,望多多包涵了。原創不易,碼字不易,還但願你們多多支持。若文中有錯誤之處,還望提出,謝謝。

老生常談

  • 我的QQ:499452441
  • 微信公衆號:lqdevOps

公衆號

我的博客:http://blog.lqdev.cn

源碼示例:https://github.com/xie19900123/spring-cloud-learning

原文地址:http://blog.lqdev.cn/2018/10/10/SpringCloud/chapter-seven/

相關文章
相關標籤/搜索