public class Server {
//最小pool执行线程数
private static final int MIN_SERVER_POOL_SIZE = 50;
//最大执行线程数
private static final int MAX_SERVER_POOL_SIZE = 500;
//请求等待队列最大值
private static final int MAX_TASK_QUEUE_SIZE = 20000;
//线程keep-alive 时间 500ms
private static final int KEEP_ALIVE_TIME = 500;
//worker 线程pool channel接受数据后由worker中线程处理执行
private static final ThreadPoolExecutor WORKING_THREADS = new ThreadPoolExecutor(MIN_SERVER_POOL_SIZE,
MAX_SERVER_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(MAX_TASK_QUEUE_SIZE),
new NamedThreadFactory("ServerHandlerThread", MAX_SERVER_POOL_SIZE), new ThreadPoolExecutor.CallerRunsPolicy());
/**
* The entry point of application.
*
* @param args the input arguments
* @throws IOException the io exception
*/
public static void main(String[] args) throws IOException {
// get port first, use to logback.xml
//获取启动端口
int port = PortHelper.getPort(args);
//将配置设置到环境中
System.setProperty(ConfigurationKeys.SERVER_PORT, Integer.toString(port));
// 创建log log使用logback管理
final Logger logger = LoggerFactory.getLogger(Server.class);
if (ContainerHelper.isRunningInContainer()) {
logger.info("The server is running in container.");
}
//initialize the parameter parser
//Note that the parameter parser should always be the first line to execute.
//Because, here we need to parse the parameters needed for startup.
//初始化请求参数解析器 将请求参数转化对象
ParameterParser parameterParser = new ParameterParser(args);
//初始化 metrics
MetricsManager.get().init();
//设置store.mode 类型 事务会话信息存储方式 目前支持3种 file本地文件(不支持HA),db数据库|redis(支持HA)
System.setProperty(ConfigurationKeys.STORE_MODE, parameterParser.getStoreMode());
//初始化NettyRemotingServer
NettyRemotingServer nettyRemotingServer = new NettyRemotingServer(WORKING_THREADS);
//设置 netty server监听port
nettyRemotingServer.setListenPort(parameterParser.getPort());
//初始化id发号器 用于tc生成的id 经典的雪花算法 在TC HA部署注意雪花算法问题
UUIDGenerator.init(parameterParser.getServerNode());
//log store mode : file, db, redis
//初始化 store
SessionHolder.init(parameterParser.getStoreMode());
DefaultCoordinator coordinator = new DefaultCoordinator(nettyRemotingServer);
coordinator.init();
//设置netty 输入in handler
nettyRemotingServer.setHandler(coordinator);
// 注册关闭钩子函数 关闭服务资源
ShutdownHook.getInstance().addDisposable(coordinator);
ShutdownHook.getInstance().addDisposable(nettyRemotingServer);
//验证host有效性 127.0.0.1 and 0.0.0.0 这里无效
//设置XID
if (NetUtil.isValidIp(parameterParser.getHost(), false)) {
XID.setIpAddress(parameterParser.getHost());
} else {
//获取实际地址
XID.setIpAddress(NetUtil.getLocalIp());
}
//设置端口号
XID.setPort(nettyRemotingServer.getListenPort());
try {
//初始化启动
nettyRemotingServer.init();
} catch (Throwable e) {
logger.error("nettyServer init error:{}", e.getMessage(), e);
System.exit(-1);
}
System.exit(0);
}
}