精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

搞懂Spring Cloud Config配置信息自動更新原理

開發 前端
Spring Cloud Bus 是 Spring Cloud 中用于實現消息總線的專用組件,它集成了 RabbitMQ、Kafka 等主流消息中間件。

我們知道 Spring Cloud Config 是 Spring Cloud 提供的配置中心實現工具,我們可以通過它把配置信息存放在 Git 等第三方配置倉庫中。每當 Spring Cloud Config 客戶端啟動時,就會發送 HTTP 請求到服務器端獲取配置信息,這點比較好理解。但事實上,在 Git 中更改了配置信息之后,客戶端并不會主動再次請求最新配置,而是使用緩存到本地的原有配置信息。如圖 1。

圖 1 配置信息自動更新問題圖 1 配置信息自動更新問題

那么問題就來了,在這種情況下, Spring Cloud Config 是如何實時獲取到更改后的配置呢?這就是今天我們要討論的內容。通過理解 Spring Cloud Config 配置信息自動更新的執行過程,有助于我們深入把握框架的底層原理。

在對底層原理進行詳細展開之前,我們先來給出 Spring Cloud Config 應對這一問題的具體做法。事實上,Spring Cloud Config 能夠做到配置信息的自動更新,是依賴于 Spring Cloud 中的另一個組件,即 Spring Cloud Bus。

Spring Cloud Bus 是 Spring Cloud 中用于實現消息總線的專用組件,它集成了 RabbitMQ、Kafka 等主流消息中間件。當我們在 Spring Cloud Config 服務器端代碼工程的類路徑中添加 Spring Cloud Bus 的引用并啟動應用程序之后,Spring Boot Actuator 就為我們提供了/actuator/bus-refresh 端點, 通過訪問該端點就可以達到對客戶端所有服務實例的配置信息進行自動更新的效果。在這種方案中,服務端會主動通知所有客戶端進行配置信息的更新,這樣我們就無需關注各個客戶端,而只對服務端進行操作即可。

是不是聽起來有點神奇?整個實現過程我們至少要搞清楚三大問題,如圖 2 所示。

圖 2 實現配置信息自動更新的三個問題圖 2 實現配置信息自動更新的三個問題

針對這三個問題,接下來我們將結合源碼逐一展開討論。

問題一:如何自動調用服務器端所暴露的/actuator/bus-refresh 端點?

在現代軟件開發過程中,開放式平臺是一種常見的軟件服務形態。我們可以把 Spring Cloud Config Server 所提供的 HTTP 端點視為一種開放式的接口,以供 Git 等第三方工具進行訪問和集成。

基于這種思想,我們可以把服務器端/actuator/bus-refresh 端點對外進行暴露,然后第三方工具通過這個暴露的端點進行集成。例如,在 Github 中就設計了一種 Webhook 機制,并提供了用戶界面供我們配置所需要集成的端點以及對應的操作,操作方法如圖 3 所示。

圖 3 Github 的 Webhook 配置界面(來自 Github 官網)圖 3 Github 的 Webhook 配置界面(來自 Github 官網)

我們可以在上圖的 Payload URL 中設置/actuator/bus-refresh 端點地址。所謂的 Webhook,實際上就是一種回調。通過 Webhook,當我們提交代碼時,Github 就會自動調用所配置的 HTTP 端點。也就是說,我們可以根據配置項信息的更新情況自動實現對/actuator/bus-refresh 端點的訪問。基于 Github 的配置倉庫實現方案,我們可以得到如下圖所示的系統結構圖。

圖 4 Github Webhook 機制執行效果圖圖 4 Github Webhook 機制執行效果圖

現在,配置信息一旦有更新,Spring Cloud Config Server 就能從 Github 中獲取最新的配置信息了。

問題二:客戶端如何得知服務器端的配置信息已經更新?

接下來我們關注第二個問題,即客戶端如何得知服務器端的配置信息已經更新?

我們首先需要明確,調用了/actuator/bus-refresh 端點之后,系統內部會發生了什么。這里我們快速瀏覽 Spring Cloud Bus 中的代碼工程,發現存在一個 RefreshBusEndpoint 端點類,如下所示:

@Endpoint(id = "bus-refresh")
public class RefreshBusEndpoint extends AbstractBusEndpoint {
    @WriteOperation
    public void busRefreshWithDestination(@Selector String destination) {
        //發布 RefreshRemoteApplicationEvent 事件
        publish(new RefreshRemoteApplicationEvent(this, getInstanceId(), destination));
    }
    @WriteOperation
    public void busRefresh() {
        //發布 RefreshRemoteApplicationEvent 事件
        publish(new RefreshRemoteApplicationEvent(this, getInstanceId(), null));
    }
}

顯然,RefreshBusEndpoint 類對應于我們前面訪問的/bus-refresh 端點??梢钥吹剑琒pring Cloud Bus 在這里做的事情僅僅只是發布了一個新的 RefreshRemoteApplicationEvent 事件。

既然發送了事件,我們就需要尋找該事件的監聽者。我們在 Spring Cloud Bus 中找到了 RefreshRemoteApplicationEvent 事件的監聽器 RefreshListener,如下所示:

public class RefreshListener implements ApplicationListener<RefreshRemoteApplicationEvent> {
    …
    @Override
    public void onApplicationEvent(RefreshRemoteApplicationEvent event) {
        //執行配置屬性的刷新操作
        Set<String> keys = contextRefresher.refresh();
    }
}

從類的定義中不難看出該監聽器就是用來處理 RefreshRemoteApplicationEvent 事件??梢钥吹?,在它的 onApplicationEvent 方法中同樣也是調用了 ContextRefresher 中的 refresh 方法進行配置屬性的刷新。

請注意,RefreshRemoteApplicationEvent 是一個遠程事件,將通過消息中間件進行發送,并被 Spring Cloud Config 客戶端所監聽,處理流程如下圖所示:

圖 5 基于 Spring Cloud Bus 的事件傳播機制圖 5 基于 Spring Cloud Bus 的事件傳播機制

問題三:客戶端如何實時獲取服務器端所更新的配置信息?

最后需要明確的第三個問題是,客戶端如何獲取服務器端所更新的配置信息,這就需要梳理 Spring Cloud Config Server 與注冊中心之間的關系。

我們知道配置中心作為整個微服務架構運行所需的基礎服務,需要確保其可用性。因為配置服務本身也是一個獨立的微服務,所以 Spring Cloud Config 實現高可用的方式很簡單。跟其他微服務一樣,它把自己注冊到注冊中心上,讓其他服務提供者或消費者通過注冊中心進行服務發現和獲取。

圖 6 Spring Cloud Config 與注冊中心之間的關系圖 6 Spring Cloud Config 與注冊中心之間的關系

顯然,在這種方式下,注冊中心的服務治理機制同時提供了服務器端的負載均衡和客戶端的配置功能,從而也就間接實現了高可用性。從另一個角度,我們也可以理解為,可以通過注冊中心獲取所有 Spring Cloud Config 客戶端服務的實例,從而在分布式環境下為獲取配置信息提供了一種簡便的手段。

Spring Cloud Config 提供了一個工具類 ConfigServerInstanceProvider 來完成與注冊中心之間的交互,代碼如下所示:

public class ConfigServerInstanceProvider {
   private final DiscoveryClient client;
   @Retryable(interceptor = "configServerRetryInterceptor")
   public List<ServiceInstance> getConfigServerInstances(String serviceId) {
       List<ServiceInstance> instances = this.client.getInstances(serviceId);
       if (instances.isEmpty()) {
           //拋出異常
       }
       return instances;
    }
}

在這里,我們看到了熟悉的 DiscoveryClient,DiscoveryClient 通過同樣熟悉的 getInstances 方法從注冊中心中獲取 Spring Cloud Config 服務器實例,如下所示:

List<ServiceInstance> instances = this.client.getInstances(serviceId);

ConfigServerInstanceProvider 的調用者是 DiscoveryClientConfigServiceBootstrapConfiguration。現在我們來看這個 Spring Boot 自動配置類的定義,如下所示:

public class DiscoveryClientConfigServiceBootstrapConfiguration
        implements SmartApplicationListener {
    public void startup(ContextRefreshedEvent event) {
        refresh();
    }
}

可以看到,如果系統中生成了 ContextRefreshedEvent 事件就會觸發如下所示的 refresh 方法。

private void refresh() {
    try {
        ////獲取 Spring Cloud Config 客戶端服務實例
        String serviceId = this.config.getDiscovery().getServiceId();
        List<String> listOfUrls = new ArrayList<>();
        List<ServiceInstance> serviceInstances = this.instanceProvider.getConfigServerInstances(serviceId);
        //遍歷服務實例列表
        for (int i = 0; i < serviceInstances.size(); i++) {
            ServiceInstance server = serviceInstances.get(i);
            String url = getHomePage(server);
             //獲取配置路徑
            if (server.getMetadata().containsKey("configPath")) {
                String path = server.getMetadata().get("configPath");
                if (url.endsWith("/") && path.startsWith("/")) {
                    url = url.substring(0, url.length() - 1);
                }
                url = url + path;
            }
             //填充配置路徑
            listOfUrls.add(url);
        }
        String[] uri = new String[listOfUrls.size()];
        uri = listOfUrls.toArray(uri);
        this.config.setUri(uri);
    }
}

在上述 refresh 方法中,Spring Cloud Config 首先會獲取配置文件中配置項 spring.cloud.config.discovery.serviceId 所指定的服務實例 id,然后根據 serviceId 從 ConfigServerInstanceProvider 中獲取注冊服務的實例對象集合 serviceInstances,最后循環遍歷 serviceInstances 來更新存儲在內存中的配置屬性值。

至此,我們通過解答三個問題,引出了 Spring Cloud Config 中實現配置信息自動更新的三個步驟,并基于框架內部一系列組件之間的交互過程剖析了底層實現原理。

總結

今天基于 Spring Cloud Config 框架剖析了實現配置信息自動更新的工作原理。拋出了三個與這個主題相關的核心問題,然后基于源碼對這些問題做了一一解答。

事實上,Spring Cloud Config 作為 Spring 自研的配置中心框架,其內部大量使用了 Spring 現有的功能特性,比方說這節課中提到的 Spring 容器的事件發布和監聽機制,又比方說 Spring Boot Acuator 中的端點機制以及 Spring Cloud Bus 所具備的消息通信總線機制。這點與我們學習 Netflix 旗下的 Eureka、Zuul 等框架不同。我們需要首先對 Spring 容器相關的知識體系有足夠的了解,才能更好地理解 Spring Cloud Config 的設計和實現方式。

責任編輯:武曉燕 來源: 程序員技術充電站
相關推薦

2017-10-31 14:58:11

Spring Clou配置信息問題

2023-11-22 17:00:10

ElectronWeb

2015-03-30 14:15:55

自動更新Android

2015-09-15 15:25:36

更新配置Windows 10

2010-05-24 11:27:20

SVN配置自動更新WE

2021-11-08 22:24:04

Windows 10Windows微軟

2017-10-20 12:13:11

數據庫PostgreSQL時間戳

2016-07-12 10:09:13

OpenManage大

2010-01-08 13:20:52

ibmdwWeb

2025-02-10 00:14:00

2018-07-27 15:43:24

Spring Clou管理架構

2023-09-12 13:12:23

服務器系統

2012-04-16 14:55:29

MacChrome

2010-12-13 13:33:47

Windows 7驅動

2025-02-27 00:10:19

2018-06-22 15:46:45

Spring Clou加密處理

2018-07-10 14:55:32

Git存儲配置

2021-04-20 10:15:34

Spring ClouZuul架構

2017-01-12 21:02:29

Windows 10系統更新

2011-08-02 18:30:32

iOS 應用程序 屬性
點贊
收藏

51CTO技術棧公眾號

国产ktv在线视频| 九九热国产在线| 欧美日韩亚洲国产| 中文在线资源观看网站视频免费不卡 | 精品91自产拍在线观看一区| 亚洲国产精品无码av| 五月婷婷丁香花| 久久天天综合| 中文字幕在线日韩| 91性高潮久久久久久久| 人妖欧美1区| xfplay精品久久| 国产精品普通话| 丁香花五月激情| 日本中文字幕在线一区| 欧美性大战xxxxx久久久| 在线观看欧美亚洲| 蜜臀久久99精品久久久| 免费亚洲一区| 久久久精品2019中文字幕神马| 日韩精品视频网址| 成人美女大片| 亚洲欧美电影一区二区| 久久亚洲国产精品日日av夜夜| 午夜视频网站在线观看| 国产精品xvideos88| 亚洲欧美另类自拍| 天天操夜夜操很很操| 伊人久久国产| 曰韩精品一区二区| 麻豆久久久9性大片| 成年人视频免费| 黑丝一区二区三区| www.日本久久久久com.| 能看毛片的网站| 欧美韩国亚洲| 黄网动漫久久久| 在线一区亚洲| yjizz视频网站在线播放| 国产成人免费网站| 国产综合色香蕉精品| 久久精品国产成人av| 在线国产一区| 中文字幕日韩av综合精品| 久久久久久婷婷| 精品国产一区二区三区性色av| 欧美性xxxxxxx| 成人一级生活片| 国产小视频免费在线观看| 国产xxx精品视频大全| 国产精品免费小视频| 欧产日产国产69| 91久久视频| 欧美福利视频在线观看| 99热99这里只有精品| 国产一区二区三区电影在线观看 | 国内老熟妇对白xxxxhd| 免费黄网站欧美| 热99在线视频| 日韩精品乱码久久久久久| 中文字幕乱码亚洲无线精品一区| 国产一区二区三区日韩欧美| 国产肉体xxxx裸体784大胆| 在线综合色站| 日韩精品在线网站| 三上悠亚在线一区二区| 日韩中文在线播放| 欧美在线综合视频| 日韩av手机版| 99久久婷婷国产综合精品首页 | 精品日韩在线播放| 好操啊在线观看免费视频| 欧美激情一区不卡| 亚洲欧美精品| 日本在线观看网站| 亚洲婷婷在线视频| 亚洲v国产v| 亚洲s色大片| 国产精品第一页第二页第三页| 亚洲日本japanese丝袜| 素人av在线| 中文字幕一区在线| 日韩一区二区三区高清| 在线激情小视频| 中文字幕欧美日本乱码一线二线| 日韩理论片在线观看| 日本中文字幕在线看| 中文字幕不卡一区| 中文字幕制服丝袜在线| av在线免费网址| 亚洲国产aⅴ成人精品无吗| 给我免费播放片在线观看| 欧美13videosex性极品| 色综合久久久久综合体| 亚洲视频在线观看一区二区三区| 成人在线黄色| 91精品国产全国免费观看| 中文字幕 欧美 日韩| 久久久免费毛片| 亚洲品质视频自拍网| 日韩在线视频免费看| 国内精品久久久久国产盗摄免费观看完整版 | 欧美gayvideo| 欧美精品久久久久久久| 毛片基地在线观看| 麻豆国产精品视频| 91久久精品一区二区别| 午夜国产在线视频| 国产精品久久久爽爽爽麻豆色哟哟| 女女百合国产免费网站| 两个人看的在线视频www| 在线观看欧美精品| 永久看看免费大片| 国产综合久久久| 九九热精品视频国产| 日本熟女毛茸茸| 精品一区二区在线看| 国产精品一区二区免费| av在线免费观看网站| 亚洲综合激情网| 国产精品视频黄色| 国产精品1luya在线播放| 日韩精品一区二区视频| 国精品人伦一区二区三区蜜桃| 中文欧美日韩| 91免费欧美精品| 人妻精品一区二区三区| 中文字幕综合网| 男人天堂999| 一区二区三区四区高清视频| 在线观看国产欧美| 亚洲国产精一区二区三区性色| 久久99久久久久| 欧美日韩一区在线观看视频| 制服丝袜在线播放| 欧美日韩成人在线| 三上悠亚ssⅰn939无码播放| 国产精品v一区二区三区| 成人欧美一区二区三区在线| 精品亚洲成a人片在线观看| 亚洲国产cao| 天堂av.com| 色爱综合网欧美| 国产精品99导航| 丝袜视频国产在线播放| 亚洲国产cao| 日本免费色视频| 国产剧情在线观看一区| 国自产精品手机在线观看视频| 国产精品久久久久久久一区二区 | 极品尤物一区| 欧美精品在线看| 国产又粗又大又爽| 欧美国产国产综合| www.日日操| 国产精品美女在线观看直播| 欧美成人一区二区三区电影| 国产永久免费视频| 国产精品久久一卡二卡| 久久久久久久久久久免费视频| 豆花视频一区二区| 欧美精品aaa| 国精产品乱码一区一区三区四区| 亚洲免费高清视频在线| 欧美精品 - 色网| 欧美gvvideo网站| 人人澡人人澡人人看欧美| 亚洲av成人无码久久精品老人| 亚洲va国产天堂va久久en| 国产人成视频在线观看| 国精品一区二区| 精品欧美一区二区三区久久久| www视频在线观看| 亚洲国产毛片完整版| 9999热视频| 国产成人av影院| 成人免费观看cn| 最新精品国偷自产在线| 国产精品免费久久久久久| 99视频在线观看地址| 欧美精品久久99| 亚洲综合网在线| 懂色av中文字幕一区二区三区| 日本人体一区二区| 日韩欧美美女在线观看| 国产精国产精品| 欧美91精品久久久久国产性生爱| 91九色最新地址| 天天色天天综合| 成人听书哪个软件好| 国产精品网站免费| 欧美精品尤物在线观看| 国产欧美中文字幕| 日韩伦理av| 精品精品国产高清a毛片牛牛 | 国产黄a三级三级看三级| 亚洲aⅴ怡春院| 黄色录像a级片| 亚洲制服丝袜在线播放| 极品少妇一区二区三区| 麻豆成人在线播放| 亚洲成a人片| 成人永久看片免费视频天堂| 色一情一乱一乱一区91| 97品白浆高清久久久久久| 欧美一区二区三区……| 在线视频91p| 精品第一国产综合精品aⅴ| 亚洲欧美一区二区三区在线观看| 国产精品欧美一级免费| 岛国av免费观看| 老**午夜毛片一区二区三区| 日韩中文字幕一区| 大奶在线精品| 国产精品久久激情| 国产成人高清精品| 精品视频在线播放色网色视频| 羞羞色院91蜜桃| 亚洲国产一区视频| 欧美aaa级片| 成人av免费观看| 久热精品在线播放| 国产精品普通话对白| 欧美 日韩 国产 在线观看| 欧美日韩麻豆| 97神马电影| 六九午夜精品视频| 韩国福利视频一区| 午夜激情在线观看| 亚洲免费一级电影| 男人天堂av网| 欧美一级二级在线观看| 欧美日韩中文字幕综合视频| 久久精品日韩| 四虎国产精品免费久久5151| 久久伊人精品天天| 激情小视频在线观看| 精品日韩在线观看| 亚洲观看高清完整版在线观看| 亚洲天堂网一区| 精品淫伦v久久水蜜桃| 国产精品一区二区久久国产| 日本免费一区二区三区四区| 97婷婷大伊香蕉精品视频| 丝袜国产在线| 麻豆国产va免费精品高清在线| 欧美天天影院| 久久精品99久久香蕉国产色戒| 思思99re6国产在线播放| 日韩小视频网址| www免费在线观看| 欧美二区乱c黑人| 波多野结衣中文在线| 午夜精品久久久久久久男人的天堂| 成人免费图片免费观看| 91精品国产91久久久久| 小h片在线观看| 国产成人精彩在线视频九色| avav成人| 51国偷自产一区二区三区 | 午夜久久电影网| 男人的天堂一区二区| 一本一道综合狠狠老| 成人午夜精品视频| 欧美一区二区成人6969| 亚洲国产精品suv| 亚洲精品不卡在线| 黑人与亚洲人色ⅹvideos| 视频在线观看99| yellow91字幕网在线| 97在线观看视频| 精品免费av一区二区三区| 成人精品在线观看| 国产美女撒尿一区二区| 欧美日韩大片一区二区三区| 日韩一区电影| 久操手机在线视频| 日日夜夜免费精品| 亚洲天堂一区二区在线观看| 91在线观看视频| 91香蕉视频污在线观看| 亚洲午夜激情网页| 免费看污视频的网站| 欧美一区中文字幕| 四虎影视2018在线播放alocalhost| 最近的2019中文字幕免费一页| 午夜av在线播放| 国产精品成人免费视频| 视频一区日韩精品| 日本一区二区三区视频在线播放| 亚洲大全视频| 国产精品亚洲αv天堂无码| 九九九久久久精品| 大地资源二中文在线影视观看 | 精品丝袜一区二区三区| 免费在线你懂的| 91精品国产99久久久久久| 欧美大陆国产| 欧美lavv| 国内精品福利| 久久久精品高清| 99精品在线免费| 男女羞羞免费视频| 在线精品亚洲一区二区不卡| 好男人www在线视频| www.美女亚洲精品| 精品网站在线| 精品一区在线播放| 国一区二区在线观看| 亚洲美女性囗交| 国产日韩欧美不卡在线| 日本在线视频免费观看| 日韩一级欧美一级| 9191在线观看| 国产精品高清免费在线观看| 国产精品视频3p| 国产激情在线看| 麻豆免费看一区二区三区| 成年人在线观看av| 午夜国产不卡在线观看视频| 国产精品久久久久久免费免熟| 亚洲人成在线观看| 亚洲优女在线| 精品久久精品久久| 国产精品99一区二区| 三区视频在线观看| 亚洲国产精品ⅴa在线观看| 波多野结衣 久久| 亚洲精品日韩久久久| √天堂8资源中文在线| 成人一区二区在线| 欧美午夜电影在线观看 | 中国a一片一级一片| 亚洲男女自偷自拍图片另类| 日本在线高清| 欧美成人一区二区在线| 国产亚洲综合精品| 噜噜噜在线视频| 欧美小视频在线| 欧美亚洲日本| 国产成人啪精品视频免费网| 夜夜春成人影院| 日韩一级片播放| 国产欧美精品国产国产专区| 日批视频免费观看| 色婷婷**av毛片一区| 欧美午夜三级| 国产高清免费在线| 精品欧美一区二区精品久久| 亚洲综合色站| 九九热视频免费| 亚洲精品你懂的| 国产v在线观看| 久久久在线观看| 日韩精品a在线观看91| 国产免费黄视频| 国产视频一区二区在线观看| 最好看的日本字幕mv视频大全| 中文字幕av一区二区| 91精品国产一区二区在线观看| 裸体大乳女做爰69| 国产成人av福利| 精品免费囯产一区二区三区| 国产手机视频精品| jizz久久久久久| 最新欧美日韩亚洲| 成人性生交大片免费看视频在线| 可以免费看的av毛片| 国产视频一区三区| 国产在线一区二区三区| 99久久综合| 亚洲精品激情视频| 日韩欧美中文字幕在线观看| 成人在线二区| 91传媒在线免费观看| 亚洲神马久久| eeuss中文字幕| 精品日韩欧美一区二区| 欧美gay视频| 9l视频自拍9l视频自拍| 99精品国产视频| 在线视频1卡二卡三卡| 欧美黄色免费网站| 精品国产乱码久久久久久蜜坠欲下 | 91久久国产自产拍夜夜嗨| 中文亚洲字幕| 亚洲 欧美 国产 另类| 亚洲精品国产综合区久久久久久久| 精品欧美一区二区三区在线观看| 老司机av福利| 久久色在线视频| 99精品在线看| 日本精品久久久久影院| 亚洲精品成人影院| 久久精品无码一区| 欧美变态tickle挠乳网站| 亚洲www免费| 欧美一级视频在线播放| 国产精品毛片大码女人| 天堂在线资源库|