SpringCloud系列之分散式配置中心極速入門與實踐
阿新 • • 發佈:2020-09-09
[toc]
### 1、分散式配置中心簡介
在實際的專案開發中,配置檔案是使用比較多的,很多專案有測試環境(TEST)、開發環境(DEV)、規範的專案還有整合環境(UAT)、生產環境(PROD),每個環境就一個配置檔案。
CSDN連結:[SpringCloud系列之分散式配置中心極速入門與實踐](https://smilenicky.blog.csdn.net/article/details/108491861)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200909152028586.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70#pic_center)
這個在單體應用的專案裡是沒什麼問題,如果是分散式微服務專案,就會有很多的模組,比如微服務A、微服務B等等,每個工程都有一套配置檔案,隨著業務增長,肯定會有很多配置,分散管理,不能實現統一的管理,所以就有了微服務的配置檔案統一管理元件,比如spring cloud官方的spring cloud config、攜程的 Apollo,還有最近比較火的阿里 nacos,每款產品各有自己的特點,不過本部落格只介紹spring cloud config
作為一款分散式的配置中心,其基本的功能應該有統一的配置檔案管理,至於怎麼儲存可以自行設計,客戶端可以從配置中心下拉配置資料,還有一個重要功能就是推送,有了推送功能,才能做到將資料統一發給客戶端及時更新,總不能讓客戶端自己pull,如果在客戶端很多的情況,這種肯定是不合理的,簡單畫圖表示:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200909140023296.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70#pic_center)
### 2、什麼是SpringCloud Config?
ok,前面簡單介紹了分散式配置中心的基本概念,現在看看spring cloud提供的這塊分散式配置中心spring cloud config是怎麼設計?簡單歸納其特點:
* 檔案儲存:預設Git倉庫(github、gitlab等等)
* 版本關聯:預設Git
* 許可權控制:需要Git支援
* 多環境(profile):配置檔案指定
* 動態更新:需要基於Springcloud config bus
* 定時更新:需要自行拓展
* 管理後臺:預設不帶
所以有一個明顯的特點,springcloud config預設就是基於git倉庫來實現配置檔案統一管理的,所以很明顯其有如下角色:
* 配置倉庫:git倉庫
* 配置服務端:config server,負責從git倉庫下拉配置檔案到本地,然後可以統一推送給客戶端
* 配置客戶端:各微服務業務客戶端,可以從配置服務端pull配置資料
ok,簡單畫圖表示其架構,如圖所示:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200909113606141.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70#pic_center)
### 3、例子實驗環境準備
環境準備:
* JDK 1.8
* SpringBoot2.2.3
* SpringCloud(Hoxton.SR7)
* Maven 3.2+
* 開發工具
* IntelliJ IDEA
* smartGit
github遠端倉庫建立,可以在github上建立一個springCloudExamples專案,然後新建一個資料夾,命名為config-repository
### 4、Config Server程式碼實現
建立一個SpringBoot Initialize專案,詳情可以參考我之前部落格:[SpringBoot系列之快速建立專案教程](https://blog.csdn.net/u014427391/article/details/102870300)
如圖:選擇config Server
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200812171034716.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70#pic_center)
也可以自行在maven引入如下配置:
```xml
org.springframework.cloud
spring-cloud-config-server
```
使用註解`@EnableConfigServer`表示這個config服務端工程
```java
package com.example.springcloud.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@SpringBootApplication
@EnableConfigServer
public class SpringcloudConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudConfigServerApplication.class, args);
}
}
```
新建bootstrap.yml配置檔案,指定github倉庫的地址:
```yaml
server:
port: 8761
spring:
application:
name: springcloud-config-server
cloud:
config:
server:
git:
uri: https://github.com/your_github_account/springCloudExamples
username: your_github_account
password: your_github_password
search-paths: config-repository
```
### 5、Config Client程式碼實現
同樣新建SpringBoot Initialize專案,快速建立
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020081217104979.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70#pic_center)
pom配置檔案:
```xml
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-config
```
yaml配置,uri指定為config server的地址,profile是環境變數,可以指定為dev(開發環境),label表示分支,master是指github的主幹分支
```yaml
server:
port: 8082
spring:
application:
name: springcloud-config-client
cloud:
config:
uri: http://127.0.0.1:8761/
profile: dev
label: master
```
然後,我們要在github倉庫新建配置檔案:命名規範必須是客戶端的spring. application.name加上profile
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200909151121759.png#pic_center)
在配置檔案,隨便寫點:
```
config.client.profile=springcloud-config-client-dev
```
測試:要先啟動config server,然後再啟動config client,寫個例子測試,要加上`@RefreshScope`實現重新整理功能
```java
@RestController
@RefreshScope
public class ConnfigClientController {
@Value("${config.client.profile}")
private String profile;
@GetMapping(value = "/test")
public String test() {
return this.profile;
}
}
```
啟動SpringBoot專案,測試:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200812204611315.png#pic_center)
在config server啟動過程,可以看到config server從github下拉配置檔案到本地快取,具體是C盤AppData目錄
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200904170432991.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70#pic_center)
### 6、客戶端pull重新整理實現
客戶端要實現下拉配置資料,怎麼實現?可以整合spring-boot-starter-actuator來實現:
pom配置:
```xml
org.springframework.boot
spring-boot-starter-actuator
```
spring-boot-starter-actuator配置:include加上rehresh配置
```yaml
management:
endpoints:
web:
# 字首名,預設也是actuator
base-path: /actuator
# 預設只開放info,health的方式訪問,加上refresh
exposure:
include: info,health,refresh
endpoint:
health:
show-details: always
refresh:
enabled: true
```
訪問客戶端的連結,注意要用post方式,[http://localhost:8082/actuator/refresh](http://localhost:8082/actuator/refresh)
github配置檔案沒更新的情況:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/2020090417270337.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70#pic_center)
修改配置檔案,commit和push到github
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200904172841218.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70#pic_center)
呼叫介面時候,可以看到config client從config server獲取資料:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200904172911310.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70#pic_center)
### 7、訊息匯流排Spring Cloud Bus
* 什麼是匯流排?
在微服務架構的系統中,通常會使用輕量級的訊息代理來構建一個共用的訊息主題,並讓系統中所有微服務例項都連結上來。由於該主題中產生的訊息會被所有例項監聽和消費,所以稱它為訊息匯流排。
* 什麼是Spring Cloud Bus?
> Spring Cloud Bus是用來將分散式系統的節點與輕量級訊息系統連結起來的框架,它整合了Java的事件處理機制和訊息中介軟體的功能
>Spring Cloud Bus能管理和傳播分散式訊息間的訊息,就像一個分散式執行器,可用於廣播狀態更改、事件推送等,也可以當作微服務間的通訊通道 看了理論,貌似不理解?所以還是從前面學習說起,前面介紹說明作為一個分散式的配置中心,至少應該有推送訊息的功能,所以這個配置中心的角色可以由config server充當,實現的效果是config server(配置中心)一重新整理資料,客戶端都能同步更新,畫圖進行說明: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200909154659661.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70#pic_center) * 1、配置中心(config server)執行bus-refresh,spring cloud bus提供的重新整理介面,配置中心就從git倉庫下拉資料到本地git倉庫 * 2、執行bus-refresh之後,將訊息發給spring cloud bus(訊息匯流排),訊息匯流排將訊息寫到訊息佇列(rabbitMQ)的topic中 * 3、只要訂閱這個訊息佇列topic的都能監聽到spring cloud bus的訊息(基於rabbitmq) * 4、監聽到之後,config client從config server pull更新配置資料 其實簡而言之,Config Client例項都監聽RabbitMQ中同一個topic,當一個服務重新整理資料的時候,它會把這個資訊放入到Topic中,這樣其它監聽同一Topic的服務就能得到通知,然後去更新自身的配置,當然這個重新整理操作不一定要放在config server,也可以放在某個客戶端觸發,只要將訊息傳送給訊息匯流排就可以 ### 8、Docker安裝部署RabbitMQ 主要介紹一下Docker版本,常用的docker映象操作: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200408180045649.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70) 查詢rabbitMQ映象: management版本,不指定預設為最新版本latest ```shell docker search rabbitmq:management ``` ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/202004081815519.png) 拉取映象: ```shell docker pull rabbitmq:management ``` 檢視docker映象列表: ```shell docker images ``` Docker容器操作: ok,上面命令執行後,映象就已經拉取到本地倉庫了,然後可以進行容器操作,啟動rabbitMQ 簡單版 ```shell docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management ``` * -d 後臺執行 * -p 隱射埠 * --name 指定rabbitMQ名稱 複雜版(設定賬戶密碼,hostname) ```powershell docker run -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --name rabbitmq --hostname=rabbitmqhostone rabbitmq:management ``` * -d 後臺執行 * -p 隱射埠 * --name 指定rabbitMQ名稱 * RABBITMQ_DEFAULT_USER 指定使用者賬號 * RABBITMQ_DEFAULT_PASS 指定賬號密碼 執行如上命令後訪問:http://ip:15672/ 預設賬號密碼:guest/guest ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200408181214452.png) ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200409164212323.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70) 其它常用容器命令: 檢視執行中的容器 ```shell # 檢視所有的容器用命令docker ps -a docker ps ``` 啟動容器 ``` # eg: docker start 9781cb2e64bd docker start CONTAINERID[容器ID] ``` stop容器 ```shell docker stop CONTAINERID[容器ID] ``` 刪除一個容器 ```shell docker rm CONTAINERID[容器ID] ``` 檢視Docker容器日誌 ``` # eg:docker logs 9781cb2e64bd docker logs container‐name[容器名]/container‐id[容器ID] ``` ### 9、Spring Cloud Bus動態重新整理 有了前面的學習,接著進行程式碼例子實踐,config server pom配置: ```xml
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-bus-amqp
```
yaml配置:開放bus-refresh
```yaml
management:
endpoints:
web:
base-path: /actuator
exposure:
include: info,health,refresh,bus-refresh
endpoint:
health:
show-details: always
refresh:
enabled: true
```
加上rabbitmq配置
```yaml
# RabbitMQ配置
rabbitmq:
host: 192.168.6.155
port: 5672
username: guest
password: guest
virtual-host: /
```
Config Client程式碼例子改造,pom配置:
```xml
org.springframework.cloud
spring-cloud-starter-bus-amqp
```
也要加上rabbitMQ配置,這樣才能訂閱更新:
```yaml
# RabbitMQ配置
rabbitmq:
host: 192.168.6.155
port: 5672
username: guest
password: guest
virtual-host: /
```
客戶端必須修改,refresh、enabled都要改為true,trace是進行跟蹤的,可以根據需要開啟
```yaml
spring:
cloud:
bus:
enabled: true
refresh:
enabled: true
trace:
enabled: true
```
注意點:為了實時更新,必須加上`@RefreshScope`
配置中心進行bus refresh
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200908181352496.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70#pic_center)
訂閱的客戶端都進行實時更新:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200908181420430.png#pic_center)
程式碼例子下載:[github程式碼例子下載](https://github.com/u014427391/springCloudExamples)
[Springboot系列部落格專欄](https://blog.csdn.net/u014427391/category_9195353.html)
[Springcloud系列部落格專欄](https://blog.csdn.net/u014427391/category_10205863.html)
### 10、官方參考手冊和其它資料
* SpringCloud 2.0系列的官方參考手冊:
[https://docs.spring.io/spring-cloud-config/docs/2.2.x/reference/html/](https://docs.spring.io/spring-cloud-config/docs/2.2.x/reference/html/)
* SpringCloud Config的官方參考手冊:
[https://github.com/spring-cloud/spring-cloud-config/blob/master/docs/src/main/asciidoc/spring-cloud-config.adoc#discovery-first-bootstrap](https://github.com/spring-cloud/spring-cloud-config/blob/master/docs/src/main/asciidoc/spring-cloud-config.adoc#discovery-first-bootstrap)
* 方誌鵬大佬系列Spring Cloud部落格:[https://www.fangzhipeng.com/spring-cloud.html](https://www.fangzhipeng.com/spring-cloud.html)
* 使用Spring Cloud與Docker實戰微服務:[https://eacdy.gitbooks.io/spring-cloud-book/content/](https://eacdy.gitbooks.io/spring-cloud-book/content/)
* 程式設計師DD大佬系列Spring Cloud部落格:[http://blog.didispace.com/spring-cloud-learning/](http://blog.didispace.com/spring-cloud-lea
>Spring Cloud Bus能管理和傳播分散式訊息間的訊息,就像一個分散式執行器,可用於廣播狀態更改、事件推送等,也可以當作微服務間的通訊通道 看了理論,貌似不理解?所以還是從前面學習說起,前面介紹說明作為一個分散式的配置中心,至少應該有推送訊息的功能,所以這個配置中心的角色可以由config server充當,實現的效果是config server(配置中心)一重新整理資料,客戶端都能同步更新,畫圖進行說明: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200909154659661.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70#pic_center) * 1、配置中心(config server)執行bus-refresh,spring cloud bus提供的重新整理介面,配置中心就從git倉庫下拉資料到本地git倉庫 * 2、執行bus-refresh之後,將訊息發給spring cloud bus(訊息匯流排),訊息匯流排將訊息寫到訊息佇列(rabbitMQ)的topic中 * 3、只要訂閱這個訊息佇列topic的都能監聽到spring cloud bus的訊息(基於rabbitmq) * 4、監聽到之後,config client從config server pull更新配置資料 其實簡而言之,Config Client例項都監聽RabbitMQ中同一個topic,當一個服務重新整理資料的時候,它會把這個資訊放入到Topic中,這樣其它監聽同一Topic的服務就能得到通知,然後去更新自身的配置,當然這個重新整理操作不一定要放在config server,也可以放在某個客戶端觸發,只要將訊息傳送給訊息匯流排就可以 ### 8、Docker安裝部署RabbitMQ 主要介紹一下Docker版本,常用的docker映象操作: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200408180045649.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70) 查詢rabbitMQ映象: management版本,不指定預設為最新版本latest ```shell docker search rabbitmq:management ``` ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/202004081815519.png) 拉取映象: ```shell docker pull rabbitmq:management ``` 檢視docker映象列表: ```shell docker images ``` Docker容器操作: ok,上面命令執行後,映象就已經拉取到本地倉庫了,然後可以進行容器操作,啟動rabbitMQ 簡單版 ```shell docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management ``` * -d 後臺執行 * -p 隱射埠 * --name 指定rabbitMQ名稱 複雜版(設定賬戶密碼,hostname) ```powershell docker run -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --name rabbitmq --hostname=rabbitmqhostone rabbitmq:management ``` * -d 後臺執行 * -p 隱射埠 * --name 指定rabbitMQ名稱 * RABBITMQ_DEFAULT_USER 指定使用者賬號 * RABBITMQ_DEFAULT_PASS 指定賬號密碼 執行如上命令後訪問:http://ip:15672/ 預設賬號密碼:guest/guest ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200408181214452.png) ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200409164212323.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ0MjczOTE=,size_16,color_FFFFFF,t_70) 其它常用容器命令: 檢視執行中的容器 ```shell # 檢視所有的容器用命令docker ps -a docker ps ``` 啟動容器 ``` # eg: docker start 9781cb2e64bd docker start CONTAINERID[容器ID] ``` stop容器 ```shell docker stop CONTAINERID[容器ID] ``` 刪除一個容器 ```shell docker rm CONTAINERID[容器ID] ``` 檢視Docker容器日誌 ``` # eg:docker logs 9781cb2e64bd docker logs container‐name[容器名]/container‐id[容器ID] ``` ### 9、Spring Cloud Bus動態重新整理 有了前面的學習,接著進行程式碼例子實踐,config server pom配置: ```xml