Skip to content
This repository has been archived by the owner on Sep 25, 2023. It is now read-only.

Pomelo启动流程

py8765 edited this page Oct 25, 2012 · 44 revisions

Pomelo是为了实现一个多进程,单线程的符合大型游戏开发的基于node的轻量级游戏框架。

该框架的总体架构如下图:

启动流程概述

该框架启动的模型如下图:

启动入口

在使用pomelo进行游戏开发时,game-server目录中的app.js是整个游戏服务器的入口,pomelo的启动也是从app.js的运行进入。app.js创建项目并启动服务器的代码如下:

var pomelo = require('pomelo');
var app = pomelo.createApp();
app.set('name', 'nameofproject');
app.set('dirname', __dirname);
app.defaultConfiguration();
app.start();

从上面的代码可以看出,用户首先需要在项目中引入pomelo,然后创建application,接着完成一些基本的应用配置,最后应用就可以启动了。当app.js运行起来后,pomelo会根据游戏的配置启动不同的服务器及相关组件。

服务器及组件启动

在启动应用后,首先会加载组件,组件主要包括:handler, filter, master, monitor, proxy, remote, server, sync, connection。组件是连接pomelo和pomelo相关依赖库的桥梁,不同的服务器会选择性加载不同的组件;用户可以根据应用的需求,对不同服务器进行配置从而加载不同的组件,另外用户可以自己开发组件。

组件同时是具有生命周期的,其生命周期可以包括before start, start, after start, stop等。在组件中可以定义这些方法,应用服务器会在不同的运行阶段执行组件不同生命周期的方法。

master服务器首先会加载master组件,在master组件中会启动master服务器。当master服务器启动后,它首先会启动系统的adminConsole,然后根据用户的配置启动其它所有的服务器。其它服务器的启动过程和master服务器一样,从app.js进入,然后加载对应的组件,最后完成启动。

启动流程详述

所有的游戏服务器的启动都是从运行app.js开始。每一个服务器的启动都首先创建一个全局唯一的application对象,该对象中挂载了所在服务器的所有信息,包括服务器物理信息、服务器逻辑信息、以及pomelo的组件信息等。同时,该对象还提供应用管理和配置的基本方法。 在app.js中调用app.start()方法后,application对象首先会通过loadDefaultComponents方法加载默认的组件。

在加载组件时,系统会根据application对象中服务器的信息,针对不同的服务器加载不同的信息,例如,对于master服务器,系统只会加载master组件和monitor组件,对于其它服务器默认加载proxy、filter、handler和server组件,特定的服务器还需要加载特定的组件,例如针对前端服务器会加载connection组件,针对后端服务器会加载remote组件。具体组件的说明如下:

  • master: master组件主要负责启动master服务器。
  • monitor: monitor组件主要负责监控各个服务器,同时所有服务器节点会定期向master服务器发送心跳包和当期服务器的基本信息主要包括cpu和内存使用情况。
  • logger: logger组件主要负责启动服务器中日志记录服务。
  • proxy: proxy组件主要负责生成服务器rpc客户端,由于系统中存在多个服务器进程,不同服务器进程之间相互通信需要通过rpc调用(master服务器除外)。
  • handler:handler组件主要负责加载前端服务器中的handler目录下的文件。
  • remote: remote组件主要负责加载后端服务器的服务并生成服务器rpc服务端。
  • server:server组件主要负责启动前端服务器。
  • sync: sync组件主要负责启动数据同步模块并对外提供数据同步功能。
  • connection: connection组件主要负责启动用户连接信息的统计服务。

组件加载情况具体如下图所示:

组件加载完成后,application对象就会遍历所有加载的组件并逐一启动。

Clone this wiki locally