欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Disconf實(shí)現(xiàn)分布式配置管理的原理與設(shè)計(jì)

 更新時(shí)間:2022年03月08日 14:27:01   作者:kl  
這篇文章主要為大家介紹了Disconf實(shí)現(xiàn)分布式配置管理的原理與設(shè)計(jì)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

技術(shù)背景

在一個(gè)分布式環(huán)境中,同類(lèi)型的服務(wù)往往會(huì)部署很多實(shí)例。這些實(shí)例使用了一些配置,為了更好地維護(hù)這些配置就產(chǎn)生了配置管理服務(wù)。通過(guò)這個(gè)服務(wù)可以輕松地管理成千上百個(gè)服務(wù)實(shí)例的配置問(wèn)題。

王阿晶提出了基于zooKeeper的配置信息存儲(chǔ)方案的設(shè)計(jì)與實(shí)現(xiàn)[1], 它將所有配置存儲(chǔ)在zookeeper上,這會(huì)導(dǎo)致配置的管理不那么方便,而且他們沒(méi)有相關(guān)的源碼實(shí)現(xiàn)。淘寶的diamond[2]是淘寶內(nèi)部使用的一個(gè)管理持久配置的系統(tǒng),它具有完整的開(kāi)源源碼實(shí)現(xiàn),它的特點(diǎn)是簡(jiǎn)單、可靠、易用,淘寶內(nèi)部絕大多數(shù)系統(tǒng)的配置都采用diamond來(lái)進(jìn)行統(tǒng)一管理。他將所有配置文件里的配置打散化進(jìn)行存儲(chǔ),只支持KV結(jié)構(gòu),并且配置更新的推送是非實(shí)時(shí)的。百度內(nèi)部的BJF配置中心服務(wù)[3]采用了類(lèi)似淘寶diamond的實(shí)現(xiàn),也是配置打散化、只支持KV和非實(shí)時(shí)推送。

同構(gòu)系統(tǒng)是市場(chǎng)的主流,特別地,在業(yè)界大量使用部署虛擬化(如JPAAS系統(tǒng),SAE,BAE)的情況下,同一個(gè)系統(tǒng)使用同一個(gè)部署包的情景會(huì)越來(lái)越多。但是,異構(gòu)系統(tǒng)也有一定的存在意義,譬如,對(duì)于“拉模式”的多個(gè)下游實(shí)例,同一時(shí)間點(diǎn)只能只有一個(gè)下游實(shí)例在運(yùn)行。在這種情景下,就存在多臺(tái)實(shí)例機(jī)器有“主備機(jī)”模式的問(wèn)題。目前國(guó)內(nèi)并沒(méi)有很明顯的解決方案來(lái)統(tǒng)一解決此問(wèn)題。

功能特點(diǎn)與設(shè)計(jì)理念

disconf是一套完整的基于zookeeper的分布式配置統(tǒng)一解決方案。

功能特點(diǎn)

支持配置(配置項(xiàng)+配置文件)的分布式化管理

  • 配置發(fā)布統(tǒng)一化
  • 配置發(fā)布、更新統(tǒng)一化(云端存儲(chǔ)、發(fā)布):配置存儲(chǔ)在云端系統(tǒng),用戶(hù)統(tǒng)一在平臺(tái)上進(jìn)行發(fā)布、更新配置。
  • 配置更新自動(dòng)化:用戶(hù)在平臺(tái)更新配置,使用該配置的系統(tǒng)會(huì)自動(dòng)發(fā)現(xiàn)該情況,并應(yīng)用新配置。特殊地,如果用戶(hù)為此配置定義了回調(diào)函數(shù)類(lèi),則此函數(shù)類(lèi)會(huì)被自動(dòng)調(diào)用。

配置異構(gòu)系統(tǒng)管理

  • 異構(gòu)包部署統(tǒng)一化:這里的異構(gòu)系統(tǒng)是指一個(gè)系統(tǒng)部署多個(gè)實(shí)例時(shí),由于配置不同,從而需要多個(gè)部署包(jar或war)的情況(下同)。使用Disconf后,異構(gòu)系統(tǒng)的部署只需要一個(gè)部署包,不同實(shí)例的配置會(huì)自動(dòng)分配。特別地,在業(yè)界大量使用部署虛擬化(如JPAAS系統(tǒng),SAE,BAE)的情況下,同一個(gè)系統(tǒng)使用同一個(gè)部署包的情景會(huì)越來(lái)越多,Disconf可以很自然地與他天然契合。 異構(gòu)主備自動(dòng)切換:如果一個(gè)異構(gòu)系統(tǒng)存在主備機(jī),主機(jī)發(fā)生掛機(jī)時(shí),備機(jī)可以自動(dòng)獲取主機(jī)配置從而變成主機(jī)。
  • 異構(gòu)主備機(jī)Context共享工具:異構(gòu)系統(tǒng)下,主備機(jī)切換時(shí)可能需要共享Context??梢允褂肅ontext共享工具來(lái)共享主備的Context。

注解式編程,極簡(jiǎn)的使用方式:我們追求的是極簡(jiǎn)的、用戶(hù)編程體驗(yàn)良好的編程方式。通過(guò)簡(jiǎn)單的標(biāo)注+極簡(jiǎn)單的代碼撰寫(xiě),即可完成復(fù)雜的配置分布式化。

需要Spring編程環(huán)境

設(shè)計(jì)理念

簡(jiǎn)單,用戶(hù)體驗(yàn)良好:

  • 摒棄了打散化配置的管理方式[2,3],仍舊采用基于配置文件的編程方式,這和程序員以前的編程習(xí)慣(配置都是放在配置文件里)一致。特別的,為了支持較為小眾的打散化配置功能,還特別支持了配置項(xiàng)。
  • 采用了基于XML無(wú)代碼侵入編程方式:只需要幾行XML配置,即可實(shí)現(xiàn)配置文件發(fā)布更新統(tǒng)一化、自動(dòng)化。
  • 采用了基于注解式的弱代碼侵入編程方式:通過(guò)編程規(guī)范,一個(gè)配置文件一個(gè)配置類(lèi),代碼結(jié)構(gòu)簡(jiǎn)單易懂。XML幾乎沒(méi)有任何更改,與原springXML配置一樣。真正編程時(shí),幾乎感覺(jué)不到配置已經(jīng)分布式化

可以托管任何類(lèi)型的配置文件,這與[2,3]只能支持KV結(jié)構(gòu)的功能有較大的改進(jìn)。

配置更新實(shí)時(shí)推送

提供界面良好Web管理功能,可以非常方便的查看配置被哪些實(shí)例使用了。

詳細(xì)設(shè)計(jì)

架構(gòu)設(shè)計(jì)

disconf服務(wù)集群模式:

disconf的模塊架構(gòu)圖:

每個(gè)模塊的簡(jiǎn)單介紹如下:

  • Disconf-core
    • 分布式通知模塊:支持配置更新的實(shí)時(shí)化通知
    • 路徑管理模塊:統(tǒng)一管理內(nèi)部配置路徑URL
  • Disconf-client
    • 配置倉(cāng)庫(kù)容器模塊:統(tǒng)一管理用戶(hù)實(shí)例中本地配置文件和配置項(xiàng)的內(nèi)存數(shù)據(jù)存儲(chǔ)
    • 配置reload模塊:監(jiān)控本地配置文件的變動(dòng),并自動(dòng)reload到指定bean
    • 掃描模塊:支持掃描所有disconf注解的類(lèi)和域
    • 下載模塊:restful風(fēng)格的下載配置文件和配置項(xiàng)
    • watch模塊:監(jiān)控遠(yuǎn)程配置文件和配置項(xiàng)的變化
    • 主備分配模塊:主備競(jìng)爭(zhēng)結(jié)束后,統(tǒng)一管理主備分配與主備監(jiān)控控制
    • 主備競(jìng)爭(zhēng)模塊:支持分布式環(huán)境下的主備競(jìng)爭(zhēng)
  • Disconf-web
    • 配置存儲(chǔ)模塊:管理所有配置的存儲(chǔ)和讀取
    • 配置管理模塊:支持配置的上傳、下載、更新
    • 通知模塊:當(dāng)配置更新后,實(shí)時(shí)通知使用這些配置的所有實(shí)例
    • 配置自檢監(jiān)控模塊:自動(dòng)定時(shí)校驗(yàn)實(shí)例本地配置與中心配置是否一致
    • 權(quán)限控制:web的簡(jiǎn)單權(quán)限控制
  • Disconf-tools
    • context共享模塊:提供多實(shí)例間context的共享。

流程設(shè)計(jì)

運(yùn)行流程詳細(xì)介紹:

與2.0版本的主要區(qū)別是支持了:主備分配功能/主備切換事件。

  • 啟動(dòng)事件A:以下按順序發(fā)生。
    • A3:掃描靜態(tài)注解類(lèi)數(shù)據(jù),并注入到配置倉(cāng)庫(kù)里。
    • A4+A2:根據(jù)倉(cāng)庫(kù)里的配置文件、配置項(xiàng),去 disconf-web 平臺(tái)里下載配置數(shù)據(jù)。這里會(huì)有主備競(jìng)爭(zhēng)
    • A5:將下載得到的配置數(shù)據(jù)值注入到倉(cāng)庫(kù)里。
    • A6:根據(jù)倉(cāng)庫(kù)里的配置文件、配置項(xiàng),去ZK上監(jiān)控結(jié)點(diǎn)。
    • A7+A2:根據(jù)XML配置定義,到 disconf-web 平臺(tái)里下載配置文件,放在倉(cāng)庫(kù)里,并監(jiān)控ZK結(jié)點(diǎn)。這里會(huì)有主備競(jìng)爭(zhēng)。
    • A8:A1-A6均是處理靜態(tài)類(lèi)數(shù)據(jù)。A7是處理動(dòng)態(tài)類(lèi)數(shù)據(jù),包括:實(shí)例化配置的回調(diào)函數(shù)類(lèi);將配置的值注入到配置實(shí)體里。
  • 更新配置事件B:以下按順序發(fā)生。
    • B1:管理員在 Disconf-web 平臺(tái)上更新配置。
    • B2:Disconf-web 平臺(tái)發(fā)送配置更新消息給ZK指定的結(jié)點(diǎn)。
    • B3:ZK通知 Disconf-cient 模塊。
    • B4:與A4一樣。
    • B5:與A5一樣。
    • B6:基本與A4一樣,唯一的區(qū)別是,這里還會(huì)將配置的新值注入到配置實(shí)體里。
  • 主備機(jī)切換事件C:以下按順序發(fā)生。
    • C1:發(fā)生主機(jī)掛機(jī)事件。
    • C2:ZK通知所有被影響到的備機(jī)。
    • C4:與A2一樣。
    • C5:與A4一樣。
    • C6:與A5一樣。
    • C7:與A6一樣。

模塊實(shí)現(xiàn)

disconf-web提供了前后端分離的web架構(gòu),具體可見(jiàn):https://github.com/knightliao/disconf/tree/master/disconf-web

本部分會(huì)重點(diǎn)介紹disconf-client的實(shí)現(xiàn)方式。

注解式disconf實(shí)現(xiàn)

本實(shí)現(xiàn)會(huì)涉及到 配置倉(cāng)庫(kù)容器模塊、掃描模塊、下載模塊、watch模塊,

使用AOP攔截的一個(gè)好處是可以比較輕松的實(shí)現(xiàn)配置控制,比如并發(fā)環(huán)境下的配置統(tǒng)一生效。

特別地,本方式提供的編程模式非常簡(jiǎn)單,例如使用以下配置類(lèi)的程序在使用它時(shí),可以直接@Autowired進(jìn)來(lái)進(jìn)行調(diào)用,使用它時(shí)就和平常使用普通的JavaBean一樣,但其實(shí)它已經(jīng)分布式化了。配置更新時(shí),配置類(lèi)亦會(huì)自動(dòng)更新。

@Service
@DisconfFile(filename = "redis.properties")
public class JedisConfig {
    // 代表連接地址
    private String host;
    // 代表連接port
    private int port;
    /**
     * 地址, 分布式文件配置
     * 
     * @return
     */
    @DisconfFileItem(name = "redis.host", associateField = "host")
    public String getHost() {
        return host;
    }
    public void setHost(String host) {
        this.host = host;
    }
    /**
     * 端口, 分布式文件配置
     * 
     * @return
     */
    @DisconfFileItem(name = "redis.port", associateField = "port")
    public int getPort() {
        return port;
    }
    public void setPort(int port) {
        this.port = port;
    }
}

基于XML配置disconf實(shí)現(xiàn)

本實(shí)現(xiàn)提供了無(wú)任何代碼侵入方式的分布式配置。

ReloadablePropertiesFactoryBean繼承了Spring Properties文件的PropertiesFactoryBean類(lèi),管理所有當(dāng)配置更新時(shí)要進(jìn)行reload的配置文件。對(duì)于被管理的每一個(gè)配置文件,都會(huì)通過(guò) 配置倉(cāng)庫(kù)容器模塊、掃描模塊、下載模塊、watch模塊 進(jìn)行配置獲取至配置倉(cāng)庫(kù)里。

ReloadingPropertyPlaceholderConfigurer繼承了Spring Bean配置值控制類(lèi)PropertyPlaceholderConfigurer。在第一次掃描spring bean 時(shí),disconf會(huì)記錄配置文件的配置與哪些bean有關(guān)聯(lián)。

ReloadConfigurationMonitor是一個(gè)定時(shí)任務(wù),定時(shí)check本地配置文件是否有更新。

當(dāng)配置中心的配置被更新時(shí),配置文件會(huì)被下載至實(shí)例本地,ReloadConfigurationMonitor即會(huì)監(jiān)控到此行為,并且通知 ReloadingPropertyPlaceholderConfigurer 對(duì)相關(guān)的bean類(lèi)進(jìn)行值更新。

特別的,此種方式無(wú)法解決并發(fā)情況下配置統(tǒng)一生效的問(wèn)題。

主備分配實(shí)現(xiàn)

在實(shí)現(xiàn)中,為每個(gè)配置提供主備選擇的概念。用戶(hù)實(shí)例在獲取配置前需要先進(jìn)行全局唯一性競(jìng)爭(zhēng)才能得到配置值。在這里,我們采用基于zookeeper的全局唯一性鎖來(lái)實(shí)現(xiàn)。

COMPARISONS

 淘寶Diamond[2]Disconf比較
數(shù)據(jù)持久性存儲(chǔ)在mysql上存儲(chǔ)在mysql上都持久化到數(shù)據(jù)庫(kù)里,都易于管理
推拉模型拉模型,每隔15s拉一次全量數(shù)據(jù)基于Zookeeper的推模型,實(shí)時(shí)推送disconf基于分布式的Zookeeper來(lái)實(shí)時(shí)推送,不斷是在穩(wěn)定性、實(shí)效性、易用性上均優(yōu)于diamond
配置讀寫(xiě)支持實(shí)例對(duì)配置讀寫(xiě)。支持某臺(tái)實(shí)例寫(xiě)配置數(shù)據(jù),并廣播到其它實(shí)例上只支持實(shí)例對(duì)配置讀。通過(guò)在disconf-web上更新配置到達(dá)到廣播寫(xiě)到所有應(yīng)用實(shí)例從目前的應(yīng)用場(chǎng)景來(lái)看,實(shí)例對(duì)配置的寫(xiě)需求不是那么明顯。disconf支持的中心化廣播方案可能會(huì)與人性思考更加相似。
容災(zāi)多級(jí)容災(zāi)模式,配置數(shù)據(jù)會(huì)dump在本地,避免中心服務(wù)掛機(jī)時(shí)無(wú)法使用多級(jí)容災(zāi)模式,優(yōu)先讀取本地配置文件。雙方均支持在中心服務(wù)掛機(jī)時(shí)配置實(shí)例仍然可以使用
配置數(shù)據(jù)模型只支持KV結(jié)構(gòu)的數(shù)據(jù),非配置文件模式支持傳統(tǒng)的配置文件模式(配置文件),亦支持KV結(jié)構(gòu)數(shù)據(jù)(配置項(xiàng))使用配置文件的編程方式可能與程序員的編程習(xí)慣更為相似,更易于接受和使用。
編程模型需要將配置文件拆成多個(gè)配置項(xiàng),沒(méi)有明顯的編程模型在使用配置文件的基礎(chǔ)上,提供了注解式和基于XML的兩種編程模型無(wú)
并發(fā)性多條配置要同時(shí)生效時(shí),無(wú)法解決并發(fā)同時(shí)生效的問(wèn)題基于注解式的配置,可以解決并發(fā)性問(wèn)題無(wú)

以上就是Disconf實(shí)現(xiàn)分布式配置管理的原理與設(shè)計(jì)的詳細(xì)內(nèi)容,更多關(guān)于Disconf分布式配置管理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java Session會(huì)話追蹤原理深入分析

    Java Session會(huì)話追蹤原理深入分析

    web開(kāi)發(fā)階段我們主要是瀏覽器和服務(wù)器之間來(lái)進(jìn)行交互。瀏覽器和服務(wù)器之間的交互就像人和人之間進(jìn)行交流一樣,但是對(duì)于機(jī)器來(lái)說(shuō),在一次請(qǐng)求之間只是會(huì)攜帶著本次請(qǐng)求的數(shù)據(jù)的,但是可能多次請(qǐng)求之間是會(huì)有聯(lián)系的,所以提供了會(huì)話機(jī)制
    2022-11-11
  • 深入理解Java中的Lambda表達(dá)式

    深入理解Java中的Lambda表達(dá)式

    這篇文章主要介紹了深入理解Java中的Lambda表達(dá)式,Lambda在各編程語(yǔ)言中都是非常重要的特性,而Java中則加入得有些太晚...需要的朋友可以參考下
    2015-07-07
  • SpringBoot中@Import注解的使用方式

    SpringBoot中@Import注解的使用方式

    這篇文章主要介紹了SpringBoot中@Import注解的使用方式,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • 解決Java中properties文件編碼問(wèn)題

    解決Java中properties文件編碼問(wèn)題

    大家好,本篇文章主要講的是解決Java中properties文件編碼問(wèn)題,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • Spring打包jar包時(shí)jsp頁(yè)面無(wú)法訪問(wèn)問(wèn)題解決

    Spring打包jar包時(shí)jsp頁(yè)面無(wú)法訪問(wèn)問(wèn)題解決

    這篇文章主要介紹了Spring打包jar包時(shí)jsp頁(yè)面無(wú)法訪問(wèn)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 詳解JavaWeb中的過(guò)濾器Filter

    詳解JavaWeb中的過(guò)濾器Filter

    今天給大家講一下JavaWeb中的過(guò)濾器Filter,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Java多線程之線程狀態(tài)詳解

    Java多線程之線程狀態(tài)詳解

    這篇文章主要介紹了Java多線程 線程狀態(tài)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • win10和win7下java開(kāi)發(fā)環(huán)境配置教程

    win10和win7下java開(kāi)發(fā)環(huán)境配置教程

    這篇文章主要為大家詳細(xì)介紹了win7下Java開(kāi)發(fā)環(huán)境配置教程,win10下Java開(kāi)發(fā)環(huán)境配置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 帶你了解Java Maven的打包操作

    帶你了解Java Maven的打包操作

    這篇文章主要介紹了Maven打包的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • java代理模式(靜態(tài)代理、動(dòng)態(tài)代理、cglib代理)

    java代理模式(靜態(tài)代理、動(dòng)態(tài)代理、cglib代理)

    代理(Proxy)是一種設(shè)計(jì)模式,提供了對(duì)目標(biāo)對(duì)象另外的訪問(wèn)方式;這篇文章主要介紹了Java 中的三種代理模式,需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-07-07

最新評(píng)論