技术文章 > 服务端 > pomelo 使用教程 > Chat源码下载与安装 

Chat源码下载与安装

在这一部分,我们来实现一个简易的分布式聊天应用,为了简单化,我们将直接从 github 上获取对应的源码,当然你也可以首先 pomelo init,获得一个初始的项目目录,然后参照 github 上的源码,建立相应的目录,在默认的位置填充相应的源码。

源码结构

源码在github上面,通过如下命令,获得:
$ git clone https://github.com/NetEase/chatofpomelo-websocket.git
$ git checkout tutorial-starter
这个是很简单的应用,其代码结构如下图:


game-server

game-server 目录放的是所有游戏服务器的逻辑,以文件 app.js 作为入口,运行游戏的所有逻辑和功能。从图上可以看出其 servers 里面有三个目录,分别是 gate,connector,chat。在 pomelo 中,使用路径来区分服务器类型,因此三个目录代表了三种不同类型的服务器,每一个目录下面可以定义 handler、remote,定义了 handler 和 remote 就决定了这个服务器的行为。 game-server 的子目录 config 下面是游戏服务器所用到的配置文件存放的地方,配置信息使用 JSON 格式,包含有日志、master 服务器和其他服务器的配置信息。除了这个 pomelo 所需的配置信息外,一般情况下,也将游戏逻辑所需要的配置信息放到这个目录下,例如数据库的配置信息,地图信息等。
logs 子目录下存放游戏服务器产生的所有的日志信息。

web-server

由于我们这个聊天应用的客户端是 web,所以需要一个 web 服务器。在这个目录下,主要是客户端的 js,css 和静态资源等等。在本例子中,里面有用户登录、聊天的逻辑的 js 文件等等。我们在这个例子教程中,更多地关注的是服务器端的逻辑以及功能,对于客户端,我们几乎不需要怎么修改其代码,直接使用默认就好。

安装及运行

首先,确保你已经成功安装了 sex-pomelo。执行命令安装依赖:
$ sh npm-install.sh
启动游戏服务器:
$ cd game-server
$ pomelo start
启动 web 服务器:
$ cd web-server
$ node app.js
如果启动过程中没有问题的话,下面我们就可以使用我们的聊天服务了,打开浏览器,输入http://127.0.0.1:3001/index.html, 输入一个用户名和一个房间名,就可以加入到聊天中了。可以多开几个客户端实例,测试 chat 是否能正常地运行,可以在一个房间里广播,也可以单个给某一个人发消息,效果图如下:

chat 分析

我们要搭建的 pomelo 聊天室具有如下的运行架构:

在这个架构里,前端服务器也就是 connector 专门负责承载连接, 后端的聊天服务器则是处理具体逻辑的地方。 这样扩展的运行架构具有如下优势:

客户端

聊天室的逻辑包括以下几个部分: 客户端首先要给 gate 服务器查询一个 connector 服务器,gate 给其回复一个 connector 的地址及端口号,这里没有列出完整的代码,具体的代码在路径 web-server/public/js/client.js 中,详细代码略去,见 client.js:
function queryEntry(uid, callback) {
  var route = 'gate.gateHandler.queryEntry';
  // ...
}

$("#login").click(function() {
  username = $("#loginUser").attr("value");
  rid = $('#channelList').val();

  // ...

 //query entry of connection
  queryEntry(username, function(host, port) {
    pomelo.init({
      host: host,
      port: port,
      log: true
    }, function() {
              // ...
    });
  });
});
客户端在查询到 connector 后,需要发请求给 connector 服务器, 第一次请求要给 connector 进程,因为首次进入时需要绑定对应的 uid 信息,这里略去详细代码:
pomelo.request('connector.entryHandler.enter', {username: username, rid: rid}, function(){
  // ...
}); 
当用户发起聊天的时候,会请求服务 chat.chatHandler.send,大致代码如下:
pomelo.request('chat.chatHandler.send', {content:msg, from: username, target: msg.target}, function(data) {
  // ...
});
当有用户加入、离开以及发起聊天时,同房间的人将会收到服务端推送来的相应消息,这些在客户端是以回调的方式进行添加的,大致代码如下:

pomelo.on('onAdd', function(data) {
  // ...
});

pomelo.on('onLeave', function(data) {
  // ...
});

pomelo.on('onChat', function(data) {
  // ...
});
客户端的详细代码都在目录 web-server/public/js/client.js 文件中,这里,客户端的 js 是使用 component 进行管理的,详细请参阅 component 的参考文档。

服务端

我们知道,在 pomelo 中,只要定义了一个服务器的 handler 和 remote,那么就定义了这个服务器的行为,就决定了这个服务器的类型。在本例子中,有三种服务器:gate、connector、chat,它们完成的具体逻辑如下: 注意:在实现具体的 Handler 的时候,最后需要调用 next,其中 next 的签名为 next(err, resp)。如果没有出现错误,那么 err 为空即可;如果不是 request 请求,而是 notify 的话,也一样需要调用 next,此时 resp 参数是不需要的,一般情况下,如果没有错误的话,就直接使用 next(null) 即可。
服务器配置信息在 config 目录下,现在我们只关注 servers.json、master.json。master.json 配置是 master 服务器的配置信息,包括地址、端口号。servers.json 配置具体的应用服务器信息。在配置文件中,分为 development 和 production 两种环境,表示开发环境和产品环境,我们在 pomelo start 后面可以通过 -e 可以指定使用哪个环境,更多帮助参见 pomelo start --help。

小结

在这部分,我们下载了一个简单的聊天应用,并安装运行起来,并对其源码进行了分析。在本例子中,为了简单起见,我们对每一种类型仅仅配置一台服务器,其中对于前端服务器来说需要指定 frontend 为 true。下一步,我们将对每一种服务器类型配置多台服务器,以此来展示 pomelo 强大的可伸缩性。


来源:摘自 https://github.com/NetEase/pomelo/wiki/chat%E6%BA%90%E7%A0%81%E4%B8%8B%E8%BD%BD%E4%B8%8E%E5%AE%89%E8%A3%85,本站 行痴 整理