真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

NetflixArchaius分布式配置管理依賴構(gòu)件

Archaius 配置管理API,包含一系列配置管理API,提供動態(tài)類型化屬性、線程安全配置操作、輪詢框架、回調(diào)機制等功能。

佳木斯網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)2013年至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

概述

archaius是Netflix公司開源項目之一,基于java的配置管理類庫,主要用于多配置存儲的動態(tài)獲取。主要功能是對apache common configuration類庫的擴展。在云平臺開發(fā)中可以將其用作分布式配置管理依賴構(gòu)件。同時,它有如下一些特性:

  • 動態(tài)類型化屬性

  • 高效和線程安全的配置操作

  • 配置改變時的回調(diào)機制

  • 輪詢框架

  • JMX,通過Jconsole檢查和調(diào)用操作屬性

  • 組合配置

Netflix Archaius 分布式配置管理依賴構(gòu)件

p_w_picpath.png

適用場景

對于傳統(tǒng)的單體應用,properties等配置文件可以解決配置問題,同時也可以通過maven profile配置來區(qū)別各個環(huán)境,但在一個幾百上千節(jié)點的的微服務生態(tài)中,微服務采用多種語言開發(fā),配置文件格式多樣,如何把每個微服務的配置文件都進行更新,并且很多時候還需要重啟服務,是一件無法忍受的事情。所以,對于微服務架構(gòu)而言,一個通用的配置中心是必不可少的。

新接口邏輯上線,老接口面臨遷移,開發(fā)測試完成后,馬上要上線。但是接口調(diào)用發(fā)的研發(fā)同學對新接口的穩(wěn)定性、性能存在一定的質(zhì)疑,為了避免風險,要求可以上線后緊急切換回老接口。這時候我們就需要一個手動開關(guān)。所以對于類似需求,一個通用的配置中心是必不可少的。

Archaius提供的DynamicIntProperty類可以在配置發(fā)生變化時動態(tài)地獲取配置,并且不需要重啟應用,而底層的配置存儲,建議使用zookeeper進行存儲,Archaius作為客戶端的類庫使用。

代碼案例

引入依賴


    com.netflix.archaius
    archaius-core

自定義Configuration

PropertiesConfiguration
public class PropertiesConfiguration extends DynamicConfiguration {
    private static final Logger LOGGER = LoggerFactory.getLogger(PropertiesConfiguration.class);
    private static final int INITIAL_DELAY_MILLIS = 0;
    private static final int DELAY_MILLIS = 60 * 1000;
    private static final boolean IGNORE_DELETES_FROM_SOURCE = true;

    public PropertiesConfiguration(String confDir) {
        this(new String[]{confDir});
    }

    public PropertiesConfiguration(final String...confDirs) {
        String[] propertiesPaths = Lists.newArrayList(Iterables.concat(Iterables.transform(Arrays.asList(confDirs), new Function>() {
            @Nullable
            @Override
            public List apply(String confDir) {
                Assert.isTrue(new File(confDir).isDirectory(), StringUtil.format("路徑[{}]無法查找[.properties]文件", confDirs));
                String[] propertiesPaths = getPaths(confDir);
                if (ArrayUtils.isNotEmpty(propertiesPaths)) {
                    return Lists.newArrayList(propertiesPaths);
                } else {
                    
                    return Lists.newArrayList();
                }
            }
        }))).toArray(new String[0]);
        if (ArrayUtils.isNotEmpty(propertiesPaths)) {
            super.startPolling(new URLConfigurationSource(propertiesPaths), new FixedDelayPollingScheduler(INITIAL_DELAY_MILLIS, DELAY_MILLIS, IGNORE_DELETES_FROM_SOURCE));
        }
        ConfigurationLog.successInit(PropertiesConfiguration.class, this.getProperties());
    }

    private static String[] getPaths(String confDir) {
        try {
            URL configHome = new File(confDir).toURI().toURL();
            List urls = new ArrayList();
            for (String filename : FileUtil.scan(confDir, ".properties$")) {
                String url = configHome.toString() + filename;
                urls.add(url);
            }
            return urls.toArray(new String[urls.size()]);
        } catch (MalformedURLException e) {
            throw Throwables.propagate(e);
        }
    }
}
SystemConfiguration
public class SystemConfiguration extends ConcurrentMapConfiguration {
    private static final Logger LOGGER = LoggerFactory.getLogger(SystemConfiguration.class);

    public SystemConfiguration() {
        super();
        this.loadProperties(System.getProperties());
        ConfigurationLog.successInit(SystemConfiguration.class, this.getProperties());
    }
}

同理,可以使用zookeeper client 封裝一個基于zookeeper的 ConcurrentMapConfiguration

初始化

private static final ConcurrentCompositeConfiguration compositeConfig = new ConcurrentCompositeConfiguration();

public synchronized static void init() {
    Preconditions.checkState(! hadInit, StringUtil.format("[{}]只能加載一次!", ConfigAdapter.class.getSimpleName()));
    Preconditions.checkState(compositeConfig.getConfigurations().size() > 1,
            StringUtil.format("[{}]沒有加載任何配置", ConfigAdapter.class.getSimpleName()));
    if (! ConfigurationManager.isConfigurationInstalled()) {
        ConfigurationManager.install(compositeConfig);
        Preconditions.checkState(ConfigurationManager.isConfigurationInstalled(), StringUtil.format("[{}]加載失敗!",
                ConfigAdapter.class.getSimpleName()));
    }
    Iterable configurationNames = Iterables.transform(compositeConfig.getConfigurations(), new Function() {
        @Nullable
        @Override
        public String apply(AbstractConfiguration input) {
            return input.getClass().getSimpleName();
        }
    });
    ConfigurationLog.successInit(ConfigAdapter.class, getAll());
    hadInit = true;
}

獲取值

 public static DynamicBooleanProperty getDynamicBool(String key, boolean defaultValue) {
        return getFactory().getBooleanProperty(key, defaultValue);
    }

private static DynamicPropertyFactory getFactory() {
        return DynamicPropertyFactory.getInstance();
    }

注意

  • 在設(shè)置的時刻獲取配置,配置源不會隨著System#properties里面的配置更新而更新

  • 更新配置方法不會更新實際的property文件,僅僅為更新內(nèi)存數(shù)據(jù),重啟后失效

  • 微服務都從配置中心動態(tài)的讀取配置信息,而配置中心又在從配置源同步配置,所以這里就很自然的出現(xiàn)了一個讀寫安全的問題,好消息是Archaius已經(jīng)解決了這個問題,Archaius是線程安全的,讀寫可以并發(fā)進行。


個人介紹:

高廣超:多年一線互聯(lián)網(wǎng)研發(fā)與架構(gòu)設(shè)計經(jīng)驗,擅長設(shè)計與落地高可用、高性能互聯(lián)網(wǎng)架構(gòu)。

本文首發(fā)在 高廣超的簡書博客 轉(zhuǎn)載請注明!

Netflix Archaius 分布式配置管理依賴構(gòu)件


新聞標題:NetflixArchaius分布式配置管理依賴構(gòu)件
地址分享:http://weahome.cn/article/pscdjh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部