源码角度了解Skywalking之服务端OAP的启动流程 Skywalking的服务端OAP的逻辑对应oap-server模块,入口是server-starter子模块的OAPServerStartUp类,直接调用了server-bootstrap子模块的OAPServerBootstrap的s
源码角度了解Skywalking之服务端OAP的启动流程
Skywalking的服务端OAP的逻辑对应oap-server模块,入口是server-starter子模块的OAPServerStartUp类,直接调用了server-bootstrap子模块的OAPServerBootstrap的start()方法
OAPServerBootstrap的start()方法:
public static void start() { String mode = System.getProperty("mode"); RunningMode.setMode(mode); ApplicationConfigLoader configLoader = new ApplicationConfigLoader(); ModuleManager manager = new ModuleManager(); try { ApplicationConfiguration applicationConfiguration = configLoader.load(); manager.init(applicationConfiguration); manager.find(TelemetryModule.NAME).provider().getService(MetricsCreator.class).createGauge("uptime", "oap server start up time", MetricsTag.EMPTY_KEY, MetricsTag.EMPTY_VALUE) // Set uptime to second .setValue(System.currentTimeMillis() / 1000d); if (RunningMode.isInitMode()) { logger.info("OAP starts up in init mode successfully, exit now..."); System.exit(0); } } catch (Throwable t) { logger.error(t.getMessage(), t); System.exit(1); } }我们具体看一下初始化模块
初始化模块
ModuleManager负责在收集器中的所有ModuleDefine
ModuleManager的init()方法:
ModuleDefine的准备阶段
ModuleDefine实例的prepare()方法是运行模块的准备阶段,这个方法中也会找到所有潜在的提供者,让他们也进入准备阶段
ModuleDefine的prepare()方法:
BootstrapFlow创建、启动与通知
在初始化过程中,创建BootstrapFlow对象,BootstrapFlow的构造方法中创建LinkedList对象用链表集合记录模块的启动顺序,模块之间可能存在依赖,所以需要调用makeSequence()方法设定模块的加载顺序。
BootstrapFlow的start()方法:
void start( ModuleManager moduleManager) throws ModuleNotFoundException, ServiceNotProvidedException, ModuleStartException { for (ModuleProvider provider : startupSequence) { String[] requiredModules = provider.requiredModules(); if (requiredModules != null) { for (String module : requiredModules) { if (!moduleManager.has(module)) { throw new ModuleNotFoundException(module + " is required by " + provider.getModuleName() + "." + provider.name() + ", but not found."); } } } logger.info("start the provider {} in {} module.", provider.name(), provider.getModuleName()); provider.requiredCheck(provider.getModule().services()); provider.start(); } }遍历所有的ModuleProvider:
所有的ModuleProvider依次启动后回调执行notifyAfterCompleted()方法
总结
这篇文章主要讲了Skywalking的服务端OAP的启动流程,入口是server-starter模块的OAPServerStartUp类的main()方法,这一启动过程主要做的是加载server-bootstrap模块中的application.yml定义的模块定义、模块配置,然后相对应的ModuleProvider依次按顺序进行启动
❤️ 感谢大家
如果你觉得这篇内容对你挺有有帮助的话: