[2]elasticsearch源碼深刻分析——啓動過程

本篇爲elasticsearch源碼分析系列文章的第二篇,因爲技術不精,而敘述的很差或不對的地方還請你們指出 ^ _ ^!!!bootstrap

源碼主要模塊

distribution:elasticsearch的打包發行相關,將elasticsearch打成各類發行包(zip,deb,rpm,tar)的模塊。具體用法如是,在相應的發行版本模塊下執行publishToMavenLocal這個Task,若是執行成功的話就會在路徑build/distributions下生成對應的發行包,這種打好的包就能在生產服務器上運行。以下圖所示:安全

經過distribution模塊打包發行版本.png

core:核心包,elasticsearch的源碼主要在這個裏面服務器

buildSrc:elasticsearch的構建相關的代碼框架

client:做爲鏈接elasticsearch的客戶端相關代碼,接口以下圖:jvm

client

modules:做爲elasticsearch除核心外的必備模塊相關代碼,結構以下圖:elasticsearch

modules

plugins:做爲elasticsearch必備的插件的相關代碼,結構以下圖:模塊化

plugins

啓動入口

在上面提到的distribution模塊中的src/main/resources/bin路徑下能看到elasticsearch的啓動腳本。以下圖所示:源碼分析

elasticsearch啓動腳本

腳本先載入了jvm配置文件jvm.options(在咱們下載解壓的發行包的config文件夾中)ui

ES_JVM_OPTIONS="$ES_PATH_CONF"/jvm.optionsgoogle

而後載入咱們在Run/Debug Configurations中配置的VM參數。

-Des.path.conf=D:\seymour\elasticsearch\elasticsearch-6.0.0-rc2
-Des.path.home=D:\seymour\elasticsearch\elasticsearch-6.0.0-rc2
-Dlog4j2.disable.jmx=true
複製代碼

最後啓動org.elasticsearch.bootstrap.Elasticsearch這個主類中的main方法。

main方法首先添加了關閉鉤子,

關閉鉤子

而後配置日誌輸出器,

日誌輸出器

而後檢查了elasticsearch的三個環境參數:

putSystemPropertyIfSettingIsMissing(settings, "path.data", "es.path.data");
    putSystemPropertyIfSettingIsMissing(settings, "path.home", "es.path.home");
    putSystemPropertyIfSettingIsMissing(settings, "path.logs", "es.path.logs");
複製代碼

全部的檢查作完後,代碼流轉到了*org.elasticsearch.bootstrap.Bootstrap *類的init()方法,而正是Bootstrap類完成了elasticsearch的啓動

Bootstrap.init(!daemonize, pidFile, quiet, initialEnv);
複製代碼

Bootstrap類

下面咱們來看一下Bootstrap中的幾個重要方法:

init
init(final boolean foreground,final Path pidFile,final boolean quiet,final Environment initialEnv) throws BootstrapException, NodeValidationException, UserException
複製代碼

這個方法不用說也知道是作了一些啓動前的初始化工做

參數詳解

  • foreground:標識elasticsearch是不是做爲後臺守護進程啓動的,
  • pidFile:經過parser解析args後獲得,實際是解析了默認命令行參數(verbose,E,silent,version,help,quiet,daemonize,pidfile)
  • quiet:同上
  • initialEnv:Environment實例化的環境參數對象,保存了一些相似於repoFile,configFile,pluginsFile,binFile,libFile等參數。

主要工做

  • 首先會實例化一個Bootstrap對象
  • 配置log輸出器
  • 建立pid文件,會在磁盤上持久化一個記錄應用pid的文件
  • 經過參數foreground和quiet來控制日誌輸出
  • 調用Bootstrap的setup方法和start方法
setup
setup(boolean addShutdownHook, Environment environment)throws BootstrapException 
複製代碼

主要工做

  • 經過environment生成本地插件控制器

  • 初始化本地資源

  • 在安全管理器安裝以前初始化探針

  • 添加關閉鉤子

  • 檢查jar重複

  • 在安全管理器安裝以前配置日誌輸出器

  • 安裝安全管理器

  • 經過參數environment實例化Node

start
start() throws NodeValidationException 
複製代碼

主要工做

  • 啓動已經實例化的Node
  • 啓動keepAliveThread 線程,這個線程在Bootstrap初始化的時候就已經實例化了,該線程建立了一個計數爲1的CountDownLatch,目的是在啓動完成後能順利添加關閉鉤子,而這句:

意思就是在jvm中增長一個關閉的鉤子,當jvm關閉的時候,會執行系統中已經設置的全部經過方法addShutdownHook添加的鉤子,當系統執行完這些鉤子後,jvm纔會關閉。因此這些鉤子能夠在jvm關閉的時候進行內存清理、對象銷燬等操做。

能夠看到啓動的重點在setup方法中,啓動事後就是Node的事了。

Node類

Node是經過NodeBuilder來實例化的,使用google的注入框架Guice的Injector進行注入與獲取實例。elasticsearch裏面的組件都是用上面的方法進行模塊化管理,elasticsearch對guice進行了封裝,經過ModulesBuilder類構建elasticsearch的模塊:

Node的啓動就是Node裏每一個組件的啓動,一樣的,分別調用不一樣的的start方法來啓動這個組件,以下

至此elasticsearch就啓動完成了,後面我會繼續講解elasticsearch細節內容,請你們多多支持 ^ _ ^ !!!

相關文章
相關標籤/搜索