分佈式配置中心

Spring Cloud Config爲服務端和客戶端提供了分佈式系統的外部化配置支持。配置服務器爲各應用的全部環境提供了一箇中心化的外部配置。它實現了對服務端和客戶端對Spring Environment和PropertySource抽象的映射,因此它除了適用於Spring構建的應用程序,也能夠在任何其餘語言運行的應用程序中使用。做爲一個應用能夠經過部署管道來進行測試或者投入生產,咱們能夠分別爲這些環境建立配置,而且在須要遷移環境的時候獲取對應環境的配置來運行。
java

 

置服務器默認採用git來存儲配置信息,這樣就有助於對環境配置進行版本管理,而且能夠經過git客戶端工具來方便的管理和訪問配置內容。固然他也提供本地化文件系統的存儲方式。git

使用 spring Cloud 進行集中式配置管理,將以往的配置文件從項目中摘除後放到Git 或svn中集中管理,並在須要變動的時候,能夠通知到各應用程序,應用程序刷新配置不須要重啓。web

 

基本原理

git 上存放咱們的遠程配置文件 
config-server 鏈接到 git 
config-client 鏈接到config-server 
當咱們啓動config-client 服務的時候,client 會經過鏈接的 config-server 拿到遠程git 上面的配置文件,而後經過 Spring 加載到對象中。 redis

構建Config Server

pom.xml依賴spring

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

 

建立Spring Boot的程序主類,並添加@EnableConfigServer註解,開啓Config Serverbootstrap

@EnableConfigServer
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
}

application.properties中配置服務信息以及git信息服務器

spring.application.name=config-server
#spring boot port
server.port=7001

# git管理配置
spring.cloud.config.server.git.uri=http://git.oschina.net/zjb_china/SpringCloud-Learning
spring.cloud.config.server.git.searchPaths=Chapter9-1-4/config-repo
spring.cloud.config.server.git.username=username
spring.cloud.config.server.git.password
=password
  • spring.cloud.config.server.git.uri:配置git倉庫位置
  • spring.cloud.config.server.git.searchPaths:配置倉庫路徑下的相對搜索位置,能夠配置多個
  • spring.cloud.config.server.git.username:訪問git倉庫的用戶名
  • spring.cloud.config.server.git.password:訪問git倉庫的用戶密碼

到這裏,使用一個經過Spring Cloud Config實現,並使用git管理內容的配置中心已經完成了,啓動該應用app

Spring Cloud Config也提供本地存儲配置的方式

咱們只須要設置屬性spring.profiles.active=native,Config Server會默認從應用的src/main/resource目錄下檢索配置文件。分佈式

也能夠經過spring.cloud.config.server.native.searchLocations=file:F:/properties/屬性來指定配置文件的位置。svn

服務端驗證

Chapter9-1-4/ 下建立了一個config-repo目錄做爲配置倉庫,並根據不一樣環境新建了下面四個配置文件:

  • didispace.properties
  • didispace-dev.properties
  • didispace-test.properties
  • didispace-prod.properties

其中設置了一個from屬性,爲每一個配置文件分別設置了不一樣的值,如:

  • from=git-default-1.0
  • from=git-dev-1.0
  • from=git-test-1.0
  • from=git-prod-1.0

同時建立一個config-label-test分支,並將各配置文件中的值用2.0做爲後綴

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

要訪問config-label-test分支,didispace應用的prod環境,能夠經過這個url:http://localhost:7001/didispace/prod/config-label-test

 

如何在微服務應用中獲取配置信息

pom.xml依賴

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

 

 

建立bootstrap.properties配置,來指定config server

#bootstrap.properties的加載也是先於application.properties

#bootstrap.properties配置,來指定config server

#對應前配置文件中的{application}部分
spring.application.name=didispace
#對應前配置文件中的{profile}部分
spring.cloud.config.profile=test
#對應前配置文件的git分支
spring.cloud.config.label=config-label-test
#配置中心的地址
spring.cloud.config.uri=http://localhost:7001/
#spring boot port
server.port=7002

 

  • spring.application.name:對應前配置文件中的{application}部分
  • spring.cloud.config.profile:對應前配置文件中的{profile}部分
  • spring.cloud.config.label:對應前配置文件的git分支
  • spring.cloud.config.uri:配置中心的地址

上面這些屬性必須配置在bootstrap.properties中,config部份內容才能被正確加載。由於config的相關配置會先於application.properties,而bootstrap.properties的加載也是先於application.properties

 

建立最基本的Spring Boot啓動主類

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }
}

建立一個Rest Api來返回配置中心的from屬性

@RefreshScope
@RestController
class TestController {
    @Value("${from}")
    private String from;
    @RequestMapping("/from")
    public String from() {
        return this.from;
    }
}

經過@Value("${from}")綁定配置服務中配置的from屬性。

啓動該應用,並訪問:http://localhost:7002/from ,咱們就能夠根據配置內容輸出對應環境的from內容了。

 

 

如何在不重啓 config-client 服務的狀況下讓項目中引用的配置信息更新呢? 

 

config-client 工程中添加依賴監控模塊,其中包含了/refresh刷新API

 

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <optional>true</optional>
</dependency>

 

在須要自動更新配置變量的Java類上,使用註解 @RefreshScope 修飾  

 

 之後當咱們再更新git上面的配置文件後,在 config-client 端執行POST 請求 http://localhost:8080/refresh 就能夠更新刷新配置變量到內存中了

 

若是咱們 config-client 作的是分佈式部署,豈不是要每個機器都POST一下 /refresh 請求,這樣顯然不是最好的方法。 
Spring Cloud Bus 爲咱們解決了這樣的問題。

 

 經過Spring Cloud Bus來實現以消息總線的方式進行通知配置信息的變化,完成集羣上的自動化更新。

Cloud Bus 須要依賴AMQP、Redis、Kafka 這樣的組件作爲代理纔可使用。

相關文章
相關標籤/搜索