1. 程式人生 > >springcloud 使用git作為配置中心

springcloud 使用git作為配置中心

首先,需要明確一個配置中心提供的核心功能應該有什麼

  • 提供服務端和客戶端支援
  • 集中管理各環境的配置檔案
  • 配置檔案修改之後,可以快速的生效
  • 可以進行版本管理
  • 支援大的併發查詢
  • 支援各種語言

Spring Cloud Config可以完美的支援以上所有的需求。

Spring Cloud Config專案是一個解決分散式系統的配置管理方案。它包含了Client和Server兩個部分,server提供配置檔案的儲存、以介面的形式將配置檔案的內容提供出去,client通過介面獲取資料、並依據此資料初始化自己的應用。Spring cloud使用git或svn存放配置檔案,本專案以git做為示例。

git配置中心

建立git倉庫,存放配置檔案

首先,在git中建立一個倉庫,存放我們的配置檔案,如下:建立了一個倉庫叫做:spring-cloud-demo,建立一個資料夾:config-repo,存放兩個配置檔案:config-dev.properties,config-test.properties

比如,我們經常需要配置我們的資料來源,我們配置了兩個資料來源,生產環境的配置儲存在config-dev.properties中:

同樣的,在測試環境的配置儲存在config-test.properties中。

提供端

新增依賴:

在server端中新增依賴,(當然了,spring-boot的依賴也得要的)

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

本地配置

首先,新增如下配置:

eureka:
  client:
    service-url:
      defaultZone: http://localhost:9999/eureka/ #將服務註冊到那個註冊中心去
server:
  port: 7777
spring:
  application:
    name: demo-provider
  cloud:
    config:
      server:
        git:
          uri: https://github.com/aBreaking/spring-cloud-demo/  #github 倉庫地址
          search-paths: config-repo #配置中心
          username: github賬號
          password: github密碼

啟動類註解

在啟動類中新增@EnableConfigServer註解

@SpringBootApplication
@EnableConfigServer
public class ProviderApplication {

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

啟動provider

這裡的地址為:ip:port/配置檔名。可看到如下:

你會看到如下:你的配置中心的資訊

即配置中心搭建成功。

使用端

新增依賴

在client端中新增依賴:(當然了,spring-boot的依賴也得要的)

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

本地配置

此時,有兩種呼叫方式,一種是直接根據server端的地址(ip:port)來進行配置呼叫,第二種是server端作為provider註冊到註冊中心去。很明顯,第二種方式的配置要優於第一種,因為server端的地址一旦改變的話,那麼client端還得做配置的修改,很麻煩,此外,為了保證保證高可用,可以配置多個server端,如果某一臺server掛掉,也不會有影響。

1、直接使用server端

新增一個配置檔案:bootstrap.properties。spring初始化時會先載入該配置檔案,載入順序優於applicaiton.properties。新增內容如下:

spring.cloud.config.name=config
spring.cloud.config.profile=test
spring.cloud.config.uri=http://localhost:7777
spring.cloud.config.label=master

同樣application.properties中也得有配置:

spring.application.name=demo-consumer
server.port=8888

2、從註冊中心中獲取

那麼,首先,需要將server註冊到註冊中心去,正常的服務註冊操作即可。可參考

server端註冊到註冊中心後,client端bootstrap.properties進行配置:

spring.cloud.config.name=config
spring.cloud.config.profile=dev
spring.cloud.config.label=master
spring.cloud.config.discovery.enabled=true 
spring.cloud.config.discovery.service-id=demo-provider #server端的應用名
eureka.client.service-url.defaultZone=http://localhost:9999/eureka/ #註冊中心的地址

建立controller

接下來直接使用即可。建立一個controller,如下:

@RestController
public class ClientController {

    @Value("${jdbc.url}")
    String url;
    @Value("${jdbc.username}")
    String username;
    @Value("${jdbc.password}")
    String password;

    @RequestMapping("/test")
    public String test(){
       return "測試環境資料來源連線資訊:url:"+url+",username:"+username+",password:"+password;
    }
}

啟動專案

動態重新整理

一個問題

配置中心就這樣能夠搭建成功。那麼一個問題來了:

我們修改一下配置檔案,再push到遠端倉庫,這時,我們再次訪問server端:http://localhost:7777/config-dev.properties,OK,你會發現,server端正常重新整理了資料,即跟遠端倉庫的資料是同步的,沒問題。這時,我們再訪問下client端:http://localhost:8888/test,發現client端並沒有動態重新整理資料,還是老的資料。所以,我們還得需要為client端動態重新整理。

新增依賴

只需要對client端進行操作即可,新增spring-boot-starter-actuator依賴。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>1.4.4.RELEASE</version>
        </dependency>

Controller添加註解

還得需要對client端具體的Controller新增@RefreshScope註解,使用該註解的類,會在接到SpringCloud配置中心配置重新整理的時候,自動將新的配置更新到該類對應的欄位中。


@RestController
@RefreshScope       // 使用該註解的類,會在接到SpringCloud配置中心配置重新整理的時候,自動將新的配置更新到該類對應的欄位中。
public class ClientController {

    @Value("${jdbc.url}")
    String url;
    @Value("${jdbc.username}")
    String username;
    @Value("${jdbc.password}")
    String password;

    @RequestMapping("/ds")
    public String ds(){
        return "測試環境資料來源連線資訊:url:"+url+",username:"+username+",password:"+password;
    }

refresh重新整理

正常啟動專案後,每次配置檔案資料修改後,client要想同步,需要以post的方式訪問url:http://localhost:8888/refresh這個地址,才能進行同步,如下:

後記

如果consumer啟動出現如下異常:java.lang.IllegalArgumentException: Could not resolve placeholder 'jdbc.url' in value "${jdbc.url}"。

確保consumer專案中沒有spring-cloud-config-server依賴