SpringCloud Config統(tǒng)一配置中心問題分析解決與客戶端動態(tài)刷新實現(xiàn)
一、問題分析及解決方案
1、問題分析
上一章我們講過遠(yuǎn)程倉儲統(tǒng)一管理配置信息,客戶端可以通過統(tǒng)一配置服務(wù)中心 config server 服務(wù)端獲取配置信息。現(xiàn)在我們來做一個改變,并進(jìn)行分析。
首先啟動注冊中心、統(tǒng)一配置中心configserver服務(wù)端、訂單服務(wù)。瀏覽器訪問地址:http://localhost:9000/order/getConfig 查看效果。

然后將遠(yuǎn)程倉儲的訂單服務(wù)dev環(huán)境的信息進(jìn)行改變,在info上增加版本 version=01。
瀏覽器訪問地址:http://localhost:9000/order/getConfig 查看效果

重新啟動訂單服務(wù),瀏覽器訪問地址http://localhost:9000/order/getConfig 查看效果

我們看到,遠(yuǎn)端倉儲的配置信息改變,如果不重新啟動訂單服務(wù),則無法刷新遠(yuǎn)端倉儲的配置信息。
2、解決方案
使用動態(tài)刷新,動態(tài)刷新分為兩種形式,一種是手動刷新,一種是自動刷新。
二、手動刷新
1、添加服務(wù)監(jiān)控
在pom文件中添加服務(wù)監(jiān)控依賴spring-boot-starter-actuator ,修改pom如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloudbase</artifactId>
<groupId>com.hwadee.springcloud2022</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.hwadee.springcloud</groupId>
<artifactId>orderServer9000</artifactId>
<dependencies>
<!-- 統(tǒng)一配置服務(wù)中心客戶端依賴 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!--動態(tài)健康監(jiān)控 可以用于動態(tài)感知配置變化-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--web依賴-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 管理公共api -->
<dependency>
<groupId>com.hwadee.springcloud</groupId>
<artifactId>springcloud-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--Eureka Client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 方便創(chuàng)建類的gettter setter -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>2、暴露服務(wù)端點(diǎn)
讓客戶端能感受到配置的更新。
暴露服務(wù)端點(diǎn),讓客戶端能感受到配置的更新,在bootstrap配置文件中修改如下:
spring:
cloud:
config:
label: master # 指定分支
name: order # 指定應(yīng)用名稱
profile: dev # 指定激活環(huán)境
uri: http://localhost:7009 #硬編碼 指定訪問 config server 遠(yuǎn)程倉儲的地址的ip和端口
#暴露服務(wù)端點(diǎn),讓客戶端能感受到配置的更新
management:
endpoints:
web:
exposure:
include: "*"
3、刷新業(yè)務(wù)類controller
刷新業(yè)務(wù)類controller,在訂單服務(wù)的controller上使用注解 @RefreshScope ,使用后具備刷新能力,@Refreshscope用來在不需要重啟徽服務(wù)情況下,將當(dāng)前scope域中信息刷新為最新配置信息,訂單服務(wù)的controller代碼修改如下:
import com.hwadee.springcloud.entity.Product;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/order")
@RefreshScope
public class OrderController {
@Value("${env}")
private String env;
@Value("${port}")
private String port;
@Value("${info}")
private String info;
@RequestMapping(value = "/getConfig")
public Product getConfigInfo() {
Product product = new Product();
product.setName(env +"環(huán)境 端口:"+ port +" "+ info);
return product;
}
}4、手動刷新
在cmd窗口進(jìn)行手動刷新,必須是post請求,且地址固定:curl -X POST "http://localhost:9000/actuator/refresh"。

再次訪問:http://localhost:9000/order/getConfig

三、自動刷新
問題:每個微服務(wù)如果需要加載最新配置信息,必須向每個微服務(wù)手動發(fā)送post請求,才能加載最新配置信息。因為微服務(wù)一般是集群方式,所以此種方式不方便,我們可以使用一個組件Bus總線,實現(xiàn)自動刷新。Bus總線支持RubbitMQ和kafak消息代理。
什么是總線
在微服務(wù)架構(gòu)的系統(tǒng)中,通常會使用輕量級的消息代理來構(gòu)建一個共用的消息主題,并讓系統(tǒng)中所有微服務(wù)實例都連接上來。由于該主題中產(chǎn)生的消息會被所有實例監(jiān)聽和消費(fèi),所以稱它為消息總線。在總線上的各個實例,都可以方便地廣播一些需要讓其他連接在該主題上的實例都知道的消息。
基本原理
ConfigClient實例都監(jiān)聽MQ中同一個topic(默認(rèn)是springCloudBus)。當(dāng)一個服務(wù)刷新數(shù)據(jù)的時候,它會把這個信息放入到Topic中,這樣其它監(jiān)聽同一Topic的服務(wù)就能得到通知,然后去更新自身的配置。


到此這篇關(guān)于SpringCloud Config統(tǒng)一配置中心問題分析解決與客戶端動態(tài)刷新實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringCloud Config配置中心內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Springboot+Mybatis對數(shù)據(jù)訪問層進(jìn)行單元測試的方式分享
本文將介紹一種快高效、可復(fù)用的解決測試方案——對數(shù)據(jù)訪問層做單元測試,文章通過代碼示例介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下2023-07-07
Java Flink窗口觸發(fā)器Trigger的用法詳解
Trigger(窗口觸發(fā)器)決定了窗口(由 WindowAssigner 產(chǎn)生)什么時候調(diào)用窗口處理函數(shù)??梢愿鶕?jù)指定的時間或數(shù)據(jù)元素條件來決定什么時候觸發(fā)。本文將詳細(xì)講講其用法,需要的可以參考一下2022-07-07
eclipse導(dǎo)入IntelliJ IDEA的maven項目的示例
本篇文章主要介紹了eclipse導(dǎo)入IntelliJ IDEA的maven項目的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12
springboot實現(xiàn)異步調(diào)用@Async的示例
這篇文章主要介紹了springboot實現(xiàn)異步調(diào)用@Async的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Java Lambda List轉(zhuǎn)Map代碼實例
這篇文章主要介紹了Java Lambda List轉(zhuǎn)Map代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03
關(guān)于SpringCloud整合RabbitMQ的實例
這篇文章主要介紹了關(guān)于SpringCloud整合RabbitMQ的實例,消息隊列是指利用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成,是在消息的傳輸過程中保存消息的容器,需要的朋友可以參考下2023-07-07

