zoukankan      html  css  js  c++  java
  • Elasticsearch源码分析(一)启动流程 ModuleBuilder injector

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



    至此,es进程启动完毕。

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

    关键点在于:

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

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

    点击打开链接

    点击打开链接

  • 相关阅读:
    CF1280G Kirchhoff's Current Loss【表达式解析,不等式】
    [AGC040C] Neither AB nor BA
    [AGC040B]Two Contests
    [ARC101E]Ribbons on Tree(容斥,dp)
    [GXOI/GZOI2019]旧词
    [SDOI2015]寻宝游戏
    半平面交初步
    [CF585E]Marbles
    [P5348]密码解锁
    NOIP2018 保卫王国
  • 原文地址:https://www.cnblogs.com/ydxblog/p/7826969.html
Copyright © 2011-2022 走看看