继上一个系列中: new PrestoServer().run();
@Override
public void run()
{
//读取系统参数来进行判断
//Presto requires an Oracle or OpenJDK JVM
//Presto requires Java 8u60+
//Presto requires a 64-bit JVM
//Presto requires x86-64 or amd64 on Linux
//Presto requires x86_64 on Mac OS X
//Presto requires Linux or Mac OS X
//Presto requires a little endian platform
//Presto recommends the G1 garbage collector.
//Presto recommends at least maxFileDescriptorCount=8192
//检查切片
//verifyJvmRequirements();
//系统时间判断是否可以读的,且大于2015年
verifySystemTimeIsReasonable();
//启动日志
Logger log = Logger.get(PrestoServer.class);
ImmutableList.Builder<Module> modules = ImmutableList.builder();
//module 是binding规范的集合。binding指定类型与具体实现的对应关系
modules.add(
//节点信息
new NodeModule(),
//发现服务模块
new DiscoveryModule(),
//airlife http服务模块
new HttpServerModule(),
//airlife Json模块
new JsonModule(),
//java API for restful 模块
new JaxrsModule(true),
//被管理的bean模块
new MBeanModule(),
//Jmx模块
new JmxModule(),
//基于Http管理MBean的Jmx模块
new JmxHttpModule(),
//日志Jmx模块
new LogJmxModule(),
//跟踪tokenid模块
new TraceTokenModule(),
new JsonEventModule(),
new HttpEventModule(),
//内部服务发现模块
new EmbeddedDiscoveryModule(),
//服务安全模块
new ServerSecurityModule(),
//权限控制模块
new AccessControlModule(),
//事件监听模块(查询结束、创建结束、splite结束)
new EventListenerModule(),
//主要服务模块
new ServerMainModule(sqlParserOptions),
//优雅的关闭服务模块
new GracefulShutdownModule());
modules.addAll(getAdditionalModules());
Bootstrap app = new Bootstrap(modules.build());
try {
//此处会调用guice框架的ElementsIterator构造函数,初始化上面module的configure方法
//其中configure会调用setup方法。这样绑定注入就算初始化成功
//读取配置文件,并打印配置信息
//包括建立发现服务器、连接发送服务器的操作
//重要
Injector injector = app.strictConfig().initialize();
//加载plugin目录下的插件
injector.getInstance(PluginManager.class).loadPlugins();
//加载catalog目录下的properties文件
injector.getInstance(StaticCatalogStore.class).loadCatalogs();
// TODO: remove this huge hack
updateConnectorIds(
injector.getInstance(Announcer.class),
injector.getInstance(CatalogManager.class),
injector.getInstance(ServerConfig.class),
injector.getInstance(NodeSchedulerConfig.class));
injector.getInstance(ResourceGroupManager.class).loadConfigurationManager();
injector.getInstance(AccessControlManager.class).loadSystemAccessControl();
injector.getInstance(EventListenerManager.class).loadConfiguredEventListener();
injector.getInstance(Announcer.class).start();
log.info("======== SERVER STARTED ========");
}
catch (Throwable e) {
log.error(e);
System.exit(1);
}
上面的服务模块很多,我们将一个一个来看,到底是干什么的?
不妨我们带着第一个问题来看代码:restful api web服务是怎么起来的?