中心服务器是连接其他服务器并控制其他服务器的中心枢纽。
设计上:
(1)控制消息转发流程
(1-1)中心服务器的全局连接管理器管理其他服务器连接到中心服务器的连接 (g_center_session_manager)。
(1-2)登录连接管理器管理连接到登录服务器的会话。
(1-3)gm连接管理器管理连接到gm服务器的会话。
(2)其他服务器启动控制
根据服务器表来控制其他服务器启动依赖关系。动态服务器需要等待静态服务器启动了才能启动。
(3)登录流程控制
(3-1)登录临时会话管理器管理临时登陆会话。
(3-2)加入登录临时会话到登录管理器。如果已有该登录会话(表示同一连接正在登录中),并且中心角色在线,那么发送强行存档到网关。
(3-3)登录成功就添加账号到中心服务器(适用于账号与角色一一对应的情况)。如果该玩家已登录就注销该玩家。已经登陆但找不到用户就移除该账号。成功登录,就发送消息到网关。
1、中心服务器初始化
初始化mysql句柄池,从数据库获取中心服务器配置,初始化网络被动连接线程池,初始化网络主动连接线程池,主动连接到登录服务器(和gm服务器),
绑定服务器端口(初始化监听socket,设置收发缓冲区大小(窗口大小128k),并把监听socket注册到epoll描述符里)。
bool center_server::init()
{
mysqlPool = new mysql_handle_pool();
if (NULL == mysqlPool
|| !mysqlPool->putUrl(0, g_xml_config.get_string("Global.MYSQL.Config")))
{
g_log->error("连接数据库失败");
return false;
}
strncpy(pstrIP, tcp_socket::getIPByIfName(g_xml_config.get_string("Global.NetCard.Config")), MAX_IP_LENGTH - 1);
if (!getServerInfo())//从数据库或配置文件获取中心服务器的配置
return false;
//初始化连接线程池(网络被动连接线程池)
taskPool = new tcp_session_pool(g_xml_config.get_integer("Global.ThreadCarryLink.Config"));
if (NULL == taskPool || !taskPool->init())
return false;
//初始化客户端连接池(网络主动连接线程池)
clientPool = new tcp_client_pool(8,50000);
if (NULL == clientPool || !clientPool->init())
return false;
if(!login_client::init(clientPool))//主动连接到登录服务器
{
g_log->error("初始化登陆服务器模块...失败");
return false;
}
#ifdef GMSERVER
if(!gm_client::init(clientPool))//主动连接到gm服务器
{
g_log->error("初始化登陆服务器模块...失败");
return false;
}
#endif
g_log->info("初始化登陆服务器模块...成功");
if( !g_main_logic_thread.start())
{
g_log->error("初始化main_logic_thread模块...失败");
return false;
}
g_log->info("初始化main_logic_thread模块...成功");
if (!server_base::bind_socket(wdPort))//绑定服务器端口(初始化监听socket,设置收发缓冲区大小(窗口大小128k),并把监听socket注册到epoll描述符里)
{
return false;
}
return true;
}
2、其他类型服务器的启动验证
(1)检查服务器依赖
检查服务器依赖,如果其他被依赖的服务器都启动了就可以通知该服务器来启动
除了中心服务器、登录服务器、运营服务器,其他服务器需要等待静态服务器的启动之后才能启动。
服务器之间