Spring Cloud(八)高可用的分布式配置中心 Spring Cloud Config

2019-04-17 14:01 更新

在分布式系統(tǒng)中,由于服務(wù)數(shù)量巨多,為了方便服務(wù)配置文件統(tǒng)一管理,實(shí)時更新,所以需要分布式配置中心組件。在Spring Cloud中,有分布式配置中心組件spring cloud config,它支持配置服務(wù)放在配置服務(wù)的內(nèi)存中(即本地),也支持放在遠(yuǎn)程Git倉庫中。在spring cloud config 組件中,分兩個角色,一是config server,二是config client,業(yè)界也有些知名的同類開源產(chǎn)品,比如百度的disconf。

相比較同類產(chǎn)品,SpringCloudConfig最大的優(yōu)勢是和Spring無縫集成,支持Spring里面EnvironmentPropertySource的接口,對于已有的Spring應(yīng)用程序的遷移成本非常低,在配置獲取的接口上是完全一致,結(jié)合SpringBoot可使你的項(xiàng)目有更加統(tǒng)一的標(biāo)準(zhǔn)(包括依賴版本和約束規(guī)范),避免了應(yīng)為集成不同開軟件源造成的依賴版本沖突。

Spring Cloud Config 簡介

SpringCloudConfig就是我們通常意義上的配置中心,把應(yīng)用原本放在本地文件的配置抽取出來放在中心服務(wù)器,從而能夠提供更好的管理、發(fā)布能力。SpringCloudConfig分服務(wù)端和客戶端,服務(wù)端負(fù)責(zé)將git svn中存儲的配置文件發(fā)布成REST接口,客戶端可以從服務(wù)端REST接口獲取配置。但客戶端并不能主動感知到配置的變化,從而主動去獲取新的配置,這需要每個客戶端通過POST方法觸發(fā)各自的/refresh

SpringCloudBus通過一個輕量級消息代理連接分布式系統(tǒng)的節(jié)點(diǎn)。這可以用于廣播狀態(tài)更改(如配置更改)或其他管理指令。SpringCloudBus提供了通過POST方法訪問的endpoint/bus/refresh,這個接口通常由git的鉤子功能調(diào)用,用以通知各個SpringCloudConfig的客戶端去服務(wù)端更新配置。

注意:這是工作的流程圖,實(shí)際的部署中SpringCloudBus并不是一個獨(dú)立存在的服務(wù),這里單列出來是為了能清晰的顯示出工作流程。

下圖是SpringCloudConfig結(jié)合SpringCloudBus實(shí)現(xiàn)分布式配置的工作流

SpringCloudConfig結(jié)合SpringCloudBus實(shí)現(xiàn)分布式配置的工作流

服務(wù)端配置

Config Server

新建項(xiàng)目 spring-cloud-config-server

添加依賴

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

開啟服務(wù)注冊

在程序的啟動類 ConfigServerApplication 通過 @EnableConfigServer 開啟 SpringCloudConfig 服務(wù)端

package io.ymq.example.config.server;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;


@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {


    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApplication.class, args);
    }
}

添加配置

配置文件 application.properties

spring.application.name=config-server
server.port=8888
spring.cloud.config.label=master
spring.cloud.config.server.git.uri=https://github.com/souyunku/spring-cloud-config.git
spring.cloud.config.server.git.search-paths=spring-cloud-config


#spring.cloud.config.server.git.username=your username
#spring.cloud.config.server.git.password=your password

  • spring.cloud.config.server.git.uri:配置git倉庫地址
  • spring.cloud.config.server.git.searchPaths:配置倉庫路徑
  • spring.cloud.config.label:配置倉庫的分支
  • spring.cloud.config.server.git.username:訪問git倉庫的用戶名
  • spring.cloud.config.server.git.password:訪問git倉庫的用戶密碼

Git倉庫如果是私有倉庫需要填寫用戶名密碼,示例是公開倉庫,所以不配置密碼。

遠(yuǎn)程Git倉庫

spring-cloud-config 文件夾下有 application-dev.properties,application-test.properties 三個文件,內(nèi)容依次是:content=hello dev,content=hello test,content=hello pre

遠(yuǎn)程Git倉庫

測試服務(wù)

啟動程序 ConfigApplication

訪問 Spring Cloud Config Server服務(wù):

http://localhost:8888/springCloudConfig/dev/master

{
    "name": "springCloudConfig",
    "profiles": [
        "dev"
    ],
    "label": "master",
    "version": "b6fbc2f77d1ead41d5668450e2601a03195eaf16",
    "state": null,
    "propertySources": [
        {
            "name": "https://github.com/souyunku/spring-cloud-config.git/application-dev.properties",
            "source": {
                "content": "hello dev"
            }
        }
    ]
}
 

證明配置服務(wù)中心可以從遠(yuǎn)程程序獲取配置信息。

http請求地址和資源文件映射如下:

  • /{application}/{profile}[/{label}]
  • /{application}-{profile}.yml
  • /{label}/{application}-{profile}.yml
  • /{application}-{profile}.properties
  • /{label}/{application}-{profile}.properties

客戶端配置

Config Client

新建項(xiàng)目 spring-cloud-config-client

添加依賴

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


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

開啟服務(wù)注冊

在程序的啟動類 ConfigClientApplication 通過 @Value 獲取服務(wù)端的 content 值的內(nèi)容

package io.ymq.example.config.client;


@RestController
@SpringBootApplication
public class ConfigClientApplication {


    @Value("${content}")
    String content;


    @RequestMapping("/")
    public String home() {
        return "content:" + content;
    }


    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }
}

添加配置

配置文件 application.properties

spring.application.name=config-client
server.port=8088


spring.cloud.config.label=master
spring.cloud.config.profile=dev
spring.cloud.config.uri=http://localhost:8888/
  • spring.cloud.config.label 指明遠(yuǎn)程倉庫的分支
  • spring.cloud.config.profile
  • dev開發(fā)環(huán)境配置文件
  • test測試環(huán)境
  • pro正式環(huán)境
  • spring.cloud.config.uri= http://localhost:8888/ 指明配置服務(wù)中心的網(wǎng)址。

測試服務(wù)

啟動程序 ConfigClientApplication

訪問服務(wù):http://localhost:8088/

訪問服務(wù)

下一篇,繼續(xù)Spring Cloud Config Server 整合 eureka, 等更多特性

源碼下載

GitHub:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-config

碼云:https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-config

Contact

  • 作者:鵬磊
  • 出處:http://www.souyunku.com
  • Email:admin@souyunku.com
  • 版權(quán)歸作者所有,轉(zhuǎn)載請注明出處
  • Wechat:關(guān)注公眾號,搜云庫技術(shù)團(tuán)隊(duì),專注于開發(fā)技術(shù)的研究與知識分享

    關(guān)注公眾號-搜云庫

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號