Pomelo(柚子)是基于Node.js的高性能分布式游戏服务框架,它包含基础的开发框架和相关的扩展组件(库和工具包)。Pomelo不但适用于游戏服务器开发也可以用于开发高实时的Web应用,它的分布式架构使Pomelo比普通实时Web框架性能更好。
安装配置
环境准备
- 操作系统 Windows10
- Python版本:2.5~3.0
- Visual Studio2010
全局安装框架
$ npm i -g pomelo
查看帮助
$ pomelo -h
用法: pomelo [选项] [命令]
命令:
init [path] 创建一个新的应用
start [options] 开启应用
list [options] 列出所有的服务器
add [options] 添加一个新的服务器
stop [options] 关闭服务器,多个服务器可使用 `pomelo stop server-id-1 server-id-2`
kill [options] 杀死应用
restart [options] 重启服务器,多个服务器可使用`pomelo restart server-id-1 server-id-2`
masterha [options] 开启主从模式下所有的从服务器
*
选项:
-h, --help 输出用法信息
-V, --version 输出版本号
创建项目
$ cd workspace
$ pomelo init ./test
默认管理员用户:
账户: admin
密码: admin
可编辑adminUser.json文件配置管理员用户
请选择底层连接器: 1 websocket(原生 socket), 2 socket.io, 3 wss, 4 socket.io(wss), 5 udp, 6 mqtt: [1]
执行init
初始化命令时需选择网络连接方式
启动服务
$ pomelo start -h
Usage: start [options]
Options:
-h, --help output usage information
-e, --env <env> the used environment
-D, --daemon enable the daemon start
-d, --directory, <directory> the code directory
-t, --type <server-type>, start server type
-i, --id <server-id> start server id
选择环境选项启动
$ pomelo start -e development | production
以守护进程方式启动
$ pomelo start -D
例如:以服务配置config/server.json
中配置项为localhost
的选项启动服务
$ pomelo start -e localhost
(node:34640) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
[2022-01-09 12:26:21.130] [INFO] console - mongodb://127.0.0.1:27017/test
[2022-01-09 12:26:21.133] [INFO] console - serverType: master
[2022-01-09 12:26:21.303] [INFO] console - registerAdmin: test
出现警告提示
(node:34640) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
使用forever start
来进行node
进程守护程序异常,问题原因 node 版本过高,解决办法使用nvm切换node版本。
$ node -v
v14.0.0
$ nvm list
16.13.0
16.0.0
15.0.0
* 14.0.0 (Currently using 64-bit executable)
10.19.0
$ nvm current
v14.0.0
$ nvm use 10.19.0
Now using node v10.19.0 (64-bit)
$ nvm current
v10.19.0
$ pomelo start -e localhost
启动后没输出,查看日志出现错误。
domain ReferenceError: TextEncoder is not defined
在node中引入mongoose, 已经安装了mongoose包的的情况下, node版本太低导致的。使用node --version命令查看当前的node版本。
查看版本支持
$ nvm list available
这里使用12.0.0,安装若失败则重新卸载后再次安装。
$ nvm install 12.0.0
$ nvm use 12.0.0
$ nvm current
$ node -v
'npm' 不是内部或外部命令,也不是可运行的程序或批处理文件。
$ node uninstall 12.0.0
修改源
$ vim nvm/settings.txt
root: D:\Node\NVM
path: D:\Node\NodeJS
node_mirror: https://npm.taobao.org/mirrors/node/
npm_mirror: https://npm.taobao.org/mirrors/npm/
重新启动查看异常日志
domain TypeError: Cannot read property 'collection' of undefined
项目目录结构
目录文件 | 描述 |
---|---|
game-server | 游戏服务器,以app.js文件为入口。 |
shared | 前后端、游戏服、Web服共用代码 |
web-server | Web服务器,Express框架搭建,以app.js为入口。 |
游戏服目录
目录 | 描述 |
---|---|
game-server/app | 游戏服应用开发目录,实现不同类型的服务器,添加对应Handler和Remote等。 |
game-server/config/ | 游戏服配置文件目录,配置文件以JSON格式定义。 |
game-server/logs/ | 游戏服日志目录 |
game-server/app.js | 游戏服入口文件 |
游戏配置文件
配置文件 | 描述 |
---|---|
adminServer.json | 服务器类型,若新增服务器类型则需配置token信息,否则显示注册服务器到master失败。 |
servers.json | 服务器配置文件 |
adminServer.json 文件中的tokan用于将指定类型的服务器注册到master服务器进行统一管理,token可以自定义,或者生成一个足够长的字符串即可,甚至可以多个服务端公用一个token,主要取决于对项目安全性的要求。
Web服目录
目录文件 | 描述 |
---|---|
web-server/bin/ | Web服应用保存目录 |
web-server/public/ | Web服静态文件保存路径 |
web-server/app.js | Web服入口文件 |
安装项目依赖
$ cd test
$ npm-install.bat
安装脚本执行的步骤
$ cd ./game-server && npm install -d
$ cd ./web-server && npm install -d
启动项目
启动项目必须分别启动游戏服和Web服
启动游戏服务器
$ cd game-server && pomelo start
启动命令
$ pomelo start [development|product] [--daemon]
命令参数 | 描述 |
---|---|
development | 默认,开发模式 |
product | 产品环境 |
--deamon | 后台运行 |
后台运行模式--daemon需forever模块支持
$ npm i -g forever
项目应用启动命令
$ pomelo start -h
用法: start [选项]
选项:
-h, --help 输出用法信息
-e, --env <env> 指定环境
-D, --daemon 以后台守护进程模式启动
-d, --directory, <directory> 指定代码目录
-t, --type <server-type>, 指定服务器类型启动
-i, --id <server-id> 指定服务器ID启动
启动报错
$ pomelo start
(node:25972) Warning: Accessing non-existent property 'padLevels' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
错误原因:Node.js版本过高
$ node -v
v16.13.0
$ pomelo --version
2.2.7
Windows安装NVM
启动Web服务器
$ cd web-server && node app
访问Web服:http://127.0.0.1:3001
查看游戏服务器状态
$ cd test
$ pomelo list
try to connect 127.0.0.1:3005
serverId serverType pid rss(M) heapTotal(M) heapUsed(M) uptime(m)
connector-server-1 connector 8288 37.84 21.83 17.02 5.48
master-server-1 master 22696 35.04 19.83 14.88 5.48
游戏服务器状态信息
字段 | 含义 |
---|---|
serverId | 服务器编号,从config配置表中的ID。 |
serverType | 服务器类型,同config配置表中的type。 |
pid | 服务器对应的进程PID |
rss | - |
heapTotal | 服务器使用堆内存总大小,单位MB。 |
heapUserd | 服务器已使用堆内存大小,单位为兆(MB)。 |
uptime | 服务器启动时长,单位为分钟。 |
关闭项目
$ pomelo stop --help
用法: stop [选项]
选项:
-h, --help 打印输出用法信息
-u, --username <username> 管理员用户的名称
-p, --password <password> 管理员用户的密码
-h, --host <master-host> 主服务器主机地址
-P, --port <master-port> 主服务器端口地址
管理员用户的账号密码保存位置
$ vim game-server/config/adminUser.json
[
{
"id": "user-1",
"username": "admin",
"password": "admin",
"level": 1
},
{
"id": "user-2",
"username": "monitor",
"password": "monitor",
"level": 2
},
{
"id": "user-3",
"username": "test",
"password": "test",
"level": 2
}
]
主服务器配置信息位置
$ vim game-server/config/master.json
{
"development": {
"id": "master-server-1", "host": "127.0.0.1", "port": 3005
},
"production": {
"id": "master-server-1", "host": "127.0.0.1", "port": 3005
}
}
关闭指定ID的服务器
$ cd game-server
$ pomelo stop [id]
pomelo stop
优雅地关闭各个服务器
- 前端服务器首先断开连接,阻止新玩家进入游戏,用户体验好。
- 各个服务器按顺序关闭自身的功能,保证游戏逻辑正常。
- 玩家状态等信息及时写入数据库,保证数据完整性。
pomelo stop id
会关闭指定ID的服务器,关闭特定服务器会导致服务器状态信息等丢失,建议先做好服务器状态信息的维护和备份。
杀死进程
$ cd test
$ pomelo kill [--force]
pomelo kill
会直接杀死项目进程,做法比较粗暴,安全性低,开发环境下可以使用,产品环境慎用。若有残留进程杀不干净,可添加--force
参数。
动态添加服务器
$ cd test
$ pomelo add host=[host] port=[port] id=[id] serverType=[serverType]
目前只支持后端服务器的动态添加
交互式命令行 pomelo-cli
pomelo-cli交互式命令行可以对使用Pomelo框架开发的应用和服务进行运维。
安装
$ npm i -g pomelo
主机端口
$ vim game-server/config/master.json
{
"development": {
"id": "master-server-1", "host": "127.0.0.1", "port": 3005
},
"production": {
"id": "master-server-1", "host": "127.0.0.1", "port": 3005
}
}
账户密码
$ vim game-server/config/adminUser.json
[
{
"id": "user-1",
"username": "admin",
"password": "admin",
"level": 1
},
{
"id": "user-2",
"username": "monitor",
"password": "monitor",
"level": 2
},
{
"id": "user-3",
"username": "test",
"password": "test",
"level": 2
}
]
连接到master管理主机
$ pomelo-cli -h 127.0.0.1 -P 3005 -u monitor -p monitor
try to connect 127.0.0.1:3005
.______ ______ .___ ___. _______ __ ______
| _ ) ( __ ) | \/ | | ____| | | ( __ )
| |_) ) | | | | | \ / | | |__ | | | | | |
| ___) | | | | | \/ | | __| | | | | | |
| | | `--' | | | | | | |____ | `----. | `--' |
| _| (______) |__| |__| |_______| |_______| (______)
Welcome to Pomelo interactive client.
Pomelo is a fast, scalable game server framework for node.js.
Type 'help' for more information.
monitor@pomelo : all>
显示所有服务
monitor@pomelo: all> show servers
serverId serverType host port pid heapUsed(M) uptime(m)
chat-server-1 chat 127.0.0.1 5050 764 15.98 1.24
chat-server-2 chat 127.0.0.1 5051 15484 15.99 1.24
chat-server-3 chat 127.0.0.1 5052 28352 15.98 1.24
connector-server-1 connector 127.0.0.1 4050 2284 17.33 1.24
connector-server-2 connector 127.0.0.1 4051 8224 17.34 1.24
connector-server-3 connector 127.0.0.1 4052 9732 17.33 1.24
gate-server-1 gate 127.0.0.1 null 19212 18.70 1.24
master-server-1 master 127.0.0.1 3005 15364 15.85 1.24
切换服务
monitor@pomelo: all> use connector-server-1
switch to server: connector-server-1
显示登录人数
monitor@pomelo: all> show logins
no user logined in this connector
管理控制器
$ apt-get install sysstat
$ git clone https://github.com/NetEase/pomelo-admin-web.git
$ cd pomelo-admin-web
$ npm i -d
$ node app
$ vim config/admin.json
{
"host": "localhost",
"port": 3005,
"username": "monitor",
"password": "monitor"
}
Chrome浏览器访问:http://127.0.0.1:7001