connector
pomelo是按约定来编程的,是微内核+插件实现方式。按照网络服务器流程,首先需要监听、绑定主机和端口,才有连接进来,连接建立后才有数据收发和编码解码。
connector是Pomelo的一个组件,俗称前端服务器。connector的网络处理是基于事件的,这也符合node.js的设计。connector是一个component,根据pomelo约定,component有start/afterStart/sop等调用,进行生命周期管理。
connector接收客户端的连接请求,创建与客户端的连接,维护客户端的session会话信息。connector接收客户端对后端服务器的请求,按照用户配置的路由策略,将请求路由给具体的后端服务器。当后端服务器处理完请求或需要给客户端推送消息的时候,connector同样会扮演一个中间角色,完成对客户端的消息发送。connector会同时拥有clientPort和port,其中clientPort是用来监听客户端的连接,port端口用来给后端提供服务。
由此可见,connector组件在pomelo中主要提供的功能:
为什么要使用connector呢?
pomelo的核心思想是分布式,将前端服务器connector组件和后端服务器server组件分开,connector只负责连接,server只负责请求的处理。这样分离后带来的优势:
前端服务器可以在数量上、连接方式上任意拓展。后端服务器由于只根据输入提供输出,使用场景也不仅限于connector上。
由于前后端服务器在不同的进程之间,当对后端服务器进行更新时,即使是重启进程也不会影响客户端连接。
恰当的分配前后端服务器可以实现逻辑上对用户分区而非物理上分区。
如何配置connector呢?
只需在servers.json
文件中定义connector
的clientPort
客户端端口和frontend
选项。
$ vim game-server/config/servers.json
"connector": [
{"id": "connector-server-1", "host": "127.0.0.1", "port": 3050, "clientPort": 3090, "frontend": true, "args":"--inspect=9002"},
{"id": "connector-server-2", "host": "127.0.0.1", "port": 3051, "clientPort": 3091, "frontend": true, "args":"--inspect=9003"}
]
然后在app.js
入口程序中配置connector的类型,pomelo启动时就会加载配置中的前端服务器。
$ vim game-server/app.js
app.configure('production|development', 'connector', () => {
app.set('connectorConfig',{
connector: pomelo.connectors.hybridconnector,
heartbeat: 10,
useDict: true,
useProtobuf: true,
});
});
connector组件流程分析,以hybirdconnector为例:
pomelo的connector负责接收外部连接,同时做协议的编码解码,接收的时候解码,发送的时候编码。如果有对消息进行加密的话,也是在connector中处理的,如果有unicode还需转换为utf8。
connector与其它组件的交互:
connector依赖connection/server/pushScheduler/session组件,它是很重量级的。
connector支持的通信协议
在客户端通信时pomelo提供了hybirdconnector和sioconnector,hybirdconnector支持TCP、WebSocket,sioconnector支持socket.io。实际编程中,可使用pomelo提供的接口自定义connector。
connector | 类 | 协议 | 通信 | 适用范围 |
---|---|---|---|---|
hybirdconnector | pomelo.connectors.hybirdconnector | TCP、WebSocket | 使用二进制通信 | 移动端 |
sioconnector | pomelo.connectors.sioconnector | socket.io | 使用JSON通信 | PC端 |
udpconnector | pomelo.connectors.udpconnector | UDP | 二进制协议 | 网路环境差数据包小的环境 |
mqttconnector | pomelo.connectors.mqttconnector | MQTT | 二进制物联网协议 | 嵌入式设备 |
pomelo内部有各种协议的实现,典型的有protobuf、mqtt。