当前位置: 首页 > news >正文

第 28 章 - ES 源码篇 - Elasticsearch 启动与插件加载机制解析

前言

不管是什么框架,启动类里面做的一定是初始化的工作!

启动

ES 节点的启动逻辑,全部都在 org.elasticsearch.bootstrap 包下。
启动类为:Elasticsearch#main(final String[] args)
与大多数框架启动类一致。启动类主要负责的是资源加载、框架初始化。
其主要的启动函数为:Bootstrap#init(final boolean foreground, final Path pidFile, final boolean quiet, final Environment initialEnv)
Bootstrap#init 函数中,会初始化 最核心、最关键的 Node 类

Node 表示集群节点。在该类的构造函数 protected Node(final Environment initialEnvironment,Collection<Class<? extends Plugin>> classpathPlugins, boolean forbidPrivateIndexSettings) 中,会执行节点的初始化,加载配置文件,加载插件。同理,该 org.elasticsearch.node 包下包含了节点相关的类。

Node 在初始化过程中,会创建以下几个模块。

  1. ClusterModule:集群模块,主要负责管理集群元信息
  2. IndicesModule:索引模块
  3. IndexSettingModule:索引配置模块
  4. GatewayModule:网关模块
  5. SettingsModule:配置模块
  6. ActionModule:路由处理器模块
  7. NetworkModule:网络模块

每个模块负责不同的功能,模块内部会关联 n 个插件。
例如,NetworkModule 关联 NetworkPluginActionModule 关联 ActionPlugin

我们重点关注如何加载插件的?用了什么设计模式?做到了高扩展性。

对于加载配置文件、加载插件、加载模块。ES 统一由 PluginsService 处理(面向对象编程)
加载配置:读取 ${es.path.home}/config 目录下的所有文件
加载插件:读取 ${es.path.home}/plugin 目录下的所有文件
加载模块:读取 ${es.path.home}/modules 目录下的所有文件
这些配置文件统一由 Environment 负责管理(面向对象编程)

具体的 PluginsService 如何从解析的,不过多介绍,因为不同的人会有不同的写法,以及不同的解析方式,我们主要学习其思想。其代码入口为 public PluginsService(Settings settings, Path configPath, Path modulesDirectory, Path pluginsDirectory, Collection<Class<? extends Plugin>> classpathPlugins)

其实所谓的可插拔、插件化,无非就是读取指定目录下的文件罢了。这种思想和 SPI 大相径庭。或者说,几乎所有想做到让用户可以自定义某些功能,它的核心本质就是需要让用户在某个指定的目录下按照一定的规范配置文件。
插件的接口定义类均在 org.elasticsearch.plugins 目录下
环境变量相关的配置类均在 org.elasticsearch.env 目录下
到这里,其实就不难看出,ES 源码非常整洁、干净,这样的工程思想非常值得我们学习。

具体的 ES 都加载了哪些 plugin,可以看 Plugin 该类的类注释。

http://www.lryc.cn/news/511136.html

相关文章:

  • 机床数据采集网关在某机械制造企业的应用
  • 美团Android开发200道面试题及参考答案(上)
  • MQTT协议的应用场景及特点和常见的概念03
  • 电脑缺失sxs.dll文件要怎么解决?
  • 数据处的存储与处理——添加数组
  • 24-12-28-pytorch深度学习CUDA的GPU加速环境配置步骤
  • YOLO系列正传(五)YOLOv4论文精解(上):从CSPNet、SPP、PANet到CSPDarknet-53
  • 【AIGC-ChatGPT副业提示词指令 - 动图】魔法咖啡馆:一个融合创意与治愈的互动体验设计
  • AIGC在电影与影视制作中的应用:提高创作效率与创意的无限可能
  • 第三百四十六节 JavaFX教程 - JavaFX绑定
  • IDEA+Docker一键部署项目SpringBoot项目
  • vue Promise使用
  • Tomcat调优相关理解
  • uni-app开发-识图小程序-主要功能以及首页实现
  • vue3 ref reactive响应式数据,赋值的问题、解构失去响应式问题
  • 算法常用库函数——C++篇
  • 怎么把多个PDF合并到一起-免费实用PDF编辑处理工具分享
  • RFC协议简要介绍——有关TCP拥塞控制的RFC
  • Speckly:基于Speckle文档的RAG智能问答机器人
  • 香橙派5Plus启动报错bug: spinlock bad magic on cpu#6, systemd-udevd/443
  • 电子应用设计方案74:智能家庭对讲系统设计
  • node js 过滤空白行
  • 武泳樽携手AI AD Manager荣获红点奖,智能广告管理系统备受瞩目
  • Express.js 有哪些常用的中间件?
  • WordPress File Upload插件 任意文件读取漏洞复现(CVE-2024-9047)(附脚本)
  • qt QZipReader详解
  • C# 超高速高性能写日志
  • 阿里云人工智能ACA(五)——深度学习基础
  • 入职体检尿潜血3+能通过吗,什么原因引起
  • vue最新源码探索分析