pomelo 简介
pomelo 是一个基于 node.js 的游戏服务器框架。与以往单进程的游戏框架不同, 它是高性能、高可伸缩、分布式多进程的游戏服务器框架,并且使用很简单。pomelo 意为柚子,如果形象的描述它,组成它的每个瓣,就是单个 node.js 服务。
pomelo 包括一个基础开发框架和一系列相关工具和库,可以帮助开发者省去游戏开发中枯燥的重复劳动和底层逻辑工作,免除开发者的重造轮子,让开发者可以更多地去关注游戏的具体逻辑,大大提高开发效率。
pomelo 强大的可伸缩性和灵活性使得 pomelo 也可以作为通用的分布式实时应用开发框架,用于一些高实时应用的开发,而且 pomelo 在很多方面的表现甚至超越了现有的开源实时应用框架。
pomelo 支持所有主流平台的客户端,并提供了客户端的开发库,使得客户端的开发变得很友好。
pomelo 最初由网易公司官方发布在 https://github.com/NetEase/pomelo ,本文发稿时,最新版本为 2.2.7 ,最后更新日期为 2019 年 11 月 8 日。经编者实际使用测试,该版本最高可支持的 node.js 版本为 7.6。
此后,编者因 CentOS 版本对 node.js 低版本的不兼容,历经磨难后艰苦寻觅,找到大神 shudingbo 发布在 https://github.com/sex-pomelo/sex-pomelo 的改进升级版本,该版本主要解决了对高版本 node.js 的兼容问题,大神建议使用版本 node.js 8.0 以上。截止到本文发稿时,sex-pomelo 最高兼容到了 node.js 16 ,最后更新日期为 2021 年 11 月 27 日,编者实际使用 node.js-v16.14.0 + sex-pomelo 版本进行了开发部署,使用一年多来,运行依然如原版一样坚如磐石、稳定可靠。
在此,请允许编者发自内心地感谢 shudingbo,祝他以此功德,福如东海!
pomelo 官方版网址: https://github.com/NetEase/pomelo
sex-pomelo 升级版网址: https://github.com/sex-pomelo/sex-pomelo
pomelo 中文文档网址:https://github.com/NetEase/pomelo/wiki/Home-in-Chinese
pomelo 组成
pomelo 是由一系列相互之间弱耦合的部分组合而成的,包括:- 框架:框架是 pomelo 最核心的部分;
- 库:pomelo 提供了很多库,有些是跟游戏逻辑完全相关的,如 AI,AOI,寻路等;也有与游戏逻辑无关但比较通用的,如定时任务执行, 数据同步等等;
- 工具:pomelo 提供了服务器管理控制工具、命令行工具、压力测试工具等一系列工具;
- 客户端库:pomelo 提供了各类平台的客户端开发库,包括 js, C, C#,Android, iOS, Unity3D 等等,几乎支持涵盖了目前所有的主流平台,由于 pomelo 的协议是开放的,架构耦合松散,对于没有支持的客户端平台,用户也可以很容易地开发出自己需要的库,定制自己的通信协议;
- demo:一个框架需要强大的demo来展示功能并为开发者提供示例,pomelo提供了全平台的聊天demo和基于HTML5的捡宝demo,系统还提供了一个强大的基于HTML5开发的MMO游戏demoLordofpomelo(源码,编者按:已无法访问)
pomelo 的定位
pomelo 是一个轻量级的服务器框架,它最适合的应用领域是网页游戏、社交游戏、移动游戏的服务端,开发者会发现 pomelo 可以用如此少的代码达到强大的扩展性和伸缩性。当然还不仅仅是游戏,用 pomelo 开发高实时 web 应用也如此合适, 而且伸缩性比其它框架好。不推荐将 pomelo 用于大型的 MMORPG 游戏开发,尤其是大型 3D 游戏, 还是需要象 Bigworld 这样的商用引擎来支撑。
安装pomelo
pomelo是基于 node.js的,目前pomelo已经完全支持Windows、Linux、Mac等多种平台。但是本文只介绍 linux 平台的 sex-pomelo 安装,需要理由吗?node.js + pomelo 运营,本该选用 linux 服务器!何必浪费时间精力用其他?首先,确保你的系统上已经要安装了 node.js,建议版本 16;
使用 npm 全局安装 sex-pomelo:
npm install -g @sex-pomelo/sex-pomelo
可以通过如下命令下载源代码的方式安装:
git clone https://github.com/sex-pomelo/sex-pomelo
$ cd sex-pomelo
$ npm install -g
npm 为 node.js 包管理工具,其中 -g 表示全局安装,npm 的使用相关知识请参考 npm 文档,里面有详细的说明。如果安装过程中没有报错误,说明安装成功。
新建项目
使用pomelo的命令行工具可以快速创建一个项目,命令如下:pomelo init ./HelloWorld
特别提醒:注意仅安装时需用 “sex-pomelo” 这个名称,后面使用过程中,都不要再加 “sex-”,而是直接使用 “pomelo”,因为 sex-pomelo 实际上仅仅只是 pomelo 的一个升级版分支,用不同名称安装是为避免错装为低版本。更多关于 pomelo 命令行使用的文档,请参阅 pomelo 命令行工具 。在初始化项目的时候,用户需要选择其底层使用的通信协议,分为 socket.io 和 websocket。
然后,进入到HelloWorld文件夹,安装依赖包:
sh npm-install.sh
项目目录结构
让我们来看看一个 pomelo 项目的大致结构,新建立的项目结构如下图所示:
该目录结构很清楚地展示了游戏项目的前后端分层结构,分别在各个目录下填写相关代码,即可快速开发游戏。
下面对各个目录进行简要分析:
-
game-server 是用 pomelo 框架搭建的游戏服务器,以文件 app.js 作为入口,运行游戏的所有逻辑和功能。在接下来的开发中,所有游戏逻辑、功能、配置等都在该目录下进行。
- app 子目录:这个目录下放置所有的游戏服务器代码的地方,用户在这里实现不同类型的服务器,添加对应的 Handler,Remote 等等。
- config 子目录:game-server 下 config 包括了游戏服务器的所有配置信息。配置信息以 JSON 文件的格式进行定义,包含有日志、master、server 等服务器的配置信息。该目录还可以进行扩展,对数据库配置信息、地图信息和数值表等信息进行定义。总而言之,这里是放着所有游戏服务器相关的配置信息的地方。
- logs 子目录:日志是项目中不可或缺的,可以对项目的运行情况进行很好的备份,也是系统运维的参考数据之一,logs 存放了游戏服务器所有的日志信息。
- shared:shared 存放一些前后端、game-server 与 web-server 共用代码,由于都是 javascript 代码,那么对于一些工具或者算法代码,就可以前后端共用,极大地提高了代码重用性。
- web-server:web-server 是用 express 3.x 框架搭建的 web 服务器,以文件 app.js 作为入口,当然开发者可以选择 Nginx 等其他 web 服务器。如果游戏的客户端不是 web 的话,如 Android 平台的话,这个目录就不是必须的了。当然,在这个例子中,我们的客户端是 web,所以 web 服务器还是必须的。
启动项目
对于我们这个例子来说,由于客户端是web,所以必须启动 game-server (游戏服务器) 和 web-server (web服务器)。启动 game-server 服务器:
开发调试环境启动:pomelo start -e development -D
sleep 3s
pomelo list
正式运营环境启动:
pomelo start -e production -D
sleep 3s
pomelo list
启动 web-server 服务器:
直接启动:cd web-server
node app
forever 启动:
cd web-server
forever start app.js
在启动过程中可能会有端口号冲突导致启动不成功,只需在 config 里面修改使用的端口号即可。如果上面的启动都没有问题的话,我们就可以对我们的 HelloWorld 进行测试了。用浏览器(推荐使用 chrome)访问 http://localhost:3001 或者 http://127.0.0.1:3001 即可, 点击 Test Game Server,提示 game server is ok 说明运行成功,如下图所示:

查看服务器
可以使用pomelo list查看已经启动的服务器,如下图所示:
服务器状态可以查看5种状态信息:
- serverId:服务器的 serverId,同 config 配置表中的 id
- serverType:服务器的 serverType,同 config 配置表中的 type
- pid:服务器对应的进程 pid
- heapUsed:该服务器已经使用的堆大小(单位:兆)
- uptime:该服务器启动时长(单位:分钟)
关闭项目
可以使用以下两种方式关闭项目:cd game-server
pomelo stop
或者
cd game-server
pomelo kill
pomelo stop 比较优雅,建议正式运营使用。pomelo kill 比较粗暴,安全性低,开发环境下可以使用,运营环境慎用。更详细的 pomelo 命令行用法请参阅 pomelo 命令行工具使用。