前言&介绍
Pomelo:一个快速、可扩展、Node.js分布式游戏服务器框架
从三四年前接触Node.js开始就接触到了Pomelo,从Pomelo最初的版本到现在,总的来说网易出品还算不错,但是发展不算快;用它做过一些项目和小游戏表现还不错。
用它的主要好处:
1. 入门简单,有比较丰富的文档和示例(虽然现在看版本也比较老了,但是入门没什么问题)
2.分布式多进程且扩展简单(单进程多线程,每个服务器都是一个Node进程,通过配置文件就可以管理集群)
3.可以不去关注底层和网络相关逻辑,聚焦业务逻辑的处理,对于有Web服务器开发经验却没有游戏服务器开发经验来说还是比较友好的
4.提供了很多工具和客户端支持(像IOS、Android & Java、Javascript、C、Cocos2d-x、U3D等)
......
入门参考链接
https://github.com/NetEase/pomelo/wiki/Home-in-Chinese
其它链接:
https://github.com/NetEase/pomelo
https://www.npmjs.com/package/pomelo
安装Pomelo
安装要求
Windows下安装要求环境
Python (2.5 < 版本 < 3)
VC++编译器
PS: Windows新环境自已检查一下,我本机环境已经装好python2.7,Visaul Studio也安装了所以也有VC++编译器
其它操作系统应该问题不大
官方安装介绍文档:https://github.com/NetEase/pomelo/wiki/%E5%AE%89%E8%A3%85pomelo
全局安装Pomelo
npm install pomelo -g
安装成功后如下图,可以看到现在最新版本为2.2.5
说明:Pomelo光是安装可能出现各种失败
1. 回头去检查一下,Python和VC++编辑器是否有问题
2.如果以前全局安装过Pomelo,最好删除掉 “C:\Users\当前用户\AppData\Roaming\npm\node_modules”目录下Pomelo文件夹和“C:\Users\当前用户\AppData\Roaming\npm-cache”目录下Pomelo开头的文件夹
3.如果并不报错,npm卡住不动,多数是网络原因,重复多安几次;或者打开FQ工具试试;也可以用淘宝镜像 cnpm 安装
创建项目并启动
pomelo init 项目名
执行创建项目命令后,出现如下图选择项(Please select underly connector, 1 for websocket(native socket), 2 for socket.io, 3 for wss, 4 for socket.io(wss), 5 for udp, 6 for mqtt: [1])
这是让你选择connector的协议,除了5 for udp,其它都是长连接,我们接下来选择 2 for socket.io
在上图cmd中输入2,并回车,选择socket.io继续安装
这里connector协议可以通过app.js配置进行修改// app configuration
app.configure('production|development', 'connector', function(){
app.set('connectorConfig',
{
connector : pomelo.connectors.sioconnector,
...
});
});
成功后,转到项目根目录,执行安装项目执行 npm-install.bat 依赖项 (其它平台执行npm-install.sh)
cd 项目目录
npm-install.bat
项目创建完成后,目录如下图
game-server : 游戏服务器,所有游戏服务器功能和逻辑都在此目录下
game-server/app.js:入口文件
game-server/app: 存放游戏逻辑和功能相关代码都这个子目录下,servers目录下可以新建多个目录来创建不同类型的服务器,在pomelo中,使用路径来区分服务器类型
game-server/config:存放游戏服务器配置文件目录,像日志、服务器、数据库等几乎所有配置文件都可以存放到此目录下
game-server/logs:日志目录,存放游戏服务器所有日志文件
web-server: web服务器(如果你是个H5游戏,这里就是Web客户端,如果是IOS、Andriod客户端,这目录就没什么用)
shared:公共代码存放处,这里要以放一些共用代码
启动game-server
cd game-server
pomelo start
启动命令执行成功后,出现如下图错误提示
[2017-11-23 11:54:42.226] [ERROR] console - Option path is not valid. Please refer to the README. [2017-11-23 11:54:42.226] [ERROR] console - Option close timeout is not valid. Please refer to the README. [2017-11-23 11:54:42.226] [ERROR] console - Option heartbeats is not valid. Please refer to the README. [2017-11-23 11:54:42.226] [ERROR] console - Option log level is not valid. Please refer to the README.
问题原因和解决方式
原因:新版的socket.io用法不正确的导致的,官方早已修复,就是没有publish到npm包中
修复方式:把node_modules目录下的pomelo中sioconnector.js(../game-server/node_modules/pomelo/lib/connectors/sioconnector.js)
替换为 https://github.com/NetEase/pomelo/blob/master/lib/connectors/sioconnector.js
替换后再启动game-server,就没有这些错误提示了^_^!
1.启动web-server
cd web-server
node app
启动后如下图
会发些有一些提示,这是express写法问题,可以打开web-server根目录下app.js,按如下修改
//var app = express.createServer(); 注释掉这一行代码,替换为下面这一行代码 var app = express();
再启动时无express用法提示^_^!
2.打开http://localhost:3001
如上图,点击“Test Game Server”按钮,提示“game server is ok.”,则此项目game-server可用^_^!
聊天服务器
上面大体了解了pomelo,要入门还是以一个聊天服务器为入门示例最好,其它逻辑相对简单,入门学习不会因其它游戏逻辑影响。
官方有个非常好的示例:https://github.com/NetEase/chatofpomelo 官方也有很多说明
网上也有很多文章分析讲解这项目,我就不完全解释些项目了,接下来我就在上面新建的好的“PomeloDemo”的基础上改成一个聊天服务器
在app/servers目录下新建gate和chat服务器,新建好后目录如下
gate服务器:
在一般情况下用户量一台机器就可以支撑,但用户量多了就得扩充服务器,gate服务器的作用就相当于前端负载均衡服务器;
客户端向gate服务器发出请求,gate服务器会给客户端分配一个connector服务器;
分配策略是根据客户端的某一个key做hash得到connector的id,这样就可以实现各个connector服务器的负载均衡。这个一会儿会实现
connector服务器:
接受客户端请求,并将其路由到chat服务器,以及维护客户端的链接;
同时,接收客户端对后端服务器的请求,按照用户配置的路由策略,将请求路由给具体的后端服务器。当后端服务器处理完请求或者需要给客户端推送消息的时候,connector服务器同样会扮演一个中间角色,完成对客户端的消息发送;
connector服务器会同时拥有clientPort和port,其中clientPort用来监听客户端的连接,port端口用来给后端提供服务;
chat服务器:
handler和remote决定了服务器的行为;
handler接收用户发送过来的send请求,remote由connector RPC发起远程调用时调用;
在remote里由于涉及到用户的加入和退出,所以会有对channel的操作。
其实也可以提前了解一些Pomelo中的术语,不分别解释,可以提前看看:https://github.com/NetEase/pomelo/wiki/%E6%9C%AF%E8%AF%AD%E8%A7%A3%E9%87%8A
{
"development": {
"id": "master-server-1", "host": "127.0.0.1", "port": 15005
},
"production": {
"id": "master-server-1", "host": "127.0.0.1", "port": 15005
}
}
打开config目录下servers.json文件,配置好各种 type 的服务器,配置如下
{
"development":{
"connector":[
{"id":"connector-server-1", "host":"127.0.0.1", "port":14050, "clientPort": 13050, "frontend": true},
{"id":"connector-server-2", "host":"127.0.0.1", "port":14051, "clientPort": 13051, "frontend": true},
{"id":"connector-server-3", "host":"127.0.0.1", "port":14052, "clientPort": 13052, "frontend": true}
],
"chat":[
{"id":"chat-server-1", "host":"127.0.0.1", "port":16050},
{"id":"chat-server-2", "host":"127.0.0.1", "port":16051},
{"id":"chat-server-3", "host":"127.0.0.1", "port":16052}
],
"gate":[
{"id": "gate-server-1", "host": "127.0.0.1", "clientPort": 15014, "frontend": true}
]
},
"production":{
"connector":[
{"id":"connector-server-1", "host":"127.0.0.1", "port":14050, "clientPort": 13050, "frontend": true},
{"id":"connector-server-2", "host":"127.0.0.1", "port":14051, "clientPort": 13051, "frontend": true},
{"id":"connector-server-3", "host":"127.0.0.1", "port":14052, "clientPort": 13052, "frontend": true}
],
"chat":[
{"id":"chat-server-1", "host":"127.0.0.1", "port":16050},
{"id":"chat-server-2", "host":"127.0.0.1", "port":16051},
{"id":"chat-server-3", "host":"127.0.0.1", "port":16052}
],
"gate":[
{"id": "gate-server-1", "host": "127.0.0.1", "clientPort": 15014, "frontend": true}
]
}
}