Spring Cloud config搭建分散式配置中心
通常情況下,我們將配置檔案放在各自的服務中,這樣有個缺點,就是每次修改,要重啟服務。如今微服務這麼流行的趨勢下,一個大專案下會有幾十甚至上百上千個微服務組成。這時候就需要一個統一配置管理了。Spring Cloud config 就很好的解決了這一問題。
下圖是Config實現分散式配置中心簡單原理圖:
主要實現需要以下幾個步驟:
- 建立git倉庫。用於存放配置檔案。
- 安裝kafka,zookeeper。用於分散式專案統一重新整理。
- 建立ConfigServer服務,提供專案統一獲取配置的中心服務。可配多個。
- 建立ConfigClient服務,作為客戶端。
- 利用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^)/~