1. pomelo简介: 

    网易在2012年11月开源的一个网游服务器框架,使用javascript作为开发语言,运行在node.js环境下。具体说明请查阅:https://github.com/NetEase/pomelo

    pomelo项目主页上已经有比较详细的文档说明,本文是我在阅读其源代码过程中对其整体架构整理出来的一点补充文档。欢迎对服务器架构有兴趣的同学对本文多提意见。

2. pomelo总体架构图

Android网络框架OKGo封装 项目使用_服务器架构

2.1 App Server规范:

每个文件一个模块,文件中的公开方法可被路由到, 包规范如下:

    > handler包:处理客户端请求,客户端连接上connector后可发起的request请求(与web的resquest/response类似,区别在此为长连接,且连接在connector服务器上)

    > remote包: 其它服务器发出的rpc调用处理逻辑

2.2 server种类:

    > 前端(webSocket): 配置中有wsPort

    > 后端(rpc): 配置中有port

    > master: master.json配置文件中指定(注: wsPort与port均有,但不属于前两者)

2.3 不同种类的服务器启动的组件:

    > 所有服务器: monitor

    > master服务器: 启动所有服务器及相应的监控/统计等服务

    > 非master服务器均会启动: 

        > server: 服务器对外服务接口(路由解释、转发、请求处理)

        > proxy: rpc客户端代理, 服务器帐号策略由app配置, 默认路由算法: server_index = Math.abs(crc32(uid) % sever_count)

        > channel: 为广播消息服务

    > 前端服务器:

        > connection: 统计用

        > connector: 客户端与服务器的直接连接, 可在加载connector组件时指定使用自己实现的connector,以选择合适的连接模式(tcp/websocket)或数据通信协议(例如protobuff)

        > session: session管理

    > rpc服务器: 

        > remote: rpc服务器组件

        > localSession: 由connector发送消息时copy过来的session数据 

3. pomelo依赖库

Android网络框架OKGo封装 项目使用_服务器_02

    async: 解决回调函数嵌套造成可读性差的问题

    stream-pkg: js对象序列化与反序列化

4. 简单总结

    关于connector: Pomelo虽然声明可使用自己实现的connector以更改接入服务的底层通信协议,但connector组件使用到的connector实现(默认为sioConnector与sioSocket)并未被抽象出来(即没有一个类似connector接口之类的声明)

    pomelo的服务器架构属于比较主流(connector与gate server+业务服务器),其"多进程胜于多线程"的思想有值得借鉴的地方。虽然代码量不大,但层次之间的耦合度较高,依赖很多,导致有些地方不直观。当然,这个也与js的代码风格有关。

    较为不直观的地方:

    > 服务器启动(master启动所有服务器)

    > rpc请求的路由

    > rpc服务代理

todo:  

    > connector部分协议抽象

    > rpc部分协议抽象

    > 服务进程监控与管理(monitor/admin)

    > session管理(session与localSession)