目录
- elasticsearch启动过程
- 首先看一下node的初始化
- 启动各个模块的过程
- 插件的加载过程
elasticsearch启动过程
elasticsearch的启动过程是根据配置和环境组装需要的模块并启动的过程。这一过程就是通过guice注入各个功能模块并启动这些模块,从而得到一个功能完整的node。正如之前所说elasticsearch的模块化特点,它的各个功能都是独立实现,然后实现通过guice对外提供。
首先简单的说一下guice,它是google的一个轻量级依赖注入框架。它的作者也是依赖注入标准(jsr-330)制定者。虽然它是轻量级框架,但是它的功能及性能却非常好,这也是elasticsearch选用它作为代码主要框架的一个主要原因。它的使用请参考它的用户指导。
首先看一下node的初始化
node接口的唯一实现是internalnode,它的初始化代码如下所示:
public internalnode(settings preparedsettings, boolean loadconfigsettings) throws elasticsearchexception { final settings psettings = settingsbuilder().put(preparedsettings) .put(client.client_type_setting, client_type).build(); tuple tuple = i 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 jvmplugins = maps.newhashmap(); list siteplugins = lists.newarraylist(); for (tuple tuple : this.plugins) { jvmplugins.put(tuple.v2().name(), tuple.v2()); if (tuple.v1().issite()) { siteplugins.add(tuple.v1().getname()); } } // 加载site插件 immutablelist> tuples = loadsiteplugins(); for (tuple tuple : tuples) { siteplugins.add(tuple.v1().getname()); } // 检验代理插件,如果有加载不成功的插件就抛出异常,停止node启动。 string[] mandatoryplugins = settings.getasarray("plugin.mandatory", null); if (mandatoryplugins != null) { set 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的初始化过程,在它的初始化过程中,加载所有能够找的插件。插件的启动在其他功能模块之前,些插件,如分词插件,启动不成功则会对节点的功能造成影响,因此会在这里就中断节点的启动过程让用户知道。这就是节点的启动过程。插件加载成功,各个功能模块加载并启动成功,节点就启动成功。
限于篇幅这里模块相关详情都没有进行深入在接下来模块分析中会一一分析,希望大家以后多多支持我们!
展开全文