基本概念
1.1 why pomelo
环境
- 开源社区里充斥了数不清的web服务器框架,游戏客户端的框架和库也有一大堆,但唯独游戏服务器框架少之又少
- 商用的价格贵, 对部署的硬件成本也高。
特点
- 约定大于配置。开发方便。
- Node天然的分布式,启动快,占用资源少。
- 硬件几乎没要求。
1.2、服务器划分
前端服务器(frontend)的职责:
-
- 负责承载客户端请求的连接
- 维护session信息
- 把请求转发到后端
- 把后端需要广播的消息或响应发送到客户端
后端服务器(backend)的职责:
-
- 处理业务逻辑, 包括RPC和前端请求的逻辑
- 把消息推送回前端或者将对客户端请求的响应发送到前端服务器
请求流程
-
- 通过http短连接,gate服务器,获取长连接的分配地址。
两种分配方式:
- 房间号—同connector 服务器对应,或房间号取模分配。
- Uid取模分配。
-
- 同connector建立连接。
例如通过pomelo.request("connector.entryHandler.entry", "{msg:hello,uid:?....}", function(data) { alert(data.msg); }); 来建立长连接, 并发送一次sendmsg请求。
在第一调用的时候将会包含3次握手的过程
-
- 发送数据。
约定优于配置:
- pomelo.request("connector.entryHandler.entry") 请求的是connector 服务器的,entryHandle类的 entry 方法。
- pomelo.request("chat.chatHandler.send")是通过connector转发的请求 chat服务器的chatHandler的send方法。
-
- 服务端推送消息给客户端。
var param = {
msg: msg.content +"aaaaaa",
from: username,
target: msg.target
};
channel = channelService.getChannel(rid, false);
//the target is all users
if(msg.target == '*') {
channel.pushMessage('onChat', param);
}
这里onChate为路由,是给客服端用的。
传递协议
package格式
- type - package类型,1个byte,取值如下。
- 0x01: 客户端到服务器的握手请求以及服务器到客户端的握手响应
- 0x02: 客户端到服务器的握手ack
- 0x03: 心跳包
- 0x04: 数据包
- 0x05: 服务器主动断开连接通知
- length - body内容长度,3个byte的大端整数,因此最大的包长度为2^24个byte。
var index = 1;
var length = ((bytes[index+]) << 16 | (bytes[index]) << 8 | bytes[index+]) >>> 0;
body - 二进制的传输内容。
Message 格式
- 消息头分为三部分,flag,message id,route。如下图所示:
- Flag的解释见:
- https://github.com/NetEase/pomelo/wiki/%E5%8D%8F%E8%AE%AE%E6%A0%BC%E5%BC%8F
- 当msgid中一个字节的byte 数值<128时说明message id 结束。即碰到最高不是1的结束。
- route:
- 压缩路由占一个字节。
非压缩路由,第一个字节表示路由字符串长度
心跳协议
服务器可以配置心跳时间间隔。当握手结束后,客户端发起第一个心跳。服务器和客户端收到心跳包后,延迟心跳间隔的时间后再向对方发送一个心跳包。
心跳超时时间为2倍的心跳间隔时间。服务器检测到心跳超时并不会主动断开客户端的连接。客户端检测到心跳超时,可以根据策略选择是否要主动断开连接。
组件介绍
- 特殊的组件
- Session
- Localsession
- Channel
- Proxy
组件可以简单理解为绑定在app上的属性对象。
插件
- 1个插件可以包含多个组件,
- 插件是完全独立的。也可以绑定到event事件上。
- https://github.com/NetEase/pomelo/wiki/plugin%E6%96%87%E6%A1%A3
基本概念
1.1 why pomelo
环境
- 开源社区里充斥了数不清的web服务器框架,游戏客户端的框架和库也有一大堆,但唯独游戏服务器框架少之又少
- 商用的价格贵, 对部署的硬件成本也高。
特点
- 约定大于配置。开发方便。
- Node天然的分布式,启动快,占用资源少。
- 硬件几乎没要求。
1.2、服务器划分
前端服务器(frontend)的职责:
-
- 负责承载客户端请求的连接
- 维护session信息
- 把请求转发到后端
- 把后端需要广播的消息或响应发送到客户端
后端服务器(backend)的职责:
-
- 处理业务逻辑, 包括RPC和前端请求的逻辑
- 把消息推送回前端或者将对客户端请求的响应发送到前端服务器
请求流程
-
- 通过http短连接,gate服务器,获取长连接的分配地址。
两种分配方式:
- 房间号—同connector 服务器对应,或房间号取模分配。
- Uid取模分配。
-
- 同connector建立连接。
例如通过pomelo.request("connector.entryHandler.entry", "{msg:hello,uid:?....}", function(data) { alert(data.msg); }); 来建立长连接, 并发送一次sendmsg请求。
在第一调用的时候将会包含3次握手的过程
-
- 发送数据。
约定优于配置:
- pomelo.request("connector.entryHandler.entry") 请求的是connector 服务器的,entryHandle类的 entry 方法。
- pomelo.request("chat.chatHandler.send")是通过connector转发的请求 chat服务器的chatHandler的send方法。
-
- 服务端推送消息给客户端。
var param = {
msg: msg.content +"aaaaaa",
from: username,
target: msg.target
};
channel = channelService.getChannel(rid, false);
//the target is all users
if(msg.target == '*') {
channel.pushMessage('onChat', param);
}
这里onChate为路由,是给客服端用的。
传递协议
package格式
- type - package类型,1个byte,取值如下。
- 0x01: 客户端到服务器的握手请求以及服务器到客户端的握手响应
- 0x02: 客户端到服务器的握手ack
- 0x03: 心跳包
- 0x04: 数据包
- 0x05: 服务器主动断开连接通知
- length - body内容长度,3个byte的大端整数,因此最大的包长度为2^24个byte。
var index = 1;
var length = ((bytes[index+]) << 16 | (bytes[index]) << 8 | bytes[index+]) >>> 0;
body - 二进制的传输内容。
Message 格式
- 消息头分为三部分,flag,message id,route。如下图所示:
- Flag的解释见:
- https://github.com/NetEase/pomelo/wiki/%E5%8D%8F%E8%AE%AE%E6%A0%BC%E5%BC%8F
- 当msgid中一个字节的byte 数值<128时说明message id 结束。即碰到最高不是1的结束。
- route:
- 压缩路由占一个字节。
非压缩路由,第一个字节表示路由字符串长度
心跳协议
服务器可以配置心跳时间间隔。当握手结束后,客户端发起第一个心跳。服务器和客户端收到心跳包后,延迟心跳间隔的时间后再向对方发送一个心跳包。
心跳超时时间为2倍的心跳间隔时间。服务器检测到心跳超时并不会主动断开客户端的连接。客户端检测到心跳超时,可以根据策略选择是否要主动断开连接。
组件介绍
- 特殊的组件
- Session
- Localsession
- Channel
- Proxy
组件可以简单理解为绑定在app上的属性对象。
插件
- 1个插件可以包含多个组件,
- 插件是完全独立的。也可以绑定到event事件上。
- https://github.com/NetEase/pomelo/wiki/plugin%E6%96%87%E6%A1%A3