最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

elasticsearch通過guice注入Node組裝啟動(dòng)過程

 更新時(shí)間:2022年04月21日 14:59:54   作者:zziawan  
這篇文章主要為大家介紹了?elasticsearch通過guice注入Node組裝啟動(dòng)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

elasticsearch啟動(dòng)過程

elasticsearch的啟動(dòng)過程是根據(jù)配置和環(huán)境組裝需要的模塊并啟動(dòng)的過程。這一過程就是通過guice注入各個(gè)功能模塊并啟動(dòng)這些模塊,從而得到一個(gè)功能完整的node。正如之前所說elasticsearch的模塊化特點(diǎn),它的各個(gè)功能都是獨(dú)立實(shí)現(xiàn),然后實(shí)現(xiàn)通過guice對(duì)外提供。

首先簡單的說一下guice,它是google的一個(gè)輕量級(jí)依賴注入框架。它的作者也是依賴注入標(biāo)準(zhǔn)(JSR-330)制定者。雖然它是輕量級(jí)框架,但是它的功能及性能卻非常好,這也是elasticsearch選用它作為代碼主要框架的一個(gè)主要原因。它的使用請(qǐng)參考它的用戶指導(dǎo)。

首先看一下node的初始化

node接口的唯一實(shí)現(xiàn)是InternalNode,它的初始化代碼如下所示:

public InternalNode(Settings preparedSettings, boolean loadConfigSettings) throws ElasticsearchException {
        final Settings pSettings = settingsBuilder().put(preparedSettings)
                .put(Client.CLIENT_TYPE_SETTING, CLIENT_TYPE).build();
        Tuple<Settings, Environment> tuple = InternalSettingsPreparer.prepareSettings(pSettings, loadConfigSettings);
        tuple = new Tuple<>(TribeService.processSettings(tuple.v1()), tuple.v2());
        logger.info("initializing ...");
       //啟動(dòng)插件service,加載并啟動(dòng)插件
        this.pluginsService = new PluginsService(tuple.v1(), tuple.v2());
        this.settings = pluginsService.updatedSettings();
        // create the environment based on the finalized (processed) view of the settings
        this.environment = new Environment(this.settings());
        CompressorFactory.configure(settings);
       //配置node環(huán)境
        final NodeEnvironment nodeEnvironment;
        try {
            nodeEnvironment = new NodeEnvironment(this.settings, this.environment);
        } catch (IOException ex) {
            throw new ElasticsearchIllegalStateException("Failed to created node environment", ex);
        }
        boolean success = false;
        try {
       //加載各個(gè)模塊
            ModulesBuilder modules = new ModulesBuilder();
            modules.add(new Version.Module(version));
            modules.add(new CacheRecyclerModule(settings));
            modules.add(new PageCacheRecyclerModule(settings));
            modules.add(new CircuitBreakerModule(settings));
            modules.add(new BigArraysModule(settings));
            modules.add(new PluginsModule(settings, pluginsService));
            modules.add(new SettingsModule(settings));
            modules.add(new NodeModule(this));
            modules.add(new NetworkModule());
            modules.add(new ScriptModule(settings));
            modules.add(new EnvironmentModule(environment));
……
}

可以看到node的初始化過程主要包括三部分

第一是啟動(dòng)插件服務(wù)(es提供了插件功能來進(jìn)行擴(kuò)展功能,這也是它的一個(gè)亮點(diǎn)),加載需要的插件

第二是配置node環(huán)境

最后就是通過guice加載各個(gè)模塊。

啟動(dòng)各個(gè)模塊的過程

插件服務(wù)稍微復(fù)雜最后再說。elasticsearch各個(gè)功能模塊實(shí)現(xiàn)的非常好,解耦非常完美,很多模塊都實(shí)現(xiàn)了生命周期接口,只有啟動(dòng)它才能夠?qū)ν馓峁┓?wù),它的啟動(dòng)過程也是功能模塊初始化的過程。因此,node節(jié)點(diǎn)的啟動(dòng)過程也就是這些模塊初始化的過程。如下面的代碼片段所示:

public Node start() {
        if (!lifecycle.moveToStarted()) {
            return this;
        }// hack around dependency injection problem (for now...)
        injector.getInstance(Discovery.class).setAllocationService(injector.getInstance(AllocationService.class));
        for (Class<? extends LifecycleComponent> plugin : pluginsService.services()) {
            injector.getInstance(plugin).start();
        }
    //通過guice獲取各個(gè)模塊的service接口并啟動(dòng)
        injector.getInstance(MappingUpdatedAction.class).start();
        injector.getInstance(IndicesService.class).start();
        injector.getInstance(IndexingMemoryController.class).start();
        injector.getInstance(IndicesClusterStateService.class).start();
        injector.getInstance(IndicesTTLService.class).start();
        injector.getInstance(RiversManager.class).start();
        injector.getInstance(SnapshotsService.class).start();
        injector.getInstance(TransportService.class).start();
……
}

每個(gè)模塊service都會(huì)實(shí)現(xiàn)一個(gè)start接口,模塊功能初始化過程都是這這個(gè)函數(shù)中實(shí)現(xiàn)。每個(gè)模塊的具體啟動(dòng)過程后面會(huì)有涉及,這里就不做深入分析。

插件的加載過程

每個(gè)node在加載各個(gè)模塊前,會(huì)首先加載所需要的插件,如果有些插件加載不成功node會(huì)啟動(dòng)失敗。這里會(huì)加載三類插件:首先是配置插件,配置到節(jié)點(diǎn)配置文件中插件,如分詞插件等;然后查找classpath中能找到的插件,這些插件一般防止在plugin文件夾中;最后是加載site插件,site插件是不涉及java代碼的純網(wǎng)站式插件,如監(jiān)控插件head,bigdesk等。任何使用者都可以開發(fā)自己需要的插件,只要按著elasticsearch相關(guān)版本的插件開發(fā)規(guī)范來實(shí)現(xiàn)即可。

public PluginsService(Settings settings, Environment environment) {
        super(settings);
        this.environment = environment;
        ……
        ImmutableList.Builder<Tuple<PluginInfo, Plugin>> tupleBuilder = ImmutableList.builder();
        // 加載配置插件
        String[] defaultPluginsClasses = settings.getAsArray("plugin.types");
        for (String pluginClass : defaultPluginsClasses) {
            Plugin plugin = loadPlugin(pluginClass, settings);
            PluginInfo pluginInfo = new PluginInfo(plugin.name(), plugin.description(), hasSite(plugin.name()), true, PluginInfo.VERSION_NOT_AVAILABLE);
            if (logger.isTraceEnabled()) {
                logger.trace("plugin loaded from settings [{}]", pluginInfo);
            }
            tupleBuilder.add(new Tuple<>(pluginInfo, plugin));
        }
        // 查找classpatch中的所有插件
        loadPluginsIntoClassLoader();
        if (loadClasspathPlugins) {
            tupleBuilder.addAll(loadPluginsFromClasspath(settings));
        }
        this.plugins = tupleBuilder.build();
        // We need to build a List of jvm and site plugins for checking mandatory plugins
        Map<String, Plugin> jvmPlugins = Maps.newHashMap();
        List<String> sitePlugins = Lists.newArrayList();
        for (Tuple<PluginInfo, Plugin> tuple : this.plugins) {
            jvmPlugins.put(tuple.v2().name(), tuple.v2());
            if (tuple.v1().isSite()) {
                sitePlugins.add(tuple.v1().getName());
            }
        }
        // 加載site插件
        ImmutableList<Tuple<PluginInfo, Plugin>> tuples = loadSitePlugins();
        for (Tuple<PluginInfo, Plugin> tuple : tuples) {
            sitePlugins.add(tuple.v1().getName());
        }
        // 檢驗(yàn)代理插件,如果有加載不成功的插件就拋出異常,停止node啟動(dòng)。
        String[] mandatoryPlugins = settings.getAsArray("plugin.mandatory", null);
        if (mandatoryPlugins != null) {
            Set<String> missingPlugins = Sets.newHashSet();
            for (String mandatoryPlugin : mandatoryPlugins) {
                if (!jvmPlugins.containsKey(mandatoryPlugin) && !sitePlugins.contains(mandatoryPlugin) && !missingPlugins.contains(mandatoryPlugin)) {
                    missingPlugins.add(mandatoryPlugin);
                }
            }
            if (!missingPlugins.isEmpty()) {
                throw new ElasticsearchException("Missing mandatory plugins [" + Strings.collectionToDelimitedString(missingPlugins, ", ") + "]");
            }
        }
……
}

以上就是pluginservice的初始化過程,在它的初始化過程中,加載所有能夠找的插件。插件的啟動(dòng)在其他功能模塊之前,些插件,如分詞插件,啟動(dòng)不成功則會(huì)對(duì)節(jié)點(diǎn)的功能造成影響,因此會(huì)在這里就中斷節(jié)點(diǎn)的啟動(dòng)過程讓用戶知道。這就是節(jié)點(diǎn)的啟動(dòng)過程。插件加載成功,各個(gè)功能模塊加載并啟動(dòng)成功,節(jié)點(diǎn)就啟動(dòng)成功。

限于篇幅這里模塊相關(guān)詳情都沒有進(jìn)行深入在接下來模塊分析中會(huì)一一分析,希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Java中使用redisTemplate操作緩存的方法示例

    在Java中使用redisTemplate操作緩存的方法示例

    這篇文章主要介紹了在Java中使用redisTemplate操作緩存的方法示例,在Redis中可以存儲(chǔ)String、List、Set、Hash、Zset。感興趣的可以了解一下
    2019-01-01
  • CentOS8.2安裝Java 14.0.2的教程詳解

    CentOS8.2安裝Java 14.0.2的教程詳解

    這篇文章主要介紹了CentOS8.2安裝Java 14.0.2的詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java中有什么工具可以進(jìn)行代碼反編譯詳解

    Java中有什么工具可以進(jìn)行代碼反編譯詳解

    這篇文章主要介紹了Java中有什么工具可以進(jìn)行代碼反編譯的相關(guān)資,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、BytecodeViewer、Krakatau和JAD,每種工具都有其特點(diǎn)和適用場(chǎng)景,需要的朋友可以參考下
    2025-03-03
  • spring boot@EnableXXXX注解編程模型講解

    spring boot@EnableXXXX注解編程模型講解

    這篇文章主要介紹了spring boot@EnableXXXX注解編程模型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring Boot如何通過CORS處理跨域問題

    Spring Boot如何通過CORS處理跨域問題

    這篇文章主要介紹了Spring Boot如何通過CORS處理跨域問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java利用跳躍表解決雙重隊(duì)列問題詳解

    Java利用跳躍表解決雙重隊(duì)列問題詳解

    這篇文章主要為大家詳細(xì)介紹了Java如何利用跳躍表來解決雙重隊(duì)列的問題。本文通過一個(gè)簡單的例題進(jìn)行了講解,感興趣的小伙伴可以了解一下
    2022-12-12
  • 淺談java實(shí)現(xiàn)重載的方法

    淺談java實(shí)現(xiàn)重載的方法

    方法重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段。多個(gè)同名函數(shù)同時(shí)存在,具有不同的參數(shù)個(gè)數(shù)/類型。重載Overloading是一個(gè)類中多態(tài)性的一種表現(xiàn)。Java的方法重載,就是在類中可以創(chuàng)建多個(gè)方法,它們具有相同的名字,但具有不同的參數(shù)和不同的定義。
    2015-09-09
  • 詳解Java多線程編程中線程的啟動(dòng)、中斷或終止操作

    詳解Java多線程編程中線程的啟動(dòng)、中斷或終止操作

    在Java中start和tun方法可用被用來啟動(dòng)線程,而用interrupt方法來中斷或終止線程,以下我們就來詳解Java多線程編程中線程的啟動(dòng)、中斷或終止操作
    2016-07-07
  • 介紹Java的大數(shù)類(BigDecimal)和八種舍入模式

    介紹Java的大數(shù)類(BigDecimal)和八種舍入模式

    在實(shí)際應(yīng)用中,需要對(duì)更大或者更小的數(shù)進(jìn)行運(yùn)算和處理。Java在java.math包中提供的API類BigDecimal,用來對(duì)超過16位有效位的數(shù)進(jìn)行精確的運(yùn)算。本文將介紹Java中的大數(shù)類BigDecimal及其八種舍入模式,有需要的可以參考借鑒。
    2016-08-08
  • Java如何替換第一個(gè)和最后一個(gè)字符串

    Java如何替換第一個(gè)和最后一個(gè)字符串

    這篇文章主要介紹了Java如何替換第一個(gè)和最后一個(gè)字符串的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論

金坛市| 昌乐县| 社会| 银川市| 汶川县| 肥城市| 镶黄旗| 利川市| 黎城县| 武夷山市| 类乌齐县| 兴隆县| 祁门县| 杨浦区| 明水县| 云阳县| 钦州市| 信宜市| 塔城市| 崇义县| 济阳县| 诏安县| 淮安市| 德钦县| 万源市| 当雄县| 高淳县| 正宁县| 连平县| 三门县| 定襄县| 临洮县| 七台河市| 延安市| 安岳县| 郧西县| 清丰县| 绥棱县| 花垣县| 镇赉县| 兴义市|