上一篇文章讲了关于单服务器如何接入workerman,实现通过服务器端主动推送数据给客户端。
这篇文章讲如何实现服务器集群的情况如何针对workerman做分布式的集群部署。
由于我们公司的线上项目的服务环境是多服务器搭建起来的服务器集群,因此需要解决的是如何能将workerman做集群化的部署,客户端访问任何集群中的任何一台服务器都能知道其身份,服务端做出正确响应。
例:IM功能中的A用户发消息给B用户,A发送消息先到集群中的任意一台服务器,服务器获知消息后,将信息推送给B用户。
切入正题:
我这里使用两台服务器做getwayWorker集群化的部署
IP: 49.233.150.121(公)| 172.21.0.1(内) (主)服务器
IP: 49.232.150.124(公)| 172.21.0.2(内) (从)服务器
1.环境搭建
进入到项目的根目录,使用composer进行安装
workerman与getway安装—
composer require workerman/workerman
composer require workerman/gateway-worker
2.服务器
修改YourApp中的配置文件,YourApp名称可以自定义,如果是windows系统的服务器,修改名称后,必须要更改start_for_win.bat文件中的名称。因为这个启动该服务的时候需要通过点击该文件来运行。
主服务器:
~~start_reigster.php文件~~
<?php
use \Workerman\Worker;
use \GatewayWorker\Register;
// 自动加载类
//require_once __DIR__ . '/../../../vendor/autoload.php';
// register 必须是text协议
$register = new Register('text://0.0.0.0:1238');
// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
~~start_getway.php文件~~
<?php
use \Workerman\Worker;
use \GatewayWorker\Gateway;
use \Workerman\Autoloader;
//require_once __DIR__ . '/../../../vendor/autoload.php';
// 自动加载类
$context = array(
'ssl' => array(
'local_cert' => 'xxx.crt', //或者crt文件
'local_pk' => 'xxx.key',
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
// gateway 进程,这里使用Text协议,可以用telnet测试
$gateway = new Gateway("websocket://0.0.0.0:8000", $context);
$gateway->transport = 'ssl';
// gateway名称,status方便查看
$gateway->name = 'getwayWorker';
// gateway进程数
$gateway->count = 4;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '172.21.0.1';
// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
$gateway->startPort = 4000;
// 服务注册地址
$gateway->registerAddress = '172.21.0.1:1238';
// 心跳间隔
$gateway->pingInterval = 60;
// 心跳数据
$gateway->pingData = '{"type":"ping"}';
/*
// 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调
$gateway->onConnect = function($connection)
{
$connection->onWebSocketConnect = function($connection , $http_header)
{
// 可以在这里判断连接来源是否合法,不合法就关掉连接
// $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket链接
if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net')
{
$co