Elasticsearch的bootstrap代码是我个人到目前为止见过的写得最好的server端启动代码(没有之一),当中包含了大量的自检和环境检测代码,甚至用到了JNA来做OS层面的参数获取和设置。这对于我们写server端代码有很大的参考价值。
ES的启动流程主要包含以下核心类:
Elasticsearch - main入口方法
Bootstrap - 启动相关静态辅助类。当中启动了一个keepAliveThread的前台线程,防止所有daemon线程终止后,整个进程推出;setup中做了大量自检和环境监测
Node - ES节点的封装类。ES依赖了google的guice做DI,整个架构是高度模块化的,Node中初始化并启动了所有的Modules。
从流程上看,Bootstrap主要会经历如下过程:
在整个启动过程中,最有意思的是Bootstrap.step方法,当中会通过Natives类做大量JNA调用,设置和探测OS层面的参数。主要包含
definitelyRunningAsRoot
若当前进程以root账户启动,则退出
tryInstallSystemCallFilter
由bootstrap.system_call_filter参数配置,若为true则激活linux的沙箱机制。相关背景请参阅
https://www.elastic.co/guide/en/elasticsearch/reference/5.4/system-call-filter-check.html