GatewayWorker使用与原理
前言
想要成为一个出色的PHPrd,进阶之路便是毫无方向,异常艰辛,接下来我们就了解一下即时通讯中gatewayworker的使用方式以及工作原理。
一、GatewayWorker是什么?
gateway是一款出色的即时通讯框架。它是给予workerman 进行扩展的故满足workerman的所有使用方法。也是在tcp|ip协议基础上构建有效的长链接从而抛弃客户端进行轮询实现"长连接",
gateway常用于快速开发TCP长连接应用, 例如 app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等
二、安装以及启动(linux)
1,将压缩包打包上传到Linux服务器,并减压
2,进入目录文件 会看到start.php (启动文件)并执行 php start.php start
注 : linux 环境中配置php环境变量后才可使用 php start.php start,否则只能执行 php 环境目录 tart.php start
3,,启动会出现三个端口分别是
gateway 端口 --- 用来供外部连接构建长连接
register 端口 --- 用来注册内部通信端口 (用于 register 连接 gateway)
business 端口 --- 用来注册内容通信端口(business 与 gateway 进行数据通信)
注:
若三个端口配置成一致端口会导致端上与服务端构建长链接时时好时坏。
gateway端口必须外部可访问,需在服务云厂商安全组中打开以及在服务器的防火墙中允许通过
三、工作原理
1,gateway,register,business 各个进程启动
2,gateway和business向register连接注册
3,register 接受到 gateway的注册后,会将所有的注册存储到内存中
4,register 接受到 business的注册后, 把内存中的gateway的通讯地址发送business
5,business收到gateway的内部通讯地址并进行尝试连接以此构成 gateway, business, register 相互连接。
6,当gateway下线时,register收到下线通知后,然后将新的gateway内部连接通讯地址广播给buiness进行连接,
buiness 不在连接已下线的gateway地址。
7,至此Gateway与BusinessWorker通过Register已经建立起长连接
8,当客户端连接gateway时, gateway将信息传递给business,business进行业务处理进行onStartWorker, onConnect 事件,
最终连接成功后通过business中的onMessage事件
四、简单demo示例
此处长连接协议为websocket
gateway-worker 服务端
start_gateway.php 代码修改
use \Workerman\Worker;
// 自动加载类
require_once __DIR__ . '/../../vendor/autoload.php';
//
$gateway = new Gateway("websocket://x.x.x.x:8089");
// gateway名称,status方便查看
$gateway->name = 'ji-shi-tong-xun';
// gateway进程数
$gateway->count = 1;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,根据进程数个数 依次增加,从0开始依次增加
$gateway->startPort = 2900;
// 服务注册地址, 写start_register中填写的内部地址即可
$gateway->registerAddress = '127.0.0.1:8099';
// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
start_gateway.php 代码修改
use \Workerman\Worker;
// 自动加载类
require_once __DIR__ . '/../../vendor/autoload.php';
//
$gateway = new Gateway("websocket://x.x.x.x:8089");
// gateway名称,status方便查看
$gateway->name = 'ji-shi-tong-xun';
// gateway进程数
$gateway->count = 1;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,根据进程数个数 依次增加,从0开始依次增加
$gateway->startPort = 2900;
// 服务注册地址, 写start_register中填写的内部地址即可
$gateway->registerAddress = '127.0.0.1:8099';
// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
start_register.php 代码修改
该文件主要用于疏通gateway的内部通讯地址与buiness进行连接
use \Workerman\Worker;
use \GatewayWorker\Register;
// 自动加载类
require_once __DIR__ . '/../../vendor/autoload.php';
// register 必须是text协议
$register = new Register('text://127.0.0.1:8099');
// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
start_businesswork.php 代码修改
该文件主要用于连接gateway的内部通讯地址以及处理业务逻辑
use \Workerman\Worker;
use \GatewayWorker\Register;
// 自动加载类
require_once __DIR__ . '/../../vendor/autoload.php';
// register 必须是text协议
$register = new Register('text://127.0.0.1:8099');
// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
端上为前端 js
ws = new WebSocket("ws://x.x.x.x:8099");
ws.onopen = function() {
alert("连接成功");
ws.send('tom');
alert("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {
alert("收到服务端的消息:" + e.data);
};
五、源码分析
1,uid绑定与sendTouid分析
当客户端与gateway连接成功后,gateway将生成唯一clientid并将与之对应的连接对象进行存储以此方便后续指定某些个连接对象广播消息,
绑定uid的话就更为简单了,当端上发送uid与clientid到gateway中,gateway中的onMessage接受消息并通过内部通讯管道传递给business进行处理 (具体gateway::bindUid() 方法不作解释,自行看代码)
六、转载文档
总结
以上就是简单介绍了我对gateway的一些理解, 欢迎有兴趣的小伙伴进行评论,探讨