Рубрики
Uncategorized

Создание микросервисов websocket через работника шлюза / работника

Автор оригинала: David Wong.

В последнее время это необходимо в некоторых проектах Websocket Для передачи в режиме реального времени группированным пользователям интерфейсу необходимо передавать меньше информации на серверную часть, которая выбирается из нескольких соображений Фреймворк Gatewayworker Создание микросервисов (на основе workerman ).

Рабочий

Worker man-это платформа для обслуживания сокетов PHP с открытым исходным кодом и высокой производительностью, разработанная компанией pure PHP.

Рабочий человек-это не колесо повтора, это не структура MVC, а более общая структура обслуживания сокетов. Вы можете использовать его для разработки агента TCP, лестничного агента, игрового сервера, почтового сервера, FTP-сервера или даже для разработки PHP-версии redis, PHP – версии базы данных, PHP-версии nginx, PHP-версии PHP FPM и т.д. Рабочего человека можно назвать инновацией в области PHP, которая полностью освобождает разработчиков от оков, которые PHP может делать только в Интернете.

На самом деле workerman похож на PHP-версию nginx, и его ядро-мультипроцессор + epoll + неблокирующий ввод-вывод. Рабочий человек может поддерживать десятки тысяч одновременных подключений для каждого процесса. Благодаря своей постоянной памяти он не полагается на контейнеры Apache, nginx, PHP FPM и обладает сверхвысокой производительностью. В то же время он поддерживает TCP, UDP, сокет unix, длинное соединение, websocket, HTTP , WSS, HTTPS и другие протоколы связи, а также различные пользовательские протоколы. Он имеет таймер, асинхронный клиент сокета, асинхронный mysql, асинхронный redis, асинхронный HTTP, асинхронную очередь сообщений и многие другие высокопроизводительные компоненты.

Адрес GitHub: https://github.com/walkor/workerman

Документ: http://doc.workerman.net/315110

Работник шлюза

Gateway worker-это структура проекта, разработанная на основе worker man, которая используется для быстрой разработки приложений с длинными соединениями TCP, таких как сервер push-приложений, сервер мгновенных сообщений, игровой сервер, Интернет вещей, умный дом и т. Д

Работник шлюза использует классические модели шлюза и рабочего процесса. Процесс шлюза отвечает за поддержание клиентского соединения и передачу клиентских данных в процесс businessworker для обработки. Рабочий бизнес – процесс отвечает за обработку фактической бизнес-логики (вызывающих событий. php для обработки бизнеса по умолчанию) и отправка результатов соответствующему клиенту. Служба шлюза и служба бизнес-работника могут быть отдельно развернуты на разных серверах для реализации распределенной кластеризации.

Работник шлюза предоставляет очень удобный API, который может передавать данные по всему миру, определенной группе или конкретному клиенту. С помощью таймера workerman данные также могут регулярно передаваться.

Адрес GitHub: https://github.com/walkor/gatewayworker

Документ: http://doc2.workerman.net/326102

Отношения между рабочим и работником шлюза

Рабочего человека можно рассматривать как чистую библиотеку классов сокетов, которая может разрабатывать практически все сетевые приложения, будь то TCP или UDP, длинное соединение или короткое соединение. Код Workerman прост, мощен, гибок и может быстро разрабатывать различные сетевые приложения. В то же время, по сравнению с работником шлюза, рабочий человек также находится на более низком уровне, что требует от разработчиков некоторого опыта в программировании нескольких процессов.

Поскольку большинство разработчиков стремятся разрабатывать приложения для длинных соединений TCP на основе workerman, а сервер приложений для длинных соединений имеет много общего, например, у них одинаковая модель процесса и требования к интерфейсу, такие как одиночный, групповой и широковещательный. Итак, у нас есть рабочая структура шлюза. Gateway worker-это платформа TCP-длинных соединений, разработанная на основе workerman, которая реализует необходимые интерфейсы для одиночной отправки, групповой отправки, широковещательной передачи и других длинных соединений. Рабочая среда шлюза реализует модель рабочего процесса шлюза. Он, естественно, поддерживает распределенное многосерверное развертывание. Это очень удобно для расширения и сокращения емкости и позволяет справляться с большим количеством одновременных подключений. Можно сказать, что gateway worker-это более совершенная структура проекта, основанная на рабочем человеке, которая специально используется для реализации длинного TCP-соединения.

Клиент шлюза

Клиент шлюза-это клиентская программа работника шлюза, которая может нажимать, группировать и подсчитывать.

В общем, микросервис websocket не обрабатывает бизнес-логику, это всего лишь одностороннее соединение, отвечающее только за передачу информации. Однако, когда клиент подключается к микросервису websocket, микросервис websocket возвращается к идентификатору клиента, и клиент вызывает интерфейс для передачи идентификатора клиента на серверную часть. В это время серверная часть может привязывать пользователей к определенным группам через клиент шлюза. Однако, когда требуется push, он взаимодействует с работником шлюза по текстовому протоколу, передавая идентификатор клиента или группу, которую необходимо передать в gatewayworker, а затем gatewayworker передает клиенту. Эта цифра выглядит следующим образом:

Установите рабочее ядро шлюза

Создайте новый пустой проект (не в PHP – фреймворке, таком как laravel/lumen/ThinkPHP), выполните

composer require workerman/gateway-worker

Файл запуска

Создать start.php в качестве файла запуска в корневом каталоге, код:

Класс регистрации

Класс register отвечает за регистрацию адреса внутренней связи. После запуска процесса шлюза и рабочего процесса они регистрируют свой собственный адрес связи в процессе регистрации. После того, как процесс шлюза и бизнес-работник получат адрес связи через процесс регистрации, они смогут установить соединение и взаимодействовать.

Как работает работник шлюза

Src/start_register.php (имя каталога можно определить самостоятельно) код:

Зарегистрировать класс шлюза

Класс шлюза используется для инициализации процесса шлюза. Процесс шлюза – это процесс, предоставляемый клиенту для подключения. Все запросы от клиентов принимаются шлюзом и передаются бизнес-работнику для обработки. Аналогичным образом, бизнес-работник перешлет ответ, который будет отправлен клиентам через шлюз.

Src/start_gateway.php Код:

name = 'business-gateway';
//Number of gateway processes
$gateway->count = 2;
//Local IP, using intranet IP for distributed deployment
$gateway->lanIp = '127.0.0.1';
//Internal communication start port. If $Gateway - > count = 4, the start port is 4000
//Generally, 4000 4001 4002 4003 4 ports are used as internal communication ports 
$gateway->startPort = 2900;
//Service registration address (register class address)
$gateway->registerAddress = '127.0.0.1:1238';

Зарегистрируйте класс бизнес-работника

Бизнес-работник-это процесс для выполнения бизнес-логики. При получении событий и запросов, пересылаемых шлюзом, business worker вызовет метод onconnect onmessage onclose в events.php по умолчанию для обработки событий и данных. Разработчики контролируют бизнес и процесс с помощью этих обратных вызовов.

Src/start_businessworker.php Код:

name = 'Steam-BusinessWorker';
//Number of bussinessworker processes
$worker->count = 1;
//Service registration address
$worker->registerAddress = '127.0.0.1:1238';

Классные мероприятия

Класс события используется для записи рабочих событий шлюза, в которые можно записать некоторую информацию об обратном вызове.

Src/events.php Код:

 $client_id,
        ]));
    }

    /**
     *Triggered when a message is sent from the client
     *@ param int $client \ ID connection ID
     *@ param mixed $message
     */
    public static function onMessage($client_id, $message)
    {
    }

    /**
     *Triggered when the user is disconnected
     *@ param int $client \ ID connection ID
     */
    public static function onClose($client_id)
    {
    }
}

Это код, написанный в вашем собственном проекте. Процедура: интерфейс внешнего вызова отправляет идентификатор клиента, серверная часть привязывается к группе, а затем передает информацию группе или указанному клиенту с идентификатором клиента.

На пакет клиента шлюза необходимо ссылаться в проекте

composer require workerman/gatewayclient

Код:

//Gatewayclient 3.0.0 added namespace later
use GatewayClient\Gateway;

/**
 *= = = specifies which gatewayworker (cluster) the registeraddress indicates to communicate with. = = =
 *In gatewayworker, register service is used to differentiate clusters, that is, one gatewayworker (cluster) has only one register service,
 *Gatewayclient must know the register service address to communicate with. The address format is IP: port,
 *IP is the IP of the register service (if gatewayworker is a stand-alone deployment, IP is the server IP of gatewayworker),
 *The port is the port listening in the start Φ register.php file on the corresponding IP server, that is, the port of the register seen when gatewayworker starts.
 *To push data to clients, gatewayclient must know which gatewayworker the client is in,
 *Then connect the IP: port of the gatewayworker (cluster) register service to communicate with the corresponding gatewayworker (cluster).
 *This IP: port is specified by gateway:: $registeraddress on the gateway client side.
 * 
 *= = = the following steps are required if gatewayclient and gatewayworker are not on the same server===
 *1. You need to set the lanip in start_gateway.php as the actual local intranet IP (you can also set it as the external IP if it is not in a LAN), and restart the gatewayworker after setting
 *2. The IP address of gateway:: $registeraddress in gatewayclient is filled in the IP and port specified in the above step 1lanip
 *3. You need to turn on the firewall of the server where gatewayworker is located so that the following ports can be accessed by the server where gatewayclient is located,
 *Port includes the port of rgister service and several ports specified by lanip and startport in start_gateway.php
 *
 *= = = if gatewayclient and gatewayworker are on the same server===
 *The gatewayclient and register services are both on one server. If you fill in 127.0.0.1 and IP, no other settings are required.
 **/
Gateway::$registerAddress = '127.0.0.1:1236';

//Gatewayclient supports all interfaces in gatewayworker (except gateway:: closecurrentclient gateway:: sendtocurrentclient)
Gateway::sendToAll($data);
Gateway::sendToClient($client_id, $data);
Gateway::closeClient($client_id);
Gateway::isOnline($client_id);
Gateway::bindUid($client_id, $uid);
Gateway::isUidOnline($uid);
Gateway::getClientIdByUid($client_id);
Gateway::unbindUid($client_id, $uid);
Gateway::sendToUid($uid, $dat);
Gateway::joinGroup($client_id, $group);
Gateway::sendToGroup($group, $data);
Gateway::leaveGroup($client_id, $group);
Gateway::getClientCountByGroup($group);
Gateway::getClientSessionsByGroup($group);
Gateway::getAllClientCount();
Gateway::getAllClientSessions();
Gateway::setSession($client_id, $session);
Gateway::updateSession($client_id, $session);
Gateway::getSession($client_id);

Оригинал: https://www.wugenglong.com/we