基于GatewayWorker框架的IM服务搭建

一、文档地址

1、GatewayWorker手册
2、GatewayWorker框架
3、GatewayWorker与TP等框架结合文档
4、配置Nginx支持wss
5、GatewayClient下载
6、创建wss服务

二、服务搭建

1、搭建GatewayWorker服务
     下载GatewayWorker框架解压到根目录,修改 GatewayWorker/Application/YourApp/ 目录下三个 'start_' 文件下注册地址一致,start_gateway.php的第24行Gateway括号内容修改为(“websocket://后面的不变”);其他设置如下:

     start_gateway.php和start_businessworker.php中的registerAddress地址格式为Register的IP:端口号,其中端口号为start_register.php中的监听端口(假设是1238)

     单机部署时,Register服务为本机ip 127.0.0.1,则start_gateway.php和start_businessworker.php中的registerAddress统一为'127.0.0.1:1238'

     分布式(集群)部署时,IP为实际Register服务部署的IP(分布式部署时只需要部署一台Register服务即可,假设是192.168.1.100),
则start_gateway.php和start_businessworker.php中的registerAddress统一为'192.168.1.100:1238'

2、Nginx 配置域名支持 ws/wss     ws/wss说明

-配置HTTP域名的位置加如下配置:

location /ws {
    proxy_pass http://127.0.0.1:8282; 
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

-配置HTTPS域名的位置加如下配置:

location /wss {
    proxy_pass http://127.0.0.1:8282; 
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

     proxy_pass 地址是 搭建GatewayWorker服务器IP地址、端口和gateway 进程(start_gateway.php文件)端口保持一致

3、客户端请求方式
-http方式请求

## js 为例
ws = new WebSocket("ws://127.0.0.1:8282”); 
ws = new WebSocket("ws://your_domain.com/ws”);  
## /ws是为了方便配置nginx

-https方式请求

## js 为例
ws = new WebSocket("wss://127.0.0.1:8282"); 
## 有SSL 协议存在需要使用域名访问方式 不然会报错
wss = new WebSocket("wss://your_domain.com/wss"); 
## /wss是为了方便配置nginx

4、启动/停止gateway服务 文档

## 需要进入到 GatewayWorker 框架根目录
## debug方式启动
php start.php start
## 以daemon方式启动
php start.php start -d
## 停止
php start.php stop
## 重启
php start.php restart
## 查看状态
php start.php status

5、测试服务

## js测试服务是否正常
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div>Demo测试</div>
    <input id="im1" type="text" name="输入消息">    
    <input id="im2" type="button" value="发送"  onclick="sendMsg();" />
    <div id="im"></div> 
    <script type="text/javascript">
    // 证书是会检查域名的,请使用域名连接
    ws = new WebSocket("wss://your_domain.com/wss");
    ws.onmessage = function(e) {
             var html = document.getElementById('im').innerText; 
             document.getElementById('im').innerText = html + e.data;
         //alert("收到服务端的消息:" + e.data);
    };
    ws.onopen = function() {
             ws.send("开始聊天吧!");
        };
    function sendMsg() {
         var msg = document.getElementById('im1').value;    
         ws.send(msg);  
    }
    </script>
</body>
</html>

-可打开两个浏览器互发消息、测试效果如下:


三、与TP框架整合

1、下载GatewayClient并整合到TP框架 文档

2、注册地址
GatewayClient下的registerAddress地址和端口要和 GatewayWorker 下的保持一致

3、客户端与TP的交互
-客户端建立与GatewayWorker的websocket连接
-GatewayWorker发现有连接发起时,将对应连接的client_id发给客户端
-客户端收到client_id后触发一个请求TP接口将client_id发到后端进行用户ID的绑定
-后端收到client_id后利用bindUid将client_id与当前uid(用户/客户端唯一标识)绑定
-客户端发起的所有请求都直接POST/GET到TP框架统一处理,包括发送消息
-TP框架处理业务过程中需要向某个uid或者某个群组发送数据时,直接调用sendToUid、sendToGroup 等发送即可

4、心跳检测
客户端定时每X秒(推荐小于60秒)向服务端发送特定数据,服务端设定为X秒没有收到客户端心跳则认为客户端掉线,并关闭连接触发onClose回调

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。