SpringCloud Config統(tǒng)一配置中心問題分析解決與客戶端動(dòng)態(tài)刷新實(shí)現(xiàn)
一、問題分析及解決方案
1、問題分析
上一章我們講過遠(yuǎn)程倉(cāng)儲(chǔ)統(tǒng)一管理配置信息,客戶端可以通過統(tǒng)一配置服務(wù)中心 config server 服務(wù)端獲取配置信息?,F(xiàn)在我們來做一個(gè)改變,并進(jìn)行分析。
首先啟動(dòng)注冊(cè)中心、統(tǒng)一配置中心configserver服務(wù)端、訂單服務(wù)。瀏覽器訪問地址:http://localhost:9000/order/getConfig 查看效果。
然后將遠(yuǎn)程倉(cāng)儲(chǔ)的訂單服務(wù)dev環(huán)境的信息進(jìn)行改變,在info上增加版本 version=01。
瀏覽器訪問地址:http://localhost:9000/order/getConfig 查看效果
重新啟動(dòng)訂單服務(wù),瀏覽器訪問地址http://localhost:9000/order/getConfig 查看效果
我們看到,遠(yuǎn)端倉(cāng)儲(chǔ)的配置信息改變,如果不重新啟動(dòng)訂單服務(wù),則無法刷新遠(yuǎn)端倉(cāng)儲(chǔ)的配置信息。
2、解決方案
使用動(dòng)態(tài)刷新,動(dòng)態(tài)刷新分為兩種形式,一種是手動(dòng)刷新,一種是自動(dòng)刷新。
二、手動(dòng)刷新
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> <!--動(dòng)態(tài)健康監(jiān)控 可以用于動(dòng)態(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)程倉(cāng)儲(chǔ)的地址的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、手動(dòng)刷新
在cmd窗口進(jìn)行手動(dòng)刷新,必須是post請(qǐng)求,且地址固定:curl -X POST "http://localhost:9000/actuator/refresh"。
再次訪問:http://localhost:9000/order/getConfig
三、自動(dòng)刷新
問題:每個(gè)微服務(wù)如果需要加載最新配置信息,必須向每個(gè)微服務(wù)手動(dòng)發(fā)送post請(qǐng)求,才能加載最新配置信息。因?yàn)槲⒎?wù)一般是集群方式,所以此種方式不方便,我們可以使用一個(gè)組件Bus總線,實(shí)現(xiàn)自動(dòng)刷新。Bus總線支持RubbitMQ和kafak消息代理。
什么是總線
在微服務(wù)架構(gòu)的系統(tǒng)中,通常會(huì)使用輕量級(jí)的消息代理來構(gòu)建一個(gè)共用的消息主題,并讓系統(tǒng)中所有微服務(wù)實(shí)例都連接上來。由于該主題中產(chǎn)生的消息會(huì)被所有實(shí)例監(jiān)聽和消費(fèi),所以稱它為消息總線。在總線上的各個(gè)實(shí)例,都可以方便地廣播一些需要讓其他連接在該主題上的實(shí)例都知道的消息。
基本原理
ConfigClient實(shí)例都監(jiān)聽MQ中同一個(gè)topic(默認(rèn)是springCloudBus)。當(dāng)一個(gè)服務(wù)刷新數(shù)據(jù)的時(shí)候,它會(huì)把這個(gè)信息放入到Topic中,這樣其它監(jiān)聽同一Topic的服務(wù)就能得到通知,然后去更新自身的配置。
到此這篇關(guān)于SpringCloud Config統(tǒng)一配置中心問題分析解決與客戶端動(dòng)態(tài)刷新實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringCloud Config配置中心內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Springboot+Mybatis對(duì)數(shù)據(jù)訪問層進(jìn)行單元測(cè)試的方式分享
本文將介紹一種快高效、可復(fù)用的解決測(cè)試方案——對(duì)數(shù)據(jù)訪問層做單元測(cè)試,文章通過代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-07-07Java Flink窗口觸發(fā)器Trigger的用法詳解
Trigger(窗口觸發(fā)器)決定了窗口(由 WindowAssigner 產(chǎn)生)什么時(shí)候調(diào)用窗口處理函數(shù)??梢愿鶕?jù)指定的時(shí)間或數(shù)據(jù)元素條件來決定什么時(shí)候觸發(fā)。本文將詳細(xì)講講其用法,需要的可以參考一下2022-07-07eclipse導(dǎo)入IntelliJ IDEA的maven項(xiàng)目的示例
本篇文章主要介紹了eclipse導(dǎo)入IntelliJ IDEA的maven項(xiàng)目的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12springboot實(shí)現(xiàn)異步調(diào)用@Async的示例
這篇文章主要介紹了springboot實(shí)現(xiàn)異步調(diào)用@Async的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Java Lambda List轉(zhuǎn)Map代碼實(shí)例
這篇文章主要介紹了Java Lambda List轉(zhuǎn)Map代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03什么是springMVC?視圖和視圖解析器實(shí)例代碼
在 springMVC 中的目標(biāo)方法最終返回都是一個(gè)視圖,返回的視圖都會(huì)由一個(gè)視圖解析器來處理,這篇文章主要介紹了什么是springMVC?視圖和視圖解析器,需要的朋友可以參考下2023-09-09關(guān)于SpringCloud整合RabbitMQ的實(shí)例
這篇文章主要介紹了關(guān)于SpringCloud整合RabbitMQ的實(shí)例,消息隊(duì)列是指利用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺(tái)無關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進(jìn)行分布式系統(tǒng)的集成,是在消息的傳輸過程中保存消息的容器,需要的朋友可以參考下2023-07-07