什么是GatewayWorker
GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等
GatewayWorker使用经典的Gateway和Worker进程模型。
Gateway进程负责维持客户端连接,并转发客户端的数据给BusinessWorker进程处理
BusinessWorker进程负责处理实际的业务逻辑(默认调用Events.php处理业务),并将结果推送给对应的客户端。
Gateway服务和BusinessWorker服务可以分开部署在不同的服务器上,实现分布式集群。
GatewayWorker提供非常方便的API,可以全局广播数据、可以向某个群体广播数据、也可以向某个特定客户端推送数据。配合Workerman的定时器,也可以定时推送数据。
GatewayWorker 与 Workerman的关系
Workerman可以看做是一个纯粹的socket类库,可以开发几乎所有的网络应用,不管是TCP的还是UDP的,长连接的还是短连接的。Workerman代码精简,功能强大,使用灵活,能够快速开发出各种网络应用。
同时Workerman相比GatewayWorker也更底层,需要开发者有一定的多进程编程经验。
因为绝大多数开发者的目标是基于Workerman开发TCP长连接应用,而长连接应用服务端有很多共同之处,例如它们有相同的进程模型以及单发、群发、广播等接口需求。所以才有了GatewayWorker框架,GatewayWorker是基于Workerman开发的一个TCP长连接框架,实现了单发、群送、广播等长连接必用的接口。GatewayWorker框架实现了Gateway Worker进程模型,天然支持分布式多服务器部署,扩容缩容非常方便,能够应对海量并发连接。可以说GatewayWorker是基于Workerman实现的一个更完善的专门用于实现TCP长连接的项目框架。
该使用GatewayWorker还是Workerman?
如果你的项目是长连接并且需要客户端与客户端之间通讯,建议使用GatewayWorker。
短连接或者不需要客户端与客户端之间通讯的项目建议使用Workerman。
GatewayWorker不支持UDP监听,所以UDP服务请选择Workerman。
如果你是一个有多进程socket编程经验的人,喜欢定制自己的进程模型,可以选择Workerman。
GatewayWorker特点
- 基于Workerman开发
- 基于Gateway、Worker进程模型
- 支持分布式部署(GatewayWorker和Workerman分开部署)
- 支持高并发(百万级,Gatewayworker集群可支持千万级)
- 支持全局广播或者向特定客户端推送数据
- 支持各种应用层协议(包括自定义协议)
- 支持对象或者资源永久保持
- 高性能(常驻内存,使用opcode缓存、不依赖nginx等容器,通信更高效)
- 集成方便(与其他web框架集成)
- 代码热更新
- 支持长连接
GatewayWorker工作原理
- Register、Gateway、BusinessWorker进程启动
- Gateway、BusinessWorker向Register服务进程发起长连接注册自己
- Register服务收到Gateway的注册后,把所有Gateway的通讯地址列表保存在内存中
- Register服务收到BusinessWorker的注册后,把内存中所有的Gateway的通讯地址列表发给BusinessWorker
- BusinessWorker进程得到所有的Gateway内部通讯地址列表后尝试连接Gateway
- 客户端的事件及数据全部由Gateway转发给BusinessWorker处理,BusinessWorker默认调用Events.php中的onConnect onMessage onClose处理业务逻辑

注意:Gateway和BusinessWorker都能分布式部署,注册到同一个Register即可。但是,Register只需要1台,因为Register负载很小,不会成为系统瓶颈;而且,Register即使单点故障,也不影响对外服务(建议适当增加监控)。
多人网络聊天系统案例:
Github: https://github.com/walkor/workerman-chat/
在线体验:http://chat.workerman.net/
主要文件说明:
Events.php 事件响应核心类
start_*.php 各种启动器(start_web.php启动web,提供对外http服务)

核心代码解读:
start_register.php
启动register(服务协议必须是text)

start_gateway.php
启动gateway,并绑定resigter地址

start_businessworker.php
启动businessworker,处理业务(BusinessWorker的默认eventHandler就是Events.php,翻查BusinessWorker.php源码即可发现)

Events.php
具体的业务处理类
新用户进入房间时,把该用户加入到房间,发送新的房间用户列表给全部用户,同时,向全部用户发送欢迎新用户加入的消息

了解更多关于gatewayworker: http://doc2.workerman.net/
与workerman类似的socket框架swoole:https://www.swoole.com/