http://blog.csdn.net/u010994304/article/details/50452890

es启动脚本是bin目录下的elasticsearch。

脚本内容不再赘述,java主类位于org.elasticsearch.bootstrap。主要逻辑是生成了一个InternalNode节点,并且启动了一个keepalive线程。结点的启动代表整个es进程启动了。

InternalNode节点是通过NodeBuilder来生成的,节点在构造函数中

通过ModuleBuilder类来进行模块的注入(是对Guice的一个封装而已),同时生成injector实例,如下

  1. ModulesBuilder modules = new ModulesBuilder();
  2. modules.add(new Version.Module(version));
  3. modules.add(new CacheRecyclerModule(settings));
  4. modules.add(new PageCacheRecyclerModule(settings));
  5. modules.add(new BigArraysModule(settings));
  6. modules.add(new PluginsModule(settings, pluginsService));
  7. modules.add(new SettingsModule(settings));
  8. modules.add(new NodeModule(this));
  9. modules.add(new NetworkModule());
  10. modules.add(new ScriptModule(settings));
  11. modules.add(new EnvironmentModule(environment));
  12. modules.add(new NodeEnvironmentModule(nodeEnvironment));
  13. modules.add(new ClusterNameModule(settings));
  14. modules.add(new ThreadPoolModule(settings));
  15. modules.add(new DiscoveryModule(settings));
  16. modules.add(new ClusterModule(settings));
  17. modules.add(new RestModule(settings));
  18. modules.add(new TransportModule(settings));
  19. if (settings.getAsBoolean("http.enabled", true)) {
  20. modules.add(new HttpServerModule(settings));
  21. }
  22. modules.add(new RiversModule(settings));
  23. modules.add(new IndicesModule(settings));
  24. modules.add(new SearchModule());
  25. modules.add(new ActionModule(false));
  26. modules.add(new MonitorModule(settings));
  27. modules.add(new GatewayModule(settings));
  28. modules.add(new NodeClientModule());
  29. modules.add(new BulkUdpModule());
  30. modules.add(new ShapeModule());
  31. modules.add(new PercolatorModule());
  32. modules.add(new ResourceWatcherModule());
  33. modules.add(new RepositoriesModule());
  34. modules.add(new TribeModule());
  1. injector = modules.createInjector();

在InternalNode的start方法中,用injector对各个模块完成启动,各自负责各自的功能,如下:

  1. injector.getInstance(Discovery.class).setAllocationService(injector.getInstance(AllocationService.class));
  2. for (Class<? extends LifecycleComponent> plugin : pluginsService.services()) {
  3. injector.getInstance(plugin).start();
  4. }
  5. injector.getInstance(MappingUpdatedAction.class).start();
  6. injector.getInstance(IndicesService.class).start();
  7. injector.getInstance(IndexingMemoryController.class).start();
  8. injector.getInstance(IndicesClusterStateService.class).start();
  9. injector.getInstance(IndicesTTLService.class).start();
  10. injector.getInstance(RiversManager.class).start();
  11. injector.getInstance(SnapshotsService.class).start();
  12. injector.getInstance(ClusterService.class).start();
  13. injector.getInstance(RoutingService.class).start();
  14. injector.getInstance(SearchService.class).start();
  15. injector.getInstance(MonitorService.class).start();
  16. injector.getInstance(RestController.class).start();
  17. injector.getInstance(TransportService.class).start();
  18. DiscoveryService discoService = injector.getInstance(DiscoveryService.class).start();
  19. discoService.waitForInitialState();
  20. // gateway should start after disco, so it can try and recovery from gateway on "start"
  21. injector.getInstance(GatewayService.class).start();
  22. if (settings.getAsBoolean("http.enabled", true)) {
  23. injector.getInstance(HttpServer.class).start();
  24. }
  25. injector.getInstance(BulkUdpService.class).start();
  26. injector.getInstance(ResourceWatcherService.class).start();
  27. injector.getInstance(TribeService.class).start();

至此,es进程启动完毕。

guice相关介绍可以参见以下链接:

关键点在于:

@inject注释---guice会扫描inject注释,并对方法中出现的参数实例寻找对应注册的实例进行初始化。

bind接口-----将接口跟具体实现类绑定

点击打开链接

点击打开链接

Elasticsearch源码分析(一)启动流程 ModuleBuilder injector的更多相关文章

  1. SpringMVC源码分析和启动流程

    https://yq.aliyun.com/articles/707995 在Spring的web容器启动时会去读取web.xml文件,相关启动顺序为:<context-param> -- ...

  2. Appium Android Bootstrap源码分析之启动运行

    通过前面的两篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>和<Appium Android Bootstrap源码分析之命令解析 ...

  3. Elasticsearch源码分析 - 源码构建

    原文地址:https://mp.weixin.qq.com/s?__biz=MzU2Njg5Nzk0NQ==&mid=2247483694&idx=1&sn=bd03afe5a ...

  4. Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)【转】

    原文地址:Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://bl ...

  5. u-boot 源码分析(1) 启动过程分析

    u-boot 源码分析(1) 启动过程分析 文章目录 u-boot 源码分析(1) 启动过程分析 前言 配置 源码结构 api arch board common cmd drivers fs Kbu ...

  6. Appium Server 源码分析之启动运行Express http服务器

    通过上一个系列Appium Android Bootstrap源码分析我们了解到了appium在安卓目标机器上是如何通过bootstrap这个服务来接收appium从pc端发送过来的命令,并最终使用u ...

  7. Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7)

    http://blog.chinaunix.net/uid-20543672-id-3157283.html Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3 ...

  8. Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】

    原文地址:Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.c ...

  9. nodejs的Express框架源码分析、工作流程分析

    nodejs的Express框架源码分析.工作流程分析 1.Express的编写流程 2.Express关键api的使用及其作用分析 app.use(middleware); connect pack ...

随机推荐

  1. [Leetcode] powx n x的n次方

    Implement pow(x, n). 题意:计算x的次方 思路:这题的思路和sqrt的类似,向二分靠近.例如求4^5,我们可以这样求:res=4.4*4^4.就是将每次在res的基础上乘以x本身, ...

  2. 项目管理---git----快速使用git笔记(七)------coding.net项目管理多人操作的流程规范--合并代码审核

    我们在前面已经介绍了coding.net和本地git的基本用法. 但是多人协作开发时情况会复杂得多,所以我们最好有一些规范来保证项目多人开发顺利进行. 比如说 规范一 master代码分支  需要开启 ...

  3. 【数位DP】【SCOI2009】windy数

    传送门 Description \(windy\)定义了一种\(windy\)数.不含前导零且相邻两个数字之差至少为\(2\)的正整数被称为\(windy\)数.\(windy\)想知道, 在\(A\ ...

  4. Android核心类源码分析

    Handler流程1.首先Looper.prepare()在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象:因为Looper.prepare()在一个线程中只能调用 ...

  5. zoj 2006 Glass Beads

    Glass Beadshttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1006 Time Limit: 2 Seconds     ...

  6. [洛谷P2577] [ZJOI2005]午餐

    洛谷题目链接:[ZJOI2005]午餐 题目描述 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的 ...

  7. [Luogu 2221] HAOI2012 高速公路

    [Luogu 2221] HAOI2012 高速公路 比较容易看出的线段树题目. 由于等概率,期望便转化为 子集元素和/子集个数. 每一段l..r中,子集元素和为: \(\sum w_{i}(i-l+ ...

  8. String.replaceAll()方法替换字符串中的反斜杠(\)

    replaceAll()方法实际是采用正则表达式的规则去匹配的. 在regex中"\\"表示一个"\",在java中一个"\"也要用&quo ...

  9. Sass 颜色函数

    /* * Sass 颜色函数 * RGB 颜色函数 * 1. rgb($red,$green,$blue):根据红.绿.蓝三个值创建一个颜色: * rgb(200,40,88) //根据r:200,g ...

  10. 招人不是HR第一职责,留住人才是

    什么是HR的第一责任?我希望你们知道,招人不是你的第一职责,留住人才是你的第一职责.HR工作是相当难做的,你们是公司集团内里各个部门中最难做的部门,也是最具战略性的部门. 以人为本,这个“人”就是阿里 ...