微服務之分佈式配置中心

1. 分佈式配置中心

分佈式系統中,服務數量劇增,其配置文件須要實現統一管理而且可以實時更新,分佈式配置中心組件必然是須要的。Spring Cloud提供了配置中心組件Spring Cloud Config ,它支持配置服務放在遠程Git倉庫和本地文件中。默認採用git來存儲配置信息,筆者示例也是採用默認的git repository,這樣經過git客戶端工具來方便的管理和訪問配置內容。html

配置服務器工做示意圖
配置服務器工做示意圖

在Spring Cloud Config 組件中,有兩個角色,一是Config Server配置服務器,爲其餘服務提供配置文件信息;另外一個是Config Client即其餘服務,啓動時從Config Server拉取配置。
下面分別介紹下Config Server和Config Client的搭建實現方法。java

2. 配置服務器Config Server

2.1 pom中的jars

只須要添加以下兩個jar包的引用。git

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>jsr311-api</artifactId>
                    <groupId>javax.ws.rs</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>複製代碼

由於Spring Cloud Config服務器爲客戶端提供配置是要經過服務發現,因此這邊引入consul的starter,配置服務器和客戶端都註冊到consul集羣中。github

2.2 入口類

簡單,由於Spring Cloud 提供了不少開箱即用的功能,經過spring-cloud-config-server的註解激活配置服務器。spring

@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}複製代碼

@EnableConfigServer註解很重要,將該服務標註爲配置服務器;@EnableDiscoveryClient註冊服務,供其餘服務發現調用。bootstrap

2.3 bootstrap.yml

server:
 port: 8888

spring:
 application:
 name: config-server
 cloud:
 consul:
 discovery:
 preferIpAddress: true
 enabled: true
 register: true
 service-name: config-service
          //...
 host: localhost
 port: 8500
---
spring:
 cloud:
 config:
 server:
 git:
 uri: https://gitee.com/keets/Config-Repo.git
 searchPaths: ${APP_LOCATE:dev}
 username: user
 password: pwd複製代碼

配置第一段指定了服務的端口;第二段是服務發現相關的配置;第三段是配置服務器的信息,這裏將配置文件存儲在碼雲上,默認的搜索文件路徑爲dev文件夾,能夠經過環境變量指定,再下面是用戶名和密碼,公開的項目不須要設置用戶名和密碼。api

至此配置服務器已經搭建完成,是否是很簡單?服務器

3. 配置的git倉庫

配置服務器配置的倉庫是https://gitee.com/keets/Config-Repo.git。筆者在這個倉庫中建了兩個文件夾:dev和prod。而且在dev文件夾中新建了文件configclient-dev.yml。爲何這樣命名,能隨便命名嗎?答案是不能夠,下面咱們看下config文件的命名規則。微信

URL與配置文件的映射關係以下:app

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties
    上面的url會映射{application}-{profile}.yml對應的配置文件,{label}對應git上不一樣的分支,默認爲master
    好比Config Client,{application}對應spring.application:configclient,exp對應{profile},{label}不指定則默認爲master。

新建的configclient-dev.yml以下:

spring:
 profiles: dev

cloud:
 version: Dalston.SR4複製代碼

4. 配置客戶端Config Client

4.1 pom中的jars

只須要添加以下兩個jar包的引用。

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>jsr311-api</artifactId>
                    <groupId>javax.ws.rs</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>複製代碼

新增spring-boot-starter-actuator監控模塊,爲了配置信息是動態刷新,其中包含了/refresh刷新API。其餘和配置服務器中添加的相同,沒啥可說。

4.2 入口類

簡單,由於Spring Cloud 提供了不少開箱即用的功能,經過spring-cloud-config-server的註解激活配置服務器。

@SpringBootApplication
@EnableDiscoveryClient
public class ConfigServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}複製代碼

配置客戶端不須要@EnableConfigServer註解。

4.3 bootstrap.yml

server:
 port: 9901
cloud:
 version: Brixton SR7

spring:
 cloud:
 consul:
 discovery:
 preferIpAddress: true
 enabled: true
 register: true
 service-name: config-client
      //...
 host: localhost
 port: 8500

---
spring:
 profiles:
 active: dev
 application:
      #app名稱
 name: configclient
 cloud:
 config:
      #指定profile
 profile: dev
 label: master
 discovery:
 enabled: true
        #server名
 service-id: config-service
 enabled: true
 fail-fast: true

---
spring:
 profiles: default
 application:
 name: configclient複製代碼

從上面配置能夠看出咱們所激活的profile是dev,配置的配置服務名爲config-service,指定從master分支拉取配置。因此configclient啓動時會去配置服務器中拉取對應的configclient-dev的配置文件信息。

4.4 TestResource

筆者新建了一個TestResource,對應的API端點爲/api/test。

@Value("${cloud.version}")
    private String version;

    @GetMapping("/test")
    public String from() {
        return version;
    }複製代碼

cloud.version能夠在上面的配置文件看到默認指定的是Brixton SR7,而筆者在配置中心設置的值爲Dalston.SR4。

5. 測試結果

5.1 獲取配置

首先看一下配置客戶端啓動時的日誌信息,是否是真的按照咱們配置的,從配置服務器拉取configclient-dev信息。

ccstart
ccstart

從日誌看來,是符合的上面的配置猜測的。咱們再從配置客戶端提供的API接口進一步驗證。

pj
pj

能夠看到確實是Dalston.SR4,配置服務可以正常運行。

5.2 動態刷新配置

Spring Cloud Config還能夠實現動態更新配置的功能。下面咱們修改下Config Repo中的cloud.version配置爲Camden SR7,並經過刷新config client的/refresh端點來應用配置。
從下圖能夠看到結果是預期所想。

rr
rr

這邊配置的刷新是經過手工完成了,還能夠利用githook進行觸發。當本地提交代碼到git後,調用了下圖設置的url。有兩個端點可使用:

  • refresh:以post方式執行/refresh 會刷新env中的配置
  • restart:若是配置信息已經注入到bean中,因爲bean是單例的,不會去加載修改後的配置
    須要經過post方式去執行/restart, 還須要配置endpoints.restart.enabled: true。

第二種狀況比較耗時,@RefreshScope是spring cloud提供的註解,在執行refresh時會刷新bean中變量值。下面看一下源碼上的解釋。

Convenience annotation to put a @Bean definition in RefreshScope.
Beans annotated this way can be refreshed at runtime and any components that are using them will get a new instance on the next method call, fully initialized and injected with all dependencies.

上面大意是RefreshScope是一個方便的bean註解,加上這個註解能夠在運行態刷新bean。其餘使用該bean的components下次調用時會獲取一個被初始化好的新實例對象。

githook設置頁面以下。

githook
githook

6. 總結

本文主要講了配置服務器和配置客戶端的搭建過程,最後經過配置客戶端的日誌和端點信息驗證是否能成功使用配置服務中心。整體來講,很是簡單。文中的部分配置沒有寫完整,讀者須要能夠看文末的git項目。

不過關於配置中心,本文的講解並不完整,下一篇文章將會講解配置服務器與消息總線的結合使用,實現對配置客戶端的自動更新及灰度發佈等功能。

本文源碼
github: github.com/keets2012/S…
gitee: gitee.com/keets/sprin…

訂閱最新文章,歡迎關注個人公衆號

微信公衆號
微信公衆號


參考

  1. Spring Cloud Config
  2. 分佈式配置中心
相關文章
相關標籤/搜索