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

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

elasticsearch插件如何實(shí)現(xiàn)類

這篇文章主要介紹“elasticsearch插件如何實(shí)現(xiàn)類”,在日常操作中,相信很多人在elasticsearch插件如何實(shí)現(xiàn)類問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”elasticsearch插件如何實(shí)現(xiàn)類”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

奉節(jié)ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

        elasticsearch 的 基礎(chǔ)類,主要分成 Component (組件) 和 Module (模塊)。

  1. 組件

    1. CloseableComponent                可關(guān)閉組件

    2. AbstractComponent                 可配置組件

    3. LifecycleComponent                 活動(dòng)可關(guān)閉組件

    4. AbstractLifecycleComponent    可配置的活動(dòng)可關(guān)閉組件 (。。。有點(diǎn)長)

  2. 模塊

    1. Module                                    模塊

    2. PreProcessModule                   預(yù)處理模塊

    3. SpawnModules                       新模塊

一.     AbstractPlugin 類 ,一個(gè)插件類要繼承自它或者實(shí)現(xiàn)Plugin接口

elasticsearch插件如何實(shí)現(xiàn)類

插件類需要實(shí)現(xiàn)的Plugin接口,每個(gè)方法所對應(yīng)的組件類型是

  • modules()        Module

  • services()        LifecycleComponent

  • indexModules()        Module

  • indexServices()        CloseableIndexComponent

  • shardModules()        Module

  • shardServices()        CloseableIndexComponent

二.     現(xiàn)在插件實(shí)現(xiàn)類,有了,那他是怎么被加載到整個(gè)系統(tǒng)里面的呢?那就要請出我們插件組的各個(gè)成員了。

  • PluginManager類,插件管理類,負(fù)責(zé)插件的安裝,卸載,下載等工作。

  • PluginsHelper類,插件幫助類,負(fù)責(zé)列出環(huán)境下面所有的site插件。

  • PluginsService類,插件服務(wù)類,負(fù)責(zé)插件的加載,實(shí)例化和維護(hù)插件信息。

整個(gè)節(jié)點(diǎn)啟動(dòng)的時(shí)候,InternalNode的構(gòu)造方法里加載配置文件以后,首先會實(shí)例化 PluginsService 類,還有PluginsModule模塊 。

this.pluginsService = new PluginsService(tuple.v1(), tuple.v2());
this.settings = pluginsService.updatedSettings();
this.environment = tuple.v2();

CompressorFactory.configure(settings);

NodeEnvironment nodeEnvironment = new NodeEnvironment(this.settings, this.environment);

ModulesBuilder modules = new ModulesBuilder();
modules.add(new PluginsModule(settings, pluginsService));
modules.add(new SettingsModule(settings));
modules.add(new NodeModule(this));

PluginsService類的構(gòu)造方法里,會開始加載插件類,從配置文件和Classpath里面,并且處理 plugin.mandatory 配置的強(qiáng)依賴插件,和模塊引用

   public PluginsService(Settings settings, Environment environment) {
        super(settings);
        this.environment = environment;

        Map plugins = Maps.newHashMap();

        //首先,我們從配置文件加載,默認(rèn)的插件類
        String[] defaultPluginsClasses = settings.getAsArray("plugin.types");
        for (String pluginClass : defaultPluginsClasses) {
            Plugin plugin = loadPlugin(pluginClass, settings);
            plugins.put(plugin.name(), plugin);
        }

        // 現(xiàn)在, 我們查找,所有的在ClassPath下面的插件
        loadPluginsIntoClassLoader();
        plugins.putAll(loadPluginsFromClasspath(settings)); //加載JVM插件
        Set sitePlugins = PluginsHelper.sitePlugins(this.environment); //加載站點(diǎn)插件
        
        //強(qiáng)制依賴的插件,如果沒有找到
        String[] mandatoryPlugins = settings.getAsArray("plugin.mandatory", null);
        if (mandatoryPlugins != null) {
            Set missingPlugins = Sets.newHashSet();
            for (String mandatoryPlugin : mandatoryPlugins) {
                if (!plugins.containsKey(mandatoryPlugin) && !sitePlugins.contains(mandatoryPlugin) && !missingPlugins.contains(mandatoryPlugin)) {
                    missingPlugins.add(mandatoryPlugin);
                }
            }
            if (!missingPlugins.isEmpty()) {
            	//拋出異常,整個(gè)節(jié)點(diǎn)啟動(dòng)失敗!
                throw new ElasticSearchException("Missing mandatory plugins [" + Strings.collectionToDelimitedString(missingPlugins, ", ") + "]");
            }
        }
        logger.info("loaded {}, sites {}", plugins.keySet(), sitePlugins);
        this.plugins = ImmutableMap.copyOf(plugins);

        //現(xiàn)在,所有插件都加載好了,處理插件實(shí)現(xiàn)類的 onModule 方法的引用 ,這里有 依賴注入的秘密。
        
        MapBuilder> onModuleReferences = MapBuilder.newMapBuilder();
        for (Plugin plugin : plugins.values()) {
            List list = Lists.newArrayList();
            //....
        }
        this.onModuleReferences = onModuleReferences.immutableMap();
        this.refreshInterval = componentSettings.getAsTime("info_refresh_interval", TimeValue.timeValueSeconds(10));

    }

PluginsService.info() 方法,是插件信息類,NodeService 會調(diào)用 ,是節(jié)點(diǎn)信息類的一部分,就是REST接口 /nodes 返回的內(nèi)容

//PluginInfo類的字段
static final class Fields {
        static final XContentBuilderString NAME = new XContentBuilderString("name");
        static final XContentBuilderString DESCRIPTION = new XContentBuilderString("description");
        static final XContentBuilderString URL = new XContentBuilderString("url");
        static final XContentBuilderString JVM = new XContentBuilderString("jvm");
        static final XContentBuilderString SITE = new XContentBuilderString("site");
}

InternalNode 會繼續(xù)調(diào)用 modules.createInjector() 方法去實(shí)例化所有的模塊。PluginsModule模塊會去實(shí)例化和調(diào)用我們的插件

// 創(chuàng)建Plugin 類覆蓋  modules 方法的模塊
    @Override
    public Iterable spawnModules() {
        List modules = Lists.newArrayList();
        Collection> modulesClasses = pluginsService.modules();
        for (Class moduleClass : modulesClasses) {
            modules.add(createModule(moduleClass, settings));
        }
        modules.addAll(pluginsService.modules(settings));
        return modules;
    }
    // 處理Plugin類實(shí)現(xiàn)了 onModule 方法的類
    @Override
    public void processModule(Module module) {
        pluginsService.processModule(module);
    }

InternalNode 的 start()方法,就是節(jié)點(diǎn)啟動(dòng)的時(shí)候,會啟動(dòng)Plugin類覆蓋了services方法的服務(wù)

 for (Class plugin : pluginsService.services()) {
            injector.getInstance(plugin).start();
 }

InternalIndicesService.createIndex() 方法,也就是創(chuàng)建索引的時(shí)候,會創(chuàng)建 Plugin類 覆蓋了 indexModules() 的模塊

InternalIndexService.createShard() 方法,創(chuàng)建分片的時(shí)候,會去創(chuàng)建Plugin類 覆蓋了 shardModules() 的模塊

同理刪除索引和分片的時(shí)候,會銷毀模塊和關(guān)閉服務(wù)。也就是插件擴(kuò)展的服務(wù)和模塊是有3個(gè)生命周期的。

  • Global    節(jié)點(diǎn)級別

  • Index    索引級別

  • Shard    分片級別

三.     插件類有了,插件也被加載進(jìn)系統(tǒng)了,那它是怎么擴(kuò)展現(xiàn)有模塊服務(wù)的,那些模塊可以擴(kuò)展,那些不可以?

可擴(kuò)展的模塊,一般都提供了 addXXX,registerXXX 等方法

//智能提示
public void onModule(SuggestModule suggestModule) {
    suggestModule.registerSuggester(MySuggester.class);
}
//REST
public void onModule(RestModule restModule) {
    restModule.addRestAction(MyRestAction.class);
}
//高亮
public void onModule(HighlightModule highlightModule) {
    highlightModule.registerHighlighter(MyHighlighter.class);
}

可替換的模塊,一般是實(shí)現(xiàn)了SpawnModules接口的模塊,比如DiscoveryModule

@Override
    public Iterable spawnModules() {
        Class defaultDiscoveryModule;
        if (settings.getAsBoolean("node.local", false)) {
            defaultDiscoveryModule = LocalDiscoveryModule.class;
        } else {
            defaultDiscoveryModule = ZenDiscoveryModule.class;
        }
        return ImmutableList.of(Modules.createModule(settings.getAsClass("discovery.type", defaultDiscoveryModule, "org.elasticsearch.discovery.", "DiscoveryModule"), settings));
}

根據(jù)配置項(xiàng)discovery.type來確定加載那個(gè)模塊

不可以擴(kuò)展或替換的組件,比如  Internal 開頭的組件,InternalClusterService,InternalIndicesService    等是不可以替換的。

到此,關(guān)于“elasticsearch插件如何實(shí)現(xiàn)類”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!


文章題目:elasticsearch插件如何實(shí)現(xiàn)類
URL標(biāo)題:http://weahome.cn/article/jjdhhd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部