webim-plugin主要分为基于GatewayWorker开发的即时通讯组件和基于webserver开发的接口服务。
即时通讯组件主要用于和前端建立websocket连接,实现基于websocket的实时通信。
webserver主要用于提供im的相关html页面及ajax接口。
## **GatewayWorker**
GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等
GatewayWorker使用经典的Gateway和Worker进程模型。Gateway进程负责维持客户端连接,并转发客户端的数据给BusinessWorker进程处理,BusinessWorker进程负责处理实际的业务逻辑(默认调用Events.php处理业务),并将结果推送给对应的客户端。Gateway服务和BusinessWorker服务可以分开部署在不同的服务器上,实现分布式集群。
GatewayWorker提供非常方便的API,可以全局广播数据、可以向某个群体广播数据、也可以向某个特定客户端推送数据。配合Workerman的定时器,也可以定时推送数据。
## **webserver**
webserver是笔者为了本项目而开发的基于workerman-WebServer的轻量小型web框架,本框架主要特点就是小,只有控制器和view无繁琐的model层和路由等。集成了web所需要的基本功能配置、文件上传、调试模式、日志记录、模板渲染输出(基于smarty模板)、数据库基本操作(集成的think-orm)。
# **原理**
了解系统原理前先了解下GatewayWorker工作原理
GatewayWorker主要包含Register、Gateway、BusinessWorker三个进程
1、Register、Gateway、BusinessWorker进程启动
2、Gateway、BusinessWorker进程启动后向Register服务进程发起长连接注册自己
3、Register服务收到Gateway的注册后,把所有Gateway的通讯地址保存在内存中
4、Register服务收到BusinessWorker的注册后,把内存中所有的Gateway的通讯地址发给BusinessWorker
5、BusinessWorker进程得到所有的Gateway内部通讯地址后尝试连接Gateway
6、如果运行过程中有新的Gateway服务注册到Register(一般是分布式部署加机器),则将新的Gateway内部通讯地址列表将广播给所有BusinessWorker,BusinessWorker收到后建立连接
7、如果有Gateway下线,则Register服务会收到通知,会将对应的内部通讯地址删除,然后广播新的内部通讯地址列表给所有BusinessWorker,BusinessWorker不再连接下线的Gateway
8、至此Gateway与BusinessWorker通过Register已经建立起长连接
9、客户端的事件及数据全部由Gateway转发给BusinessWorker处理,BusinessWorker默认调用Events.php中的onConnect onMessage onClose处理业务逻辑。
10、BusinessWorker的业务逻辑入口全部在Events.php中,包括onWorkerStart进程启动事件(进程事件)、onConnect连接事件(客户端事件)、onMessage消息事件(客户端事件)、onClose连接关闭事件(客户端事件)、onWorkerStop进程退出事件(进程事件)
Gateway/Worker 的进程模型
![](https://box.kancloud.cn/a5c81ae8cc6cb919c1e63bad744e8ab4_800x400.png)
# **webim-plugin原理**
本系统在GatewayWorker基础上多了一个webserver进程用于处理ajax接口和web页面。所以本系统含有四个进程
1、Register进程用户接收Gateway、BusinessWorker进程的注册信息协助Gateway和BusinessWorker之间建立长连接
2、Gateway进程监听websocket协议与客户端建立长连接将用户数据转给BusinessWorker进程并负责将BusinessWorker进程的数据转发给客户端
3、BusinessWorker进程接收通过Gateway转发来的数据,进行逻辑处理后再通过Gateway转发给客户端。
4、webserver监听http协议用于提供web服务,主要做一些web网站处理和ajax接口。
各个进程之间都通过长连接通信,所有进程都可以分别部署在不同服务器上,并且Gateway和BusinessWorker服务器都可以增加多台处理即时通讯逻辑。一般的分布式方案为遇到瓶颈时增加BusinessWorker服务器。Gateway进程只负责网络IO一般不需要部署多台(如有必要也可部署多台,不过前端websocket地址需要自定义动态分发)。
### **数据库方面**
webim-plugin用mysql存储聊天信息redis存储缓存信息和连接凭证token,对接已有网站时需要在已有网站暴露一个token接口,webim-plugin在建立socket连接前会请求此接口,此接口需要生成并在redis中按照要求写入token信息,然后将token返回,webim-plugin会根据此token去对应用户信息。