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

然后將遠(yuǎn)程倉儲的訂單服務(wù)dev環(huá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ù)端點
讓客戶端能感受到配置的更新。
暴露服務(wù)端點,讓客戶端能感受到配置的更新,在bootstrap配置文件中修改如下:
spring:
cloud:
config:
label: master # 指定分支
name: order # 指定應(yīng)用名稱
profile: dev # 指定激活環(huán)境
uri: http://localhost:7009 #硬編碼 指定訪問 config server 遠(yuǎn)程倉儲的地址的ip和端口
#暴露服務(wù)端點,讓客戶端能感受到配置的更新
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窗口進行手動刷新,必須是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)聽和消費,所以稱它為消息總線。在總線上的各個實例,都可以方便地廣播一些需要讓其他連接在該主題上的實例都知道的消息。
基本原理
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)文章
Java利用ElasticSearch實現(xiàn)增刪改功能
這篇文章主要為大家詳細(xì)介紹了Java如何利用ElasticSearch實現(xiàn)增刪改功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-08-08
win7 64位系統(tǒng)JDK安裝配置環(huán)境變量教程
這篇文章主要為大家詳細(xì)介紹了win7 64位系統(tǒng)JDK安裝配置環(huán)境變量教程,感興趣的小伙伴們可以參考一下2016-06-06
IDEA 如何導(dǎo)入別人的javaweb項目進行部署
這篇文章主要介紹了IDEA 如何導(dǎo)入別人的javaweb項目進行部署,本文給大家分享我的詳細(xì)部署過程及遇到問題解決方法,需要的朋友可以參考下2023-03-03
idea springboot 修改css,jsp不重啟實現(xiàn)頁面更新的問題
這篇文章主要介紹了idea springboot 修改css,jsp不重啟實現(xiàn)頁面更新的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
Spring?Security認(rèn)證器實現(xiàn)過程詳解
一些權(quán)限框架一般都包含認(rèn)證器和決策器,前者處理登陸驗證,后者處理訪問資源的控制,這篇文章主要介紹了Spring?Security認(rèn)證器實現(xiàn)過程,需要的朋友可以參考下2022-06-06
SpringBoot @ModelAttribute使用場景分析
這篇文章主要介紹了SpringBoot @ModelAttribute使用場景分析,文中通過實例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08
關(guān)于SpringBoot在有Ajax時候不跳轉(zhuǎn)的問題解決
最近在使用Ajax來發(fā)送一些數(shù)據(jù)給后臺一個Controller,但是遇到些問題,所以下面這篇文章主要給大家介紹了關(guān)于SpringBoot在有Ajax時候不跳轉(zhuǎn)問題的解決辦法,需要的朋友可以參考下2022-05-05

