1. 程式人生 > >Spring Cloud config搭建分散式配置中心

Spring Cloud config搭建分散式配置中心

通常情況下,我們將配置檔案放在各自的服務中,這樣有個缺點,就是每次修改,要重啟服務。如今微服務這麼流行的趨勢下,一個大專案下會有幾十甚至上百上千個微服務組成。這時候就需要一個統一配置管理了。Spring Cloud config 就很好的解決了這一問題。

下圖是Config實現分散式配置中心簡單原理圖:

主要實現需要以下幾個步驟:

  1. 建立git倉庫。用於存放配置檔案。
  2. 安裝kafka,zookeeper。用於分散式專案統一重新整理。
  3. 建立ConfigServer服務,提供專案統一獲取配置的中心服務。可配多個。
  4. 建立ConfigClient服務,作為客戶端。
  5. 利用gitlab的webhook功能,每次push操作,傳送post請求,通知重新整理配置。

一、建立git倉庫。

新增目錄config-repository,在目錄下新建配置檔案 application-test.yml 

my-config: auto refresh

二、安裝kafka,zookeeper。

非本文重點內容,略過這一步。不做具體講解。

三、新建專案config-server,以gradle專案為例。

    1.    build.gradle 新增依賴

 compile "org.springframework.cloud:spring-cloud-config-server"
 compile "org.springframework.cloud:spring-cloud-starter-bus-kafka"

    2.    主類ServerApplication引入註解

@EnableDiscoveryClient
@SpringBootApplication
@EnableConfigServer
public class ConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigApplication.class, args);
    }
}

    3.    配置檔案

配置將剛剛新建的git倉庫地址,和kafka和zk資訊

spring:
  application:
    name: config-server
  http:
      encoding: { charset: UTF-8, enable: true, force: true }
  cloud:
    config:
      server:
        git:
          #git地址
          uri: https://gitee.com/starchi/config-demo.git
          #git地址檢視目錄,可配多個
          search-paths: config-repository
    stream:
      #指定用kafka stream來作為預設訊息中介軟體
      default-binder: kafka
      kafka:
        binder:
          brokers: localhost:9092
          zkNodes: localhost:2181,localhost:2182,localhost:2183

    4.    啟動config-server,訪問 http://localhost:8888/my-config/test/dev

{"name":"my-config","profiles":["test"],"label":"dev","version":"bd9049126a818271dc04bb1da45bd37309f4d06f","state":null,"propertySources":[{"name":"https://gitee.com/starchi/config-demo.git/config-repository/application-test.yml","source":{"my-config":"auto refresh"}}]}

可以看到config-server已經可以從git上讀取到配置檔案了。可以通過如下表中的方式訪問git上的資源:

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

四、新建專案config-client

    1.    build.gradle 新增依賴

 compile 'org.springframework.cloud:spring-cloud-config-client'
 compile 'org.springframework.cloud:spring-cloud-starter-bus-kafka'

    2.    主類ClientApplication引入註解

@EnableDiscoveryClient
@SpringBootApplication
public class ClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }
}

     3.    配置 bootstrap.yml 檔案(bootstrap先於application載入)

spring:
  application:
    name: config-client-demo
  http:
    encoding: { charset: UTF-8, enable: true, force: true }
  cloud:
    config:
      name: application
      profile: test,${spring.application.name}
      label: dev
      #config-server地址
      uri: http://localhost:8888
    stream:
      #指定用kafka stream來作為預設訊息中介軟體
      default-binder: kafka
      kafka:
        binder:
          brokers: localhost:9092
          zkNodes: localhost:2181,localhost:2182,localhost:2183

這裡我們可以將spring.cloud.config.uri 替換成

spring:
  cloud:
    config:
      discovery:
        enabled: true
        serviceId: config-server

表示從eureka註冊中心,通過serviceId 拿到配置中心url地址,這就需要我們開啟一臺eureka服務。將config-server和config-client的application.yml中,都配上如下程式碼

eureka:
  instance:
    preferIpAddress: true
    leaseRenewalIntervalInSeconds: 10
    #在註冊中心展示名稱+ip+隨機數
    instanceId: ${spring.application.name:${random.value}}:${server.port}
  client:
    serviceUrl:
      defaultZone: http://localhost:1111/eureka/

    4.新建controller驗證

@RestController
@RefreshScope
public class TestController {
    @Value("${my-config}")
    private String name;
    @RequestMapping("/getName")
    public String getAppName() {
        return name;
    }
}

    5.瀏覽器訪問 http://localhost:8081/getName

auto refresh

說明client服務以及可以從config-server拿到值了。

這時我們可以複製啟用多臺config-client服務。然後修改git倉庫,application-test.yml 中my-config 值

auto refresh success

對config-server傳送post請求:http://localhost:8888/bus/refresh

注:可以配置gitlab的webhook,每次對config-repository進行push操作,傳送post請求。

再次訪問多臺config-client服務的 http://localhost:****/getName

auto refresh success

讀到的配置均已重新整理。這時因為引入的bus包,通過kafka+zk通知到config-client,令其重新獲取配置。

一個簡單的分散式配置中心已經搭建完成。

本文原始碼下載地址:https://gitee.com/starchi/config-demo.git

\(^o^)/~