精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

中文字幕欧美精品在线| 色婷婷激情一区二区三区| 俄罗斯精品一区二区| 一级免费在线观看| 色777狠狠狠综合伊人| 日韩欧美国产不卡| 中文字幕永久视频| 日韩av激情| 国产日韩欧美综合在线| av观看久久| 中文 欧美 日韩| 亚洲激情自拍| 久久成人人人人精品欧| 少妇饥渴放荡91麻豆| 国产精品成人**免费视频| 欧美日韩亚洲一区二区| 男插女免费视频| 巨骚激情综合| 成人激情午夜影院| 国产日韩精品在线播放| 无码人妻av免费一区二区三区| 欧美色图麻豆| 久久成人精品视频| 成人黄色短视频| 国产麻豆一区二区三区精品视频| 精品国产乱子伦一区| 中国黄色片一级| 欧美片第一页| 欧美少妇一区二区| 99精品国产一区二区| 成年人av网站| 伊人久久亚洲美女图片| 日韩在线观看免费| 手机看片福利视频| 小嫩嫩12欧美| 亚洲精品久久久久中文字幕二区| 中文字幕在线视频一区二区| 国产成人免费精品| 在线观看成人小视频| 六月丁香激情网| 91丝袜在线| 一区二区三区丝袜| 男女爱爱视频网站| 国产黄色在线网站| 136国产福利精品导航| 亚洲国产婷婷香蕉久久久久久99| 你懂的视频在线观看| 久久亚洲一区二区三区明星换脸| 国产一区二区三区无遮挡| 亚洲老妇色熟女老太| 国产成人亚洲综合a∨猫咪| 亚洲一区二区免费| 国产高清在线观看视频| 国产精品一区二区视频| 亚洲综合色激情五月| 国产黄色小视频在线观看| 国产伦精一区二区三区| 97se亚洲综合| 老熟妇高潮一区二区高清视频| 懂色av一区二区在线播放| 3d动漫啪啪精品一区二区免费| 99这里有精品视频| 国产 欧美在线| 国产欧美一区二区三区不卡高清| 日本高清视频网站| 久久久久久9999| 午夜视频久久久| 日本在线免费看| 亚洲欧美偷拍另类a∨色屁股| 好吊色这里只有精品| 性欧美高清come| 精品国产精品自拍| 白嫩少妇丰满一区二区| 97精品国产99久久久久久免费| 欧美日韩一级大片网址| 亚洲精品国产久| 久久av国产紧身裤| 亚洲天堂网在线观看| 91香蕉视频污在线观看| 欧美二区不卡| 日韩av免费看网站| 97人妻一区二区精品免费视频 | 欧美两根一起进3p做受视频| 我爱我色成人网| 欧美一区二区高清| 中文字字幕码一二三区| 久久综合电影| 亚洲91av视频| 国产尤物在线观看| 99久久久无码国产精品| 亚洲欧美日韩精品在线| 狂野欧美性猛交xxxxx视频| 色欲综合视频天天天| 亚洲精品第三页| 理论片一区二区在线| 一区二区国产精品视频| 国产在线视频99| 日韩一区精品字幕| 亚洲综合中文字幕在线| 韩国中文免费在线视频| 亚洲综合在线观看视频| 国产又黄又猛视频| 好吊妞国产欧美日韩免费观看网站| 亚洲色图50p| 国产在线综合网| 毛片av一区二区| 久久婷婷开心| 亚洲欧美成人影院| 欧美中文字幕不卡| 久久人人爽人人爽人人片| 亚洲一区二区三区| 国产精品v片在线观看不卡| 成人毛片在线精品国产| 国产精品成人在线观看| 国产一区亚洲二区三区| 成人自拍在线| xxxxx成人.com| 91黑人精品一区二区三区| 不卡的av电影在线观看| 路边理发店露脸熟妇泻火| 亚洲成人一区在线观看| 精品视频www| 天海翼一区二区| 高清在线成人网| 亚洲国产精品影视| 欧洲亚洲精品| 最近2019中文字幕在线高清| 欧美成人一区二区三区四区| 9l国产精品久久久久麻豆| 波多野结衣 作品| 成人av在线播放| xvideos亚洲| 97国产精品久久久| 亚洲国产精华液网站w | 美脚恋feet久草欧美| 精品国内二区三区| 麻豆changesxxx国产| 韩国欧美一区二区| 偷拍盗摄高潮叫床对白清晰| 欧美黄页免费| 爱福利视频一区| 一卡二卡三卡在线观看| 国产精品水嫩水嫩| 中文字幕第88页| 日韩欧美高清在线播放| 国产精品v日韩精品| 韩国福利在线| 欧美日韩欧美一区二区| 亚洲一二三四视频| 免费成人av在线播放| 亚洲午夜精品久久久中文影院av| 国产另类xxxxhd高清| 在线观看欧美成人| 国产精品色综合| 亚洲精品国产一区二区精华液 | 91av在线精品| 嫩草研究院在线| 欧美亚一区二区| 潘金莲一级黄色片| 国产二区国产一区在线观看| 欧美一区二区视频在线播放| 国产精品videossex| 欧美亚洲国产视频小说| 国产区在线视频| 欧美电影一区二区| 日本妇女毛茸茸| caoporn国产一区二区| 那种视频在线观看| 国产精品久久久久久麻豆一区软件| 国产在线a不卡| 欧美性猛片xxxxx免费中国| 日韩av网站在线| 中文字幕日韩三级| 一区二区三区在线免费观看 | 中文字幕一区二区在线观看| 永久av免费在线观看| 亚洲色诱最新| 一区二区三区久久网| 91亚洲精品视频在线观看| 欧美亚洲第一区| 伦xxxx在线| 亚洲国产欧美一区二区三区同亚洲| 日韩在线视频不卡| 亚洲精品高清在线| 亚洲最大成人网站| 国产综合久久久久久久久久久久| 欧美这里只有精品| 日韩成人三级| 国产亚洲一区二区三区在线播放 | 国产在线观看h| 国产精品综合av一区二区国产馆| www.日本在线播放| 久久理论电影| 蜜桃成人在线| 日韩黄色av| 国产精品久久久久久网站| 美女精品导航| 日韩一中文字幕| 深夜视频在线免费| 欧美电影免费观看完整版| 国产三级精品三级在线观看| 亚洲激情男女视频| 国产毛片欧美毛片久久久| 风间由美一区二区三区在线观看| 中文字幕国产传媒| 国产精品婷婷| 日本免费a视频| 91综合在线| 日本福利一区二区三区| 中文字幕一区二区三区四区久久| 国产精品欧美一区二区| 三级在线看中文字幕完整版| 两个人的视频www国产精品| 国产片在线观看| 亚洲精品一区二区久| 狠狠综合久久av一区二区| 欧美精品v国产精品v日韩精品| 欧产日产国产69| 亚洲国产精品视频| 免费中文字幕视频| 亚洲视频在线观看一区| 极品久久久久久久| 久久久青草青青国产亚洲免观| 国产精品熟妇一区二区三区四区 | 成人黄色在线电影| 日韩中文在线不卡| 北条麻妃在线| 亚洲人在线视频| 外国精品视频在线观看 | 中文字幕久久一区| 精品一区二区三| 欧美日韩在线不卡一区| 色天下一区二区三区| 久久青青草原| 日韩母乳在线| 欧美精品久久| 国产一区二区三区四区二区 | 丰满少妇一区二区三区| 99久久99久久精品国产片果冻| 久久久久国产免费| 成人午夜碰碰视频| 91精品小视频| 97久久精品人人澡人人爽| 成人免费毛片日本片视频| 99re在线视频这里只有精品| 你懂得在线视频| 91美女福利视频| 谁有免费的黄色网址| 中文字幕成人网| www.xx日本| 亚洲精品视频免费看| 青青草成人免费| 亚洲成人av中文| 欧美另类一区二区| 一本一道久久a久久精品综合蜜臀| 国产成人精品777777| 在线观看成人小视频| 国产精品一区二区三区在线免费观看| 91麻豆精品国产91久久久更新时间| 国产欧美一级片| 精品国产亚洲在线| 日韩av资源| 少妇av一区二区三区| 黄色免费在线观看| 性欧美亚洲xxxx乳在线观看| 极品美女一区| 成人情趣片在线观看免费| 动漫av一区| 欧洲av一区| 五月激情综合| 蜜臀av色欲a片无码精品一区| 日韩视频一区| 国产野外作爱视频播放| 国产精品一区一区| 性久久久久久久久久| 国产精品美女www爽爽爽| 久草中文在线视频| 色爱区综合激月婷婷| 99久久精品日本一区二区免费| 欧美成人欧美edvon| 蜜芽tv福利在线视频| 久久亚洲欧美日韩精品专区| 免费一二一二在线视频| 成人精品一区二区三区电影黑人| 超碰精品在线观看| 相泽南亚洲一区二区在线播放 | www.黄色片| 亚洲欧洲午夜一线一品| av免费看在线| 国产精品白嫩美女在线观看| 欧美一级片网址| 欧美污视频久久久| 国产专区一区| 久热在线视频观看| 91理论电影在线观看| 男女性高潮免费网站| 色妹子一区二区| 黄色美女一级片| 久久精品中文字幕免费mv| 黄色在线免费观看网站| 92看片淫黄大片欧美看国产片| 丝袜美腿综合| 国产精品无码免费专区午夜| 日本伊人色综合网| 国产又粗又猛又色| 伊人色综合久久天天人手人婷| 手机看片久久久| 精品少妇一区二区三区日产乱码 | 色偷偷综合网| 美女福利视频在线| 成人a区在线观看| 丝袜美腿小色网| 欧美日韩高清一区二区不卡| 天堂v视频永久在线播放| 欧美日韩成人黄色| 999久久久国产999久久久| 青青成人在线| 亚洲免费婷婷| 国产情侣久久久久aⅴ免费| 亚洲人成伊人成综合网小说| 最近中文在线观看| 亚洲色在线视频| 无遮挡爽大片在线观看视频| 国产欧美亚洲日本| 黄色成人精品网站| wwwxxxx在线观看| 亚洲人成7777| 国产日韩在线观看一区| zzjj国产精品一区二区| 国产美女久久| 亚洲精品日韩在线观看| 老司机精品视频网站| 国产精品815.cc红桃| 亚洲一区在线观看网站| 亚洲第一成年人网站| 色综合视频一区中文字幕| 国产精品99久久免费| 麻豆视频传媒入口| 国产一区二区女| 国模无码国产精品视频| 日韩精品一区国产麻豆| 中文字幕在线观看播放| 99超碰麻豆| 国色天香一区二区| 性囗交免费视频观看| 精品国产91久久久| 青青久草在线| 国产99久久精品一区二区 夜夜躁日日躁| 日韩欧美黄色| 冲田杏梨av在线| 中文字幕一区二区三| a级片在线视频| 欧美高清视频免费观看| 国产精品15p| 99色精品视频| 国产精品天美传媒| 99久久久国产精品无码网爆| 欧美裸身视频免费观看| 果冻天美麻豆一区二区国产| 日本三级免费观看| 中文字幕乱码日本亚洲一区二区| 一二三四区在线| 欧美黑人一级爽快片淫片高清| 国产精品一区二区中文字幕 | 欧美日韩不卡| 一区二区三区欧美在线| 国产成人免费视频网站| 五月婷婷中文字幕| 在线观看久久av| 五月亚洲婷婷| 黄色片久久久久| 中文字幕一区不卡| 亚洲国产精品久久人人爱潘金莲| 91精品成人久久| 色天天综合网| 国产性猛交96| 欧美综合亚洲图片综合区| 国产激情视频在线观看| 久久国产精品久久| 久久电影网电视剧免费观看| 久久久久成人精品无码| 亚洲视频在线观看| 日韩激情综合| 99免费视频观看| 伊人色综合久久天天| 酒色婷婷桃色成人免费av网| 92国产精品久久久久首页| 国产精品亚洲综合久久| 手机在线中文字幕| 日韩精品免费在线视频| 成人51免费| 国模杨依粉嫩蝴蝶150p| 一区二区三区在线视频观看| 国产有码在线| 国产欧美日韩亚洲| 国产一区二区三区在线观看免费视频| 日韩精品一区二区三区国语自制| 中文字幕日本精品| 欧美五码在线| 天天爽夜夜爽视频|