這篇文章主要介紹“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 (模塊)。
組件
CloseableComponent 可關(guān)閉組件
AbstractComponent 可配置組件
LifecycleComponent 活動(dòng)可關(guān)閉組件
AbstractLifecycleComponent 可配置的活動(dòng)可關(guān)閉組件 (。。。有點(diǎn)長)
模塊
Module 模塊
PreProcessModule 預(yù)處理模塊
SpawnModules 新模塊
一. AbstractPlugin 類 ,一個(gè)插件類要繼承自它或者實(shí)現(xiàn)Plugin接口
插件類需要實(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; Mapplugins = 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 extends Module> spawnModules() { Listmodules = Lists.newArrayList(); Collection > modulesClasses = pluginsService.modules(); for (Class extends Module> 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 extends LifecycleComponent> 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 extends Module> spawnModules() { Class extends Module> 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í)用的文章!