1.主服务启动前,需要读取多个配置,源码如下:
ZKClientConfig zkClientConfig = ZKClientConfigImpl.builder()
.connectionString(Config.ZK_URL)
.secureConnectionToZooKeeper(Config.SECURE_ZK)
.namespace("pravega/" + Config.CLUSTER_NAME)
.initialSleepInterval(Config.ZK_RETRY_SLEEP_MS)
.maxRetries(Config.ZK_MAX_RETRIES)
.sessionTimeoutMs(Config.ZK_SESSION_TIMEOUT_MS)
.build();
StoreClientConfig storeClientConfig = StoreClientConfigImpl.withZKClient(zkClientConfig);
HostMonitorConfig hostMonitorConfig = HostMonitorConfigImpl.builder()
.hostMonitorEnabled(Config.HOST_MONITOR_ENABLED)
.hostMonitorMinRebalanceInterval(Config.CLUSTER_MIN_REBALANCE_INTERVAL)
.containerCount(Config.HOST_STORE_CONTAINER_COUNT)
.hostContainerMap(HostMonitorConfigImpl.getHostContainerMap(Config.SERVICE_HOST,
Config.SERVICE_PORT, Config.HOST_STORE_CONTAINER_COUNT))
.build();
TimeoutServiceConfig timeoutServiceConfig = TimeoutServiceConfig.builder()
.maxLeaseValue(Config.MAX_LEASE_VALUE)
.build();
ControllerEventProcessorConfig eventProcessorConfig = ControllerEventProcessorConfigImpl.withDefault();
GRPCServerConfig grpcServerConfig = Config.getGRPCServerConfig();
RESTServerConfig restServerConfig = RESTServerConfigImpl.builder()
.host(Config.REST_SERVER_IP)
.port(Config.REST_SERVER_PORT)
.build();
ControllerServiceConfig serviceConfig = ControllerServiceConfigImpl.builder()
.threadPoolSize(Config.ASYNC_TASK_POOL_SIZE)
.storeClientConfig(storeClientConfig)
.hostMonitorConfig(hostMonitorConfig)
.controllerClusterListenerEnabled(true)
.timeoutServiceConfig(timeoutServiceConfig)
.eventProcessorConfig(Optional.of(eventProcessorConfig))
.grpcServerConfig(Optional.of(grpcServerConfig))
.restServerConfig(Optional.of(restServerConfig))
.build();
2.ControllerServiceMain是 com.google.common.util.concurrent.AbstractExecutionThreadService的子类。com.google.common.util.concurrent是google的多线程工具包,是google开源项目guava的一部分。
ControllerServiceMain controllerServiceMain = new ControllerServiceMain(serviceConfig);
controllerServiceMain.startAsync();
controllerServiceMain.awaitTerminated();
startAsync函数和awaitTerminated函数,是从父类继承而言,不需要ControllerServiceMain类实现。因此主要启动服务在ControllerServiceMain类内部。
3.ControllerServiceMain的业务逻辑
源码在ControllerServiceMain.java文件,主要是run函数。在run函数,while循环里,启动一个starter,然后starter只负责启动和关闭各种服务,在正常运行状态时没有操作,starter启动各种服务后,进入join状态。如果ControllerServericeMain遇到终止条件,while循环结束,服务终止。
这里比较重要的是,是guava的concurrent包的service框架,需要仔细研究分析。