目錄
-
- 1.前言
- 2.分布式配置中心搭建
- 3.手動重新整理配置
- 4.消息總線動态重新整理配置
- 5.消息總線重新整理配置原了解析
1.前言
一提到微服務,那麼離不開的就是配置中心,而對于多個服務共用的配置我們總希望有一個配置中心進行儲存。Springcloud提供的
Spring Cloud Config
就為我們提供了這個能力,下邊我們從零開始搭建一個分布式配置中心。
2.分布式配置中心搭建
服務 | 端口 | 作用 |
---|---|---|
eureka-service | 8761 | 注冊中心 |
config-service | 8888 | 配置中心服務端 |
producer-client | 9001 | 用戶端 |
producer-client | 9002 | 用戶端 |
- 碼雲上建立配置檔案件儲存配置檔案
注意:配置檔案名稱需根據規則進行設定:如,其中
config-client-dev.yml
:表示定義的服務名,
config-client
:表示激活何種模式,主要針對不同的場景設定不同的配置檔案,如生産、開發、測試等環境
dev
- 建立注冊中心
eureka-service
-
建立分布式配置中心服務端
(1)引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
(2) 配置
application.yml
在此以碼雲為例進行配置,大家也可以使用github賬戶或svn賬号配置均可
spring:
cloud:
config:
server:
git:
uri: https://gitee.com/xxx/spring-cloud-config.git
search-paths:
- config
default-label: master
username: admin
password: admin
配置說明:
配置 | 說明 |
---|---|
uri | git中配置檔案倉庫位址 |
search-paths | 配置檔案夾 |
default-label | 配置檔案所在分支 |
username | 碼雲使用者名 |
password | 碼雲密碼 |
(3)啟動配置中心
通路
http://localhost:8888/config-producer-dev.yml
出現如下界面表示配置中心服務端配置成功,下圖中userAge=22即為第一步中配置檔案配置資訊
-
建立分布式配置中心用戶端
(1)引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
注意:一定要引入
spring-boot-starter-web
依賴,否則配置不成功
(2)配置
bootstrap.yml
spring:
cloud:
config:
name: config-producer
label: master
profile: dev
discovery:
service-id: config-server
enabled: true
fail-fast: false
retry:
max-attempts: 6
配置說明:
配置 | 說明 |
---|---|
spring.cloud.config.name | 表示配置檔案中配置的字首名稱,本例中配置檔案在git中名為 |
spring.cloud.config.profile | 配置選擇那一個配置檔案,根據配置檔案名選擇 |
spring.cloud.config.label | 選擇分支 |
spring.cloud.config.discovery.service-id | 表示配置中心服務端名稱 |
spring.cloud.config.discovery.enabled | 表示可發現配置中心 |
spring.cloud.config.fail-fast | 表示是否快速失敗 |
spring.cloud.config.retry.max-attempts | 表示失敗重試次數 |
(3)啟動測試
當啟動用戶端時,擷取配置檔案中變量 ,則能正常擷取到配置檔案變量值表示配置中心用戶端配置成功
通過上述配置,我們在啟動時能正常擷取配置檔案中的值,但當配置檔案中值被修改時,我們此時隻能通過重新開機服務的方式來擷取配置檔案中的值 ,在實際生産中我們不可能每次修改配置檔案就重新開機服務,是以我們需要下邊的屬新配置檔案。
3.手動重新整理配置
-用戶端增加服務監控依賴
<!-- actuator監控中心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 用戶端修改配置檔案
bootstrap.yml
management:
endpoints:
web:
exposure:
include: "*"
- 擷取配置檔案處類上增加
@RefreshScope
@RestController
@RefreshScope
public class ProducerController {
@Value("${userAge}")
private String userAge;
@GetMapping("/test1")
public String test1(){
return userAge;
}
}
- 當修改配置檔案後,需手動執行如下
請求,ip及端口為用戶端配置端口POST
$ http://localhost:9001/actuator/refresh
通過上述配置,我們修改完配置中心配置後,在手動請求一次上述更新接口,則會将服務擷取到的配置進行更新。但上述手動重新整理配置存在問題,如果服務有成百上千個,那麼我們就要對每個服務進行重新整理,顯然是不可取的,是以我們需要配置Bus消息總線進行動态重新整理配置
4.消息總線動态重新整理配置
- 配置中心服務端、用戶端均增加消息總線依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- 配置檔案中增加
配置,預設為本機rabbitmq
,且賬戶名密碼均為mq
,guest
可選擇mq
和rabbitmq
kafka
spring:
rabbitmq:
host: 192.168.1.100
port: 5672
username: admin
password: admin
- 配置重新整理
management:
endpoints:
web:
exposure:
include: bus-refresh
-
啟動測試
上述配置完成後,我們啟動多個用戶端,同時修改配置檔案,當我們通路用戶端請求時發現配置依然沒有更新,我們還需要手動執行如下請求:
$ http://localhost:9001/actuator/bus-refresh
當執行完上述請求後,我們在通路啟動的兩個用戶端發現配置已經更新,雖然結合Bus消息總線進行消息重新整理也需要手動觸發一次,但是觸發一次就已經将配置更新至所有服務,是以此種方式也是可取的。至此,我們的分布式配置中心搭建以及整合Bus進行配置動态重新整理已經整合完畢。
5.消息總線重新整理配置原了解析
- 當配置搭建完畢,啟動服務時,我們登入
發現會多一個rabbitmq
,同時啟動的用戶端均有一個隊列綁定該exchange
。exchange
- 當配置中心檔案進行修改後,我們手動發送一次重新整理請求,實質以消息形式發送至上述建構的
中。exchange
- 當消息發送至
中時,根據路由鍵路由至綁定的隊列中,由于路由鍵為通配符exhange
表示任何請求均發送至隊列中,通過一次請求重新整理所有服務配置。#