0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

配置中心的核心功能和實(shí)現(xiàn)

jf_ro2CN3Fa ? 來(lái)源:三友的java日記 ? 2023-09-22 11:12 ? 次閱讀

來(lái)源:三友的java日記

最近突然心血來(lái)潮(就是閑的)就想著擼一個(gè)簡(jiǎn)單的配置中心,順便也照葫蘆畫(huà)瓢給整合到SpringCloud。

本文大綱

362ca4a4-58e8-11ee-939d-92fbcf53809c.png

配置中心的概述

隨著歷史的車輪不斷的前進(jìn),技術(shù)不斷的進(jìn)步,單體架構(gòu)的系統(tǒng)都逐漸轉(zhuǎn)向微服務(wù)架構(gòu)。雖然微服務(wù)架構(gòu)有諸多優(yōu)點(diǎn),但是隨著越來(lái)越多的服務(wù)實(shí)例的數(shù)量,配置的不斷增多,傳統(tǒng)的配置文件方式不能再繼續(xù)適用業(yè)務(wù)的發(fā)展,所以急需一種可以統(tǒng)一管理配置文件應(yīng)用,在此之下配置中心就誕生了。

所以配置中心就是用來(lái)統(tǒng)一管理各種服務(wù)配置的一個(gè)組件,本質(zhì)上就是一個(gè)web應(yīng)用。

配置中心的核心功能

一個(gè)配置中心的核心功能其實(shí)主要包括兩個(gè):

配置的存取

配置變更的通知

配置的存取是配置中心不可缺失的功能,配置中心需要能夠?qū)⑴渲眠M(jìn)行保存,存在磁盤文件也好,又或是數(shù)據(jù)庫(kù)也罷,總之需要持久化,同時(shí)配置中心也得提供配置查詢的功能。

配置變化的通知也是一個(gè)很重要的功能,一旦配置中心的配置有變動(dòng)的話,那么使用到這個(gè)配置的客戶端就需要知道這個(gè)配置有變動(dòng),從而可以做到相應(yīng)的變動(dòng)的操作。

手?jǐn)]一個(gè)簡(jiǎn)易的配置中心

上文分析了一個(gè)配置中心的核心功能,接下來(lái)就實(shí)現(xiàn)這兩個(gè)核心的功能。

一、文件工程整體分析

36442250-58e8-11ee-939d-92fbcf53809c.png

文件工程整體分為客戶端與服務(wù)端

服務(wù)端:?jiǎn)为?dú)部署的一個(gè)web應(yīng)用,端口是8888,提供了對(duì)于配置增刪改查的http接口

客戶端(SDK):業(yè)務(wù)系統(tǒng)需要引用對(duì)應(yīng)的依賴,封裝了跟服務(wù)端交互的代碼

二、服務(wù)端實(shí)現(xiàn)詳解

1、配置文件的數(shù)據(jù)存儲(chǔ)模型ConfigFile

在配置中心存儲(chǔ)配置的時(shí)候,需要指明以下信息

publicclassConfigFile{

privateStringfileId;

privateStringname;

privateStringextension;

privateStringcontent;

privateLonglastUpdateTimestamp;

}

fileId: 文件的唯一id,由配置中心服務(wù)端在新增配置文件存儲(chǔ)的時(shí)候自動(dòng)生成,全局唯一

name: 就是文件的名字,沒(méi)有什么要求,見(jiàn)名知意就行

extension: 文件后綴名,指的是該配置是什么類型的文件,比如是properties、yml等

content: 就是配置文件的內(nèi)容,不同的后綴名有不同的格式要求

lastUpdateTimestamp: 上一次文件更新的時(shí)間戳。當(dāng)文件存儲(chǔ)或者更新的時(shí)候,需要更新時(shí)間戳,這個(gè)字段是用來(lái)判斷文件是否有改動(dòng)

2、文件存儲(chǔ)層ConfigFileStorage

對(duì)于文件存儲(chǔ)層,我提供了一個(gè)ConfigFileStorage接口,

publicinterfaceConfigFileStorage{

voidsave(ConfigFileconfigFile);

voidupdate(ConfigFileconfigFile);

voiddelete(StringfileId);

ConfigFileselectByFileId(StringfileId);

ListselectAll();

}

這個(gè)接口提供了對(duì)于配置存儲(chǔ)的crud操作,目前我已經(jīng)實(shí)現(xiàn)了基于內(nèi)存和磁盤文件的存儲(chǔ)的代碼

3663bdb8-58e8-11ee-939d-92fbcf53809c.png

可以在項(xiàng)目啟動(dòng)的時(shí)候,在配置文件指定是基于磁盤文件存儲(chǔ)還是基于內(nèi)存存儲(chǔ),默認(rèn)是基于磁盤文件存儲(chǔ)。

368c86b2-58e8-11ee-939d-92fbcf53809c.png

當(dāng)然,如果想把配置信息存儲(chǔ)到數(shù)據(jù)庫(kù),只要新增一個(gè)存儲(chǔ)到數(shù)據(jù)的實(shí)現(xiàn)就行。

3、ConfigController

ConfigController提供了對(duì)于配置文件的crud的http接口

36a69d7c-58e8-11ee-939d-92fbcf53809c.png

ConfigController是通過(guò)調(diào)用ConfigManager來(lái)完成配置文件的crud

4、ConfigManager

36d485d4-58e8-11ee-939d-92fbcf53809c.png

其實(shí)就是一個(gè)service層,就是簡(jiǎn)單的參數(shù)封裝,最終是調(diào)用ConfigFileStorage存儲(chǔ)層的實(shí)現(xiàn)來(lái)完成配置的存儲(chǔ)功能。

這樣配置中心的配的存取的功能就實(shí)現(xiàn)了。

所以,服務(wù)端還是比較簡(jiǎn)單的。其實(shí)就是跟平時(shí)寫(xiě)的業(yè)務(wù)系統(tǒng)的crud沒(méi)什么區(qū)別,就是將數(shù)據(jù)庫(kù)存儲(chǔ)替換成了磁盤文件的存儲(chǔ)。

至于前面說(shuō)的配置文件變更通知的功能,我是基于客戶端來(lái)實(shí)現(xiàn)的。

三、客戶端的實(shí)現(xiàn)

客戶端工程代碼如下

36e64dfa-58e8-11ee-939d-92fbcf53809c.png

1、ConfigFileChangedListener

36fc99fc-58e8-11ee-939d-92fbcf53809c.pngConfigFileChangedListener

配置變動(dòng)的監(jiān)聽(tīng)器,當(dāng)客戶端對(duì)某個(gè)配置監(jiān)聽(tīng)的時(shí)候,如果這個(gè)配置的內(nèi)容有變化的話,客戶端就會(huì)回調(diào)這個(gè)監(jiān)聽(tīng)器,傳入最新的配置

2、ConfigService

3726ed6a-58e8-11ee-939d-92fbcf53809c.png

封裝了客戶端的核心功能,可以添加對(duì)某個(gè)文件的監(jiān)聽(tīng)器和獲取某個(gè)文件的配置內(nèi)容。

使用示例:

//創(chuàng)建一個(gè)ConfigService,傳入配置中心服務(wù)端的地址
ConfigServiceconfigService=newConfigService("localhost:8888");

//從服務(wù)端獲取配置文件的內(nèi)容,文件的id是新增配置文件時(shí)候自動(dòng)生成
ConfigFileconfig=configService.getConfig("69af6110-31e4-4cb4-8c03-8687cf012b77");

//對(duì)某個(gè)配置文件進(jìn)行監(jiān)聽(tīng)
configService.addListener("69af6110-31e4-4cb4-8c03-8687cf012b77",newConfigFileChangedListener(){
@Override
publicvoidonFileChanged(ConfigFileconfigFile){
System.out.printf("fileId=%s配置文件有變動(dòng),最新內(nèi)容為:%s%n",configFile.getFileId(),configFile.getContent());
}
});

這里說(shuō)一下配置變更通知的實(shí)現(xiàn)原理。

首先對(duì)于客戶端來(lái)說(shuō),要想知道哪個(gè)配置文件進(jìn)行了改動(dòng),有兩種方式

第一種是通過(guò)push的方式來(lái)實(shí)現(xiàn)。當(dāng)配置文件發(fā)生變動(dòng)的時(shí)候,服務(wù)端主動(dòng)將變動(dòng)的配置文件push給客戶端。這種方式實(shí)現(xiàn)起來(lái)比較麻煩,一方面是服務(wù)端還得存儲(chǔ)客戶端的服務(wù)的信息,因?yàn)榉?wù)端得知道push到哪臺(tái)服務(wù)器上;另一方面,客戶端需要提供一個(gè)接口來(lái)接收服務(wù)端push的請(qǐng)求,所以這種方式整體實(shí)現(xiàn)起來(lái)比較麻煩。但是這種push方式時(shí)實(shí)性比較好,一旦配置文件有變動(dòng),第一時(shí)間客戶端就能夠知道配置有變動(dòng)。

第二種方式就是基于pull模式來(lái)實(shí)現(xiàn)。客戶端定時(shí)主動(dòng)去服務(wù)端拉取配置文件,判斷文件內(nèi)容是否有變動(dòng),一旦有變動(dòng)就進(jìn)行監(jiān)聽(tīng)器的回調(diào)。這種實(shí)現(xiàn)相比push來(lái)說(shuō)簡(jiǎn)單不少,因?yàn)榉?wù)端不需要關(guān)心客戶端的信息,所有的操作都由客戶端來(lái)完成。但是這個(gè)定時(shí)的時(shí)間間隔不好控制,太長(zhǎng)可能會(huì)導(dǎo)致時(shí)實(shí)性差,太短會(huì)導(dǎo)致可能無(wú)效請(qǐng)求過(guò)多,因?yàn)榕渲脡焊赡軟](méi)有變化。

但是這里我選擇了第二種方式,因?yàn)閷?shí)現(xiàn)起來(lái)簡(jiǎn)單。。

374440ea-58e8-11ee-939d-92fbcf53809c.png變動(dòng)通知代碼實(shí)現(xiàn)

到這,一個(gè)簡(jiǎn)單的配置中心的服務(wù)端的和客戶端就完成了,這里畫(huà)張圖來(lái)總結(jié)一下配置中心的核心原理。

376649d8-58e8-11ee-939d-92fbcf53809c.png

接下來(lái)就把這個(gè)簡(jiǎn)易的配置中心整合到SpringCloud中。

SpringCloud配置中心的原理

1、項(xiàng)目啟動(dòng)是如何從配置中心加載數(shù)據(jù)的?

在SpringCloud環(huán)境下,當(dāng)項(xiàng)目啟動(dòng)的時(shí)候,在SpringBoot應(yīng)用容器創(chuàng)建之前,會(huì)先創(chuàng)建一個(gè)容器,這個(gè)容器非常重要,這個(gè)容器是用來(lái)跟配置中心交互,拉取配置的。

這個(gè)容器在啟動(dòng)的時(shí)候會(huì)干兩件事:

加載bootstrap配置文件,這就是為什么配置中心的配置信息需要寫(xiě)在bootstrap配置文件的重要原因

加載所有spring.factories文件中的鍵為org.springframework.cloud.bootstrap.BootstrapConfiguration對(duì)應(yīng)的配置類,將這些配置類注入到這個(gè)容器中,注意這里是不會(huì)加載@EnbaleAutoConfiguration自動(dòng)裝配的類

當(dāng)這兩件事都做好之后,會(huì)從這個(gè)容器中獲取到所有的PropertySourceLocator這個(gè)接口的實(shí)現(xiàn)類對(duì)象,依次調(diào)用locate方法。

37847930-58e8-11ee-939d-92fbcf53809c.pngPropertySourceLocator

這個(gè)類很重要,先來(lái)看看注釋

Strategy for locating (possibly remote) property sources for the Environment. Implementations should not fail unless they intend to prevent the application from starting.

扔到有道翻譯如下:

為環(huán)境定位(可能是遠(yuǎn)程)屬性源的策略。實(shí)現(xiàn)不應(yīng)該失敗,除非它們打算阻止應(yīng)用程序啟動(dòng)。

說(shuō)的簡(jiǎn)單點(diǎn)就是用來(lái)定位到(也就是獲取的意思)項(xiàng)目啟動(dòng)所需要的屬性信息。同時(shí)要注意到括號(hào)內(nèi)的 可能是遠(yuǎn)程 告訴我們一個(gè)很重要的信息,那就是獲取的配置信息不僅僅可以存在本地,而且還可以存在遠(yuǎn)程。

遠(yuǎn)程?作者這里就差直接告訴你可以從配置中心獲取了。。

所以從這個(gè)注釋就可以發(fā)現(xiàn),原來(lái)PropertySourceLocator就是起到在SpringCloud環(huán)境下從配置中心獲取配置的作用。

PropertySourceLocator是一個(gè)接口,所以只要不同的配置中心實(shí)現(xiàn)這個(gè)接口,那么不同的配置中心就可以整合到了SpringCloud,從而實(shí)現(xiàn)從配置中心加載配置屬性到Spring環(huán)境中了。

2、如何實(shí)現(xiàn)注入到Bean中的屬性動(dòng)態(tài)刷新?

上面講了在項(xiàng)目啟動(dòng)的時(shí)候SpringCloud是如何從配置中心加載數(shù)據(jù)的,主要是通過(guò)新建一個(gè)容器,加載bootstrap配置文件和一些配置類,最后會(huì)調(diào)用PropertySourceLocator來(lái)從配置中心獲取到配置信息。

那么在SpringCloud環(huán)境下,是如何實(shí)現(xiàn)注入到Bean中的屬性動(dòng)態(tài)刷新的呢?

舉個(gè)例子

37ac721e-58e8-11ee-939d-92fbcf53809c.pngUserService

當(dāng)在類上加一個(gè)@RefreshScope注解之后,那么當(dāng)配置中心sanyou.username的屬性有變化的時(shí)候,那么此時(shí)注入的username也會(huì)跟著變化。

這種變化是如何實(shí)現(xiàn)的呢?

SpringCloud中規(guī)定,當(dāng)配置中心客戶端一旦感知到服務(wù)端的某個(gè)配置有變化的時(shí)候,需要發(fā)布一個(gè)RefreshEvent事件來(lái)告訴SpringCloud配置有變動(dòng)。

37ca3c2c-58e8-11ee-939d-92fbcf53809c.png

在SpringCloud中RefreshEventListener類會(huì)去監(jiān)聽(tīng)這個(gè)事件,一旦監(jiān)聽(tīng)到這個(gè)事件,就會(huì)進(jìn)行兩步操作來(lái)刷新注入到對(duì)象的屬性。

37e33b32-58e8-11ee-939d-92fbcf53809c.pngRefreshEventListener

從配置中心再次拉取屬性值,而這個(gè)拉取的代碼邏輯跟項(xiàng)目啟動(dòng)時(shí)拉取的屬性值核心邏輯幾乎是一樣的,也是創(chuàng)建一個(gè)新的spring容器,加載配置文件和配置類,最后通過(guò)PropertySourceLocator獲取屬性,這一部分核心的代碼邏輯是復(fù)用的。

有了最新的屬性之后,就開(kāi)始刷新對(duì)象的屬性。

刷新的邏輯實(shí)現(xiàn)的非常的巧妙,可不是你以為的簡(jiǎn)單地將新的屬性重新注入對(duì)象中,而是通過(guò)動(dòng)態(tài)代理的方式來(lái)實(shí)現(xiàn)的。

對(duì)于在類上加了@RefreshScope注解的Bean,Spring在生成這個(gè)Bean的時(shí)候,會(huì)進(jìn)行動(dòng)態(tài)代理。

這里我們就上面舉個(gè)UserService例子來(lái)分析,在生成UserService有兩步操作

生成一個(gè)UserService對(duì)象,將從配置中心拉到的配置sanyou.username注入給UserService對(duì)象

由于加了@RefreshScope,會(huì)給上一步驟生成的UserService對(duì)象進(jìn)行代理,生成一個(gè)代理對(duì)象

最后真正暴露出去供我們使用的其實(shí)是就是這個(gè)代理對(duì)象,如圖所示

37fbe376-58e8-11ee-939d-92fbcf53809c.png

由于暴露出去的是一個(gè)代理對(duì)象,所以當(dāng)調(diào)用getUsername方法的時(shí)候,其實(shí)是調(diào)用UserService的代理對(duì)象的getUsername方法,從而就會(huì)找到UserService,調(diào)用UserService的getUsername獲取到username的屬性值。

當(dāng)配置中心的配置有變動(dòng)刷新屬性的時(shí)候,Spring會(huì)把UserService這個(gè)對(duì)象(非代理對(duì)象)給銷毀,重新創(chuàng)建一個(gè)UserService對(duì)象,注入最新的屬性值。

當(dāng)再次通過(guò)UserService代理對(duì)象獲取username屬性的時(shí)候,就會(huì)找最新創(chuàng)建的那個(gè)UserService對(duì)象,此時(shí)就能獲取到最新的屬性值。

38147922-58e8-11ee-939d-92fbcf53809c.png

配置每刷新一次,UserService對(duì)象就會(huì)先銷毀再重新創(chuàng)建,但是暴露出去的UserService代理對(duì)象一直不會(huì)變。

這樣,對(duì)于使用者來(lái)說(shuō),好像是UserService對(duì)象的屬性自動(dòng)刷新了,其實(shí)本質(zhì)上是UserService代理對(duì)象最終找的UserService對(duì)象發(fā)生了變化。

到這應(yīng)該就知道為什么加了@RefreshScope的對(duì)象能夠?qū)崿F(xiàn)配置的自動(dòng)刷新了,其實(shí)依靠的是動(dòng)態(tài)代理完成的。

3、源碼執(zhí)行流程圖

由于上面并沒(méi)有涉及整體執(zhí)行流程的源碼分析,所以我特地結(jié)合源碼畫(huà)了兩張?jiān)创a的執(zhí)行流程圖,有興趣的小伙伴可以對(duì)照著圖翻一翻具體的源碼。

3.1啟動(dòng)時(shí)加載配置流程

38366726-58e8-11ee-939d-92fbcf53809c.png

最終從配置中心獲取到的屬性會(huì)放在項(xiàng)目啟動(dòng)時(shí)創(chuàng)建的 Environment 對(duì)象里面。

3.2配置刷新源碼流程

3856f6e4-58e8-11ee-939d-92fbcf53809c.png

這個(gè)圖新增了對(duì)于加了@ConfigurationProperties數(shù)據(jù)綁定的對(duì)象原理的分析。

整合SpringCloud和測(cè)試

一、整合SpringCloud

1、ConfigCenterProperties

38774d54-58e8-11ee-939d-92fbcf53809c.png

配置中心的配置信息,這里需要配置配置中心服務(wù)端的地址和使用的配置文件的id。當(dāng)然這部分信息需要寫(xiě)在bootstrap配置文件中,前面也說(shuō)過(guò)具體的原因。

2、ConfigCenterPropertySourceLocator

上面分析知道,項(xiàng)目啟動(dòng)和刷新的時(shí)候,SpringCloud是通過(guò)PropertySourceLocator的實(shí)現(xiàn)從配置中心加載配置信息,所以這里就得實(shí)現(xiàn)一下

388f67ae-58e8-11ee-939d-92fbcf53809c.png

核心的邏輯就是根據(jù)所配置的文件的id,從配置中心拉取配置信息,然后解析配置。

3、ConfigContextRefresher

這個(gè)是用來(lái)注冊(cè)文件變動(dòng)的監(jiān)聽(tīng)器,來(lái)刷新文件的信息的。

因?yàn)樯厦嫣岬剑?dāng)配置發(fā)生變化的時(shí)候,需要發(fā)布一個(gè)RefreshEvent事件來(lái)觸發(fā)刷新配置的功能。

38aa54ba-58e8-11ee-939d-92fbcf53809c.png

核心的邏輯就是當(dāng)項(xiàng)目啟動(dòng)的時(shí)候,對(duì)所使用的配置文件進(jìn)行注冊(cè)一個(gè)監(jiān)聽(tīng)器,監(jiān)聽(tīng)器的實(shí)現(xiàn)就是當(dāng)發(fā)生配置改動(dòng)的時(shí)候,就發(fā)布一個(gè)RefreshEvent事件。

4、兩個(gè)配置類

4.1 ConfigCenterBootstrapConfiguration

38d0eb7a-58e8-11ee-939d-92fbcf53809c.png

配置了ConfigCenterPropertySourceLocator、ConfigCenterProperties、ConfigService

4.2 ConfigCenterAutoConfiguration

38fdb52e-58e8-11ee-939d-92fbcf53809c.png

配置了ConfigContextRefresher、ConfigCenterProperties、ConfigService

最后需要將兩個(gè)配置類在spring.factories配置一下。

這里有個(gè)需要注意,前面說(shuō)過(guò),SpringCloud會(huì)創(chuàng)建新的容器來(lái)加載配置,而這個(gè)容器只會(huì)加載spring.factories文件中鍵為@BootstrapConfiguration注解的配置類,所以需要將ConfigCenterBootstrapConfiguration跟BootstrapConfiguration配對(duì),因?yàn)镃onfigCenterBootstrapConfiguration配置了ConfigCenterPropertySourceLocator。

3920f066-58e8-11ee-939d-92fbcf53809c.png

好了,到這里真的就完成了對(duì)SpringCloud整合了。

二、測(cè)試

1、新增一個(gè)配置文件

啟動(dòng)配置中心的server端,然后打開(kāi)ApiPost,新增一個(gè)配置文件

393e046c-58e8-11ee-939d-92fbcf53809c.png

新增文件類型為properties一個(gè)配置,內(nèi)容為sanyou.username=sanyou鍵值對(duì),當(dāng)然可以寫(xiě)很多鍵值對(duì),我這里就寫(xiě)了一個(gè),新增成功之后,返回了文件的id:79765c73-c1ef-4ea2-ba77-5d27a64c4685

2、測(cè)試客戶端

這里我為了方便,就把測(cè)試代碼跟客戶端寫(xiě)在同一個(gè)服務(wù)了,正常情況肯定是把跟SpringCloud代碼打成一個(gè)依賴引到項(xiàng)目中。

在bootstrap.yml文件中配置配置中心的相關(guān)信息

39635e38-58e8-11ee-939d-92fbcf53809c.png

配置中心服務(wù)端的地址是:localhost:8888

使用的配置文件的id是剛才創(chuàng)建的:79765c73-c1ef-4ea2-ba77-5d27a64c4685

測(cè)試Controller

39853db4-58e8-11ee-939d-92fbcf53809c.png

提供一個(gè)接口,注入上面提到的UserService

啟動(dòng)項(xiàng)目,調(diào)用接口

3998e9b8-58e8-11ee-939d-92fbcf53809c.png

從斷這里可以看出,實(shí)際注入的是一個(gè)UserService代理對(duì)象,并且最終找的是com.sanyou.configcenter.test.UserService@3a1e4fd3這個(gè)UserService對(duì)象

此時(shí)這次調(diào)用的返回值就是:sanyou

39af0888-58e8-11ee-939d-92fbcf53809c.png

接下來(lái)測(cè)試一下自動(dòng)刷新屬性的功能

現(xiàn)在修改一下配置中心的sanyou.username為sanyou666

39ce42f2-58e8-11ee-939d-92fbcf53809c.png

靜靜等待5秒鐘。。

此時(shí)控制臺(tái)打印出 Refresh keys changed: [sanyou.username] ,也就是sanyou.username屬性變了

39f8afce-58e8-11ee-939d-92fbcf53809c.png

此時(shí)再次獲取username

3a1517fe-58e8-11ee-939d-92fbcf53809c.png

可以看出,UserService代理對(duì)象沒(méi)變,但是UserService對(duì)象已經(jīng)變成了com.sanyou.configcenter.test.UserService@4237b3cd

此時(shí)獲取到的username就已經(jīng)變成了sanyou666

3a30cdb4-58e8-11ee-939d-92fbcf53809c.png

所以,到這里就成功將我們自己寫(xiě)的那個(gè)簡(jiǎn)易版的配置中心整合到了SpringCloud中了。

不足和改進(jìn)

雖然我們這里的配置中心有了配置中心基本的功能,但是其實(shí)還有很多的不足和可以改進(jìn)的地方。

1、配置變更推送問(wèn)題

問(wèn)題前面也說(shuō)過(guò),在判斷配置是否變更的時(shí)候,這里是每隔5s從服務(wù)端獲取一次,這里就會(huì)可能5s之后才能感知到配置有變化,達(dá)不到真正時(shí)實(shí)的效果,并且由于這里是由客戶端根據(jù)來(lái)判斷,會(huì)導(dǎo)致無(wú)效的請(qǐng)求過(guò)多,因?yàn)榭赡芘渲脡焊鶝](méi)有變化,但是還是每隔5s獲取一次配置信息,白白浪費(fèi)資源

解決這個(gè)問(wèn)題可以換成上面提到的push方式來(lái)做,或者將輪詢方式改成長(zhǎng)輪詢的方式實(shí)現(xiàn)也是可以的。

2、高可用問(wèn)題

這里服務(wù)端的實(shí)例只有一個(gè),不支持集群的方式,就會(huì)有單點(diǎn)故障的問(wèn)題,不支持高可用。在實(shí)際項(xiàng)目中,肯定要支持集群的方式,保證即使有服務(wù)實(shí)例掛了,整個(gè)集群仍然可以繼續(xù)對(duì)外提供服務(wù),比如nacos就支持集群的方式,并且可以自由選擇是使用AP模式還是CP模式。

3、通信協(xié)議和序列化協(xié)議

對(duì)于通信協(xié)議,這里為了方便,我選擇了客戶端和服務(wù)端的通信方式是基于http協(xié)議的,當(dāng)然也可以自定義協(xié)議,或者使用其它的協(xié)議,比如gRPC協(xié)議。其實(shí)在nacos2.x的版本中,nacos開(kāi)始全面擁抱gRPC協(xié)議了。

至于序列化協(xié)議,這里選擇了json協(xié)議,因?yàn)楹芎?jiǎn)單、常見(jiàn)、使用范圍廣、跨語(yǔ)言,當(dāng)然也可以選擇其它的,比如hessian序列化協(xié)議等等。

4、多租戶隔離

一個(gè)合格的配置中心需要能支持不同應(yīng)用的隔離,還有同一個(gè)應(yīng)用不同環(huán)境的隔離,這里就圖省事,直接就是有一個(gè)文件id來(lái)表示,雖然也可以做到隔離(不同系統(tǒng)用不同的文件id),但是這種方式比較low。像nacos會(huì)自動(dòng)根據(jù)配置的名稱和后綴名之類的,生成文件id(dataId),同時(shí)還有分組的概念,其實(shí)就是為了做到隔離的效果。

5、鑒權(quán)

鑒權(quán)是一個(gè)系統(tǒng)比較常見(jiàn)的東西,這里就不做過(guò)多贅述

6、控制頁(yè)面

上面所有對(duì)于配置的crud都是基于ApiPost來(lái)的,但是實(shí)際怎么也得通過(guò)一個(gè)頁(yè)面來(lái)操作吧,至于這里我為啥不自己寫(xiě)個(gè)頁(yè)面,給你個(gè)眼神自己體會(huì)~~

最后,本文代碼地址:

https://github.com/sanyou3/sanyou-config-center


審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1254

    瀏覽量

    69204
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3737

    瀏覽量

    64173
  • 客戶端
    +關(guān)注

    關(guān)注

    1

    文章

    287

    瀏覽量

    16625
  • springcloud
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    1521

原文標(biāo)題:擼了一個(gè)簡(jiǎn)易的配置中心,順帶還給整合到了SpringCloud

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    5G電視或成下代5G無(wú)線通信服務(wù)核心功能

    電視以及視訊內(nèi)容可能會(huì)成為下一代5G無(wú)線通信服務(wù)的核心功能。..
    發(fā)表于 02-17 08:14 ?1373次閱讀

    阿里云數(shù)據(jù)庫(kù)POLARDB核心功能物理復(fù)制技術(shù)解讀

    深入解讀阿里云數(shù)據(jù)庫(kù)POLARDB核心功能物理復(fù)制技術(shù)
    發(fā)表于 06-02 10:16

    智能數(shù)字鐘的核心功能定位

    目錄前言… 2第一章 需求定義… 10產(chǎn)品功能定義… 10智能數(shù)字鐘的核心功能定位… 14芯片選型… 15基于成本約束的設(shè)計(jì)思路… 15CPU的選型… 15音樂(lè)芯片的選型… 16天氣預(yù)報(bào)語(yǔ)音播報(bào)芯片
    發(fā)表于 07-30 07:19

    F103的功能分類核心功能是什么

    文章目錄F103的功能分類核心功能:缺一不可,缺少任何一個(gè)都不能工作。重要功能:根據(jù)每一款單片機(jī)的不同,具有不同的偏重點(diǎn)。多為幫助內(nèi)核做一些內(nèi)核不能做的事情。通信功能:?jiǎn)纹瑱C(jī)行業(yè)成熟,
    發(fā)表于 12-10 07:33

    PX780游戲本控制中心驅(qū)動(dòng)安裝和功能使用

    我們收到新機(jī)器的時(shí)候,想要設(shè)置鍵盤顏色、或者要設(shè)置風(fēng)扇速度不知從何下手,要怎么安裝驅(qū)動(dòng)、控制中心功能怎么使用?。?!那么接下來(lái)由我華仔為大家講解機(jī)械師PX780游戲本控制中心驅(qū)動(dòng)安裝和功能使用。本篇
    發(fā)表于 01-10 07:05

    Bifrost GPU可編程核心的頂級(jí)布局、優(yōu)勢(shì)和著色器核心功能

    本指南介紹了典型的馬里Bifrost GPU可編程核心(第三代馬里GPU)的頂級(jí)布局、優(yōu)勢(shì)和著色器核心功能。Bifrost家族包括Mali-G30、Mali-G50和Mali-G70系列產(chǎn)品。 在
    發(fā)表于 08-02 17:52

    電機(jī)驅(qū)動(dòng)系統(tǒng)在實(shí)現(xiàn)節(jié)能方面具有核心功能

    節(jié)能方面具有核心功能。這些關(guān)鍵的能源基礎(chǔ)設(shè)施和工業(yè)驅(qū)動(dòng)系統(tǒng)都需要更高能效、更可靠的智能電源方案以實(shí)現(xiàn)節(jié)能,同時(shí)要降低成本以實(shí)現(xiàn)經(jīng)濟(jì)效益最大化。
    的頭像 發(fā)表于 01-27 12:25 ?1554次閱讀

    核心功能具體的執(zhí)行過(guò)程-2

    這篇我們主要講解一下 axios 中的 配置、攔截器和執(zhí)行鏈等一些核心功能到底是怎么運(yùn)行的。
    的頭像 發(fā)表于 03-01 09:59 ?519次閱讀
    <b class='flag-5'>核心功能</b>具體的執(zhí)行過(guò)程-2

    機(jī)器視覺(jué)的四大核心功能

    機(jī)器視覺(jué)的四大核心功能? 機(jī)器視覺(jué)是一種通過(guò)電子系統(tǒng)和計(jì)算機(jī)軟件實(shí)現(xiàn)人類視覺(jué)功能的技術(shù)。它運(yùn)用計(jì)算機(jī)視覺(jué)、模式識(shí)別、圖像處理和機(jī)器學(xué)習(xí)等技術(shù),以攝像機(jī)和圖像處理技術(shù)為基礎(chǔ),將圖像轉(zhuǎn)化為數(shù)字信號(hào),并
    的頭像 發(fā)表于 12-25 11:15 ?884次閱讀

    智慧灌區(qū)平臺(tái)功能全面解析(智慧灌區(qū)場(chǎng)景和核心功能

    ? ? 智慧灌區(qū)是當(dāng)今精準(zhǔn)農(nóng)業(yè)的重要組成部分,其核心就是建設(shè)一個(gè)涵蓋了灌區(qū)運(yùn)營(yíng)管理全流程、實(shí)現(xiàn)多源信息融合、涵蓋多維度水資源全要素的智慧灌區(qū)平臺(tái)。那么智慧灌區(qū)平臺(tái)的功能和設(shè)備構(gòu)成包括哪些呢?本文為您
    的頭像 發(fā)表于 02-22 10:27 ?554次閱讀
    智慧灌區(qū)平臺(tái)<b class='flag-5'>功能</b>全面解析(智慧灌區(qū)場(chǎng)景和<b class='flag-5'>核心功能</b>)

    [天拓四方]工業(yè)邊緣網(wǎng)關(guān)的核心功能、應(yīng)用場(chǎng)景和實(shí)施策略

    重要支持。本文將重點(diǎn)介紹工業(yè)邊緣網(wǎng)關(guān)的核心功能、應(yīng)用場(chǎng)景和實(shí)施策略,以展示其在工業(yè)自動(dòng)化領(lǐng)域的專業(yè)性和實(shí)用性。 一、工業(yè)邊緣網(wǎng)關(guān)的核心功能 工業(yè)邊緣網(wǎng)關(guān)的核心功能包括: 數(shù)據(jù)采集與集成:邊緣網(wǎng)關(guān)能夠?qū)崟r(shí)采集來(lái)自各種工業(yè)設(shè)
    的頭像 發(fā)表于 05-23 16:29 ?298次閱讀

    深度解析:藍(lán)牙網(wǎng)關(guān)核心功能以及應(yīng)用場(chǎng)景

    為可通過(guò)互聯(lián)網(wǎng)傳輸?shù)臄?shù)據(jù)格式,從而使得遠(yuǎn)程監(jiān)控、數(shù)據(jù)分析和設(shè)備控制成為可能。 二、藍(lán)牙網(wǎng)關(guān)的核心功能 藍(lán)牙網(wǎng)關(guān)的核心功能主要圍繞以下幾個(gè)方面展開(kāi): 掃描與連接 :自動(dòng)搜索并連接周圍的藍(lán)牙設(shè)備,無(wú)論是藍(lán)牙低功耗(BLE)設(shè)備還
    的頭像 發(fā)表于 07-10 10:16 ?603次閱讀
    深度解析:藍(lán)牙網(wǎng)關(guān)<b class='flag-5'>核心功能</b>以及應(yīng)用場(chǎng)景

    萬(wàn)界星空科技低代碼云mes核心功能詳解!建議收藏!

    云MES系統(tǒng)作為數(shù)字化轉(zhuǎn)型的關(guān)鍵組成部分,具有一系列核心功能和優(yōu)勢(shì),可以極大地改善制造流程管理和生產(chǎn)執(zhí)行效率。
    的頭像 發(fā)表于 08-06 09:34 ?173次閱讀
    萬(wàn)界星空科技低代碼云mes<b class='flag-5'>核心功能</b>詳解!建議收藏!

    光伏電站智能運(yùn)維管理系統(tǒng)三大核心功能

    光伏電站智能運(yùn)維管理系統(tǒng)三大核心功能 以往,光伏電站的運(yùn)維工作需要人工巡檢和維護(hù),不僅費(fèi)時(shí)費(fèi)力,而且效率低下。而隨著智能技術(shù)的發(fā)展,陜西公眾智能監(jiān)測(cè)自主研發(fā)了光伏電站智能運(yùn)維管理系統(tǒng),為光伏電站運(yùn)維
    的頭像 發(fā)表于 08-23 15:55 ?281次閱讀
    光伏電站智能運(yùn)維管理系統(tǒng)三大<b class='flag-5'>核心功能</b>

    PCS儲(chǔ)能變流器工作原理與核心功能

    PCS儲(chǔ)能變流器是一種雙向電流可控轉(zhuǎn)換裝置,它能夠連接儲(chǔ)能電池系統(tǒng)與電網(wǎng)或負(fù)荷。這種裝置的核心功能是控制儲(chǔ)能電池的充電和放電過(guò)程,實(shí)現(xiàn)交直流電能的變換。在無(wú)電網(wǎng)情況下,PCS儲(chǔ)能變流器甚至可以直接為
    的頭像 發(fā)表于 09-17 17:03 ?405次閱讀