前言&介绍

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

 Nodejs学习笔记(十六)--- Pomelo介绍&入门

 说明: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之后,开始创建项目并安装依赖项

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]

Nodejs学习笔记(十六)--- Pomelo介绍&入门

  这是让你选择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

 项目创建完成后,目录如下图

Nodejs学习笔记(十六)--- Pomelo介绍&入门

  项目结构说明

  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

    启动命令执行成功后,出现如下图错误提示

Nodejs学习笔记(十六)--- Pomelo介绍&入门

[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

 启动后如下图

Nodejs学习笔记(十六)--- Pomelo介绍&入门

  会发些有一些提示,这是express写法问题,可以打开web-server根目录下app.js,按如下修改

//var app = express.createServer();  注释掉这一行代码,替换为下面这一行代码
var app = express();

 再启动时无express用法提示^_^!

 2.打开http://localhost:3001

Nodejs学习笔记(十六)--- Pomelo介绍&入门

 如上图,点击“Test Game Server”按钮,提示“game server is ok.”,则此项目game-server可用^_^!

聊天服务器

 上面大体了解了pomelo,要入门还是以一个聊天服务器为入门示例最好,其它逻辑相对简单,入门学习不会因其它游戏逻辑影响。

 官方有个非常好的示例:https://github.com/NetEase/chatofpomelo  官方也有很多说明

 网上也有很多文章分析讲解这项目,我就不完全解释些项目了,接下来我就在上面新建的好的“PomeloDemo”的基础上改成一个聊天服务器

 1.新建gate和chat服务器

  在app/servers目录下新建gate和chat服务器,新建好后目录如下

 Nodejs学习笔记(十六)--- Pomelo介绍&入门

 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

 

 2.配置master.json

{
  "development": {
    "id": "master-server-1", "host": "127.0.0.1", "port": 15005
  },
  "production": {
    "id": "master-server-1", "host": "127.0.0.1", "port": 15005
  }
}
master.json

 

  3.配置servers.json

  打开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}
        ]
  }
}
servers.json

相关文章:

  • 2021-12-12
  • 2021-06-28
  • 2021-12-05
  • 2021-06-09
  • 2022-01-16
  • 2021-09-06
  • 2022-12-23
  • 2022-01-15
猜你喜欢
  • 2022-03-05
  • 2021-10-20
  • 2022-01-25
  • 2021-07-17
  • 2022-02-03
  • 2021-12-11
相关资源
相似解决方案