第 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
在初始化过程中,会创建以下几个模块。
- ClusterModule:集群模块,主要负责管理集群元信息
- IndicesModule:索引模块
- IndexSettingModule:索引配置模块
- GatewayModule:网关模块
- SettingsModule:配置模块
- ActionModule:路由处理器模块
- NetworkModule:网络模块
每个模块负责不同的功能,模块内部会关联 n 个插件。
例如,NetworkModule
关联 NetworkPlugin
,ActionModule
关联 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
该类的类注释。
相关文章:
第 28 章 - ES 源码篇 - Elasticsearch 启动与插件加载机制解析
前言 不管是什么框架,启动类里面做的一定是初始化的工作! 启动 ES 节点的启动逻辑,全部都在 org.elasticsearch.bootstrap 包下。 启动类为:Elasticsearch#main(final String[] args) 与大多数框架启动类一致。启动类主要负责的…...

机床数据采集网关在某机械制造企业的应用
随着工业4.0时代的到来,智能制造已成为制造业转型升级的重要方向。数控机床作为现代制造业的核心设备,其运行状态和加工参数的数据实时采集与分析对于提升生产效率、优化生产流程具有关键意义。 背景概述 某机械制造企业拥有多台数控机床,这…...
美团Android开发200道面试题及参考答案(上)
http 三次握手 / 四次挥手具体过程,信号量的变化,只有两次握手行不行 三次握手过程: 第一次握手:客户端向服务器发送一个 SYN(同步)标志位为 1 的 TCP 报文段,其中包含客户端的初始序列号(ISN),此时客户端进入 SYN_SENT 状态,表示客户端请求建立连接。第二次握手:服…...
MQTT协议的应用场景及特点和常见的概念03
发布者发送数据---》代理软件Broker---》订阅者接收数据 发布者和订阅者进行隔离 1.空间上的隔离 2.时间上的隔离 MQTT常见的应用场景:物联网行业 MQTT常见的特点: 1.轻量级:MQTT协议占用的系统资源较少,数据报文较小 2.可靠性较强࿱…...

电脑缺失sxs.dll文件要怎么解决?
一、文件丢失问题:以sxs.dll文件缺失为例 当你在运行某个程序时,如果系统提示“找不到sxs.dll文件”,这意味着你的系统中缺少了一个名为sxs.dll的动态链接库文件。sxs.dll文件通常与Microsoft的.NET Framework相关,是许多应用程序…...
数据处的存储与处理——添加数组
Numpy模块中的append()函数和insert()函数 1、append()函数的使用 append(arr,values,axisNone) arr 必选,要添加元素的数组 values 必选,要添加的元素数组 axis 可选,默认值为None。当省略该参数时,表示在…...

24-12-28-pytorch深度学习CUDA的GPU加速环境配置步骤
文章目录 pytorch深度学习CUDA的GPU加速环境配置步骤1. 更新cuda驱动2. 更新完成cuda驱动后,查看对应的驱动版本3. 根据驱动的版本号,下载对应的cuda-toolkit4. CUDA是否配置成功5. 配置CUDNN6. 配置torch pytorch深度学习CUDA的GPU加速环境配置步骤 1.…...

YOLO系列正传(五)YOLOv4论文精解(上):从CSPNet、SPP、PANet到CSPDarknet-53
系列文章 YOLO系列基础 YOLO系列基础合集——小白也看得懂的论文精解-CSDN博客 YOLO系列正传 YOLO系列正传(一)类别损失与MSE损失函数、交叉熵损失函数-CSDN博客 YOLO系列正传(二)YOLOv3论文精解(上)——从FPN到darknet-53-C…...

【AIGC-ChatGPT副业提示词指令 - 动图】魔法咖啡馆:一个融合创意与治愈的互动体验设计
引言 在当今快节奏的生活中,咖啡早已不仅仅是提神醒脑的饮品,更成为了一种情感寄托和生活态度的表达。本文将介绍一个独特的"魔法咖啡馆"互动体验设计,通过将咖啡与情感、魔法元素相结合,创造出一个充满想象力和治愈感…...
AIGC在电影与影视制作中的应用:提高创作效率与创意的无限可能
云边有个稻草人-CSDN博客 目录 引言 一、AIGC在剧本创作中的应用 1.1 剧本创作的传统模式与挑战 1.2 AIGC如何协助剧本创作 1.3 未来的剧本创作:AI辅助的协同创作 二、AIGC在角色设计中的应用 2.1 传统角色设计的挑战 2.2 AIGC如何协助角色设计 三、AIGC在…...

第三百四十六节 JavaFX教程 - JavaFX绑定
JavaFX教程 - JavaFX绑定 JavaFX绑定同步两个值:当因变量更改时,其他变量更改。 要将属性绑定到另一个属性,请调用bind()方法,该方法在一个方向绑定值。例如,当属性A绑定到属性B时,属性B的更改将更新属性A…...

IDEA+Docker一键部署项目SpringBoot项目
文章目录 1. 部署项目的传统方式2. 前置工作3. SSH配置4. 连接Docker守护进程5. 创建简单的SpringBoot应用程序6. 编写Dockerfile文件7. 配置远程部署 7.1 创建配置7.2 绑定端口7.3 添加执行前要运行的任务 8. 部署项目9. 开放防火墙的 11020 端口10. 访问项目11. 可能遇到的问…...
vue Promise使用
new Promise((resolve, reject) > { ... }) 是 JavaScript 中创建 Promise 实例的语法。Promise 是一种用于处理异步操作的对象,它代表了一个异步操作的最终完成(或失败)及其结果值。 Promise 的基本结构 javascript 深色版本 const my…...
Tomcat调优相关理解
什么是QPS? 是Queries Per Second 的缩写,是指服务器每秒查询数,比如定义一个a接口,该接口是10QPS,那么就是指该接口每秒可以处理10个请求 springboot默认并发处理数是多少? springboot并发处理要看serv…...
uni-app开发-识图小程序-主要功能以及首页实现
目录 一:功能介绍 二:代码实现 一:功能介绍 识图小程序首页主要是识图类型的展示列表,目前只有四种类型的图像识别,分别是车牌,发票,电表,身份证。可以分别识别车牌号码,身份证号码,发票号码,和电表度数。点击对应的类型图标会跳转到识图页面,每个分类上面展示该…...
vue3 ref reactive响应式数据,赋值的问题、解构失去响应式问题
在 Vue3 中,使用 ref 和 reactive 创建响应式数据时,赋值操作和解构赋值存在一些需要注意的事项。以下是对这些问题的详细解答以及代码示例: ref 和 reactive 的基本用法 ref:主要用于基本数据类型(如 Number、String、…...
算法常用库函数——C++篇
前言 本文主要记录、整理、回顾在算法考试中常用的一些库函数,技巧等,不断更新中~ list 常用方法 在一般c编程中,对于数组这样的数据结构,一般都使用vector居多,貌似list用的很少。但实际list也十分强大,…...

怎么把多个PDF合并到一起-免费实用PDF编辑处理工具分享
>>更多PDF文件处理应用技巧请前往 96缔盟PDF处理器 主页 查阅! 序言 我之前的文章也有介绍过如何使用96缔盟PDF处理器对PDF文件合并或者批量合并的介绍,但是当时是使用DMPDFUtilTool1.0版本进行的,当时的功能尚不完善,还不支…...
RFC协议简要介绍——有关TCP拥塞控制的RFC
1.RFC Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件。RFC文件是由Internet Society(ISOC)赞助发行。基本的互联网通信协议都有在R…...

Speckly:基于Speckle文档的RAG智能问答机器人
前言 Speckly 是一个基于 检索增强生成 (RAG) 技术的智能问答机器人,它能像一位经验丰富的工程师,理解你的问题,并从 Speckle 文档中精准地找到答案。更厉害的是,它甚至可以帮你生成代码片段!🚀 本文将详…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...