Резюме
Это седьмая статья о swool learning: реализация swool RPC.
- Часть 6: swool интегрирован в небольшую структуру
- Часть 5. применение мультипротокола swool и многопортового
- Часть 4: применение swool http
- Часть 3: применение swool websocket
- Часть 2: применение задачи свула
- Часть 1: применение таймера свула
Один читатель сказал: “В последней статье, после загрузки кода, он успешно запускается напрямую. Код прост и понятен. Это лучшая демонстрационная версия для введения swool.”.
“Ха-ха-ха…”
И читатель спросил: “У вас есть организационная группа для совместного обучения? Можете ли вы ответить в нем на вопросы?”
На самом деле это не так. Я всегда думаю, что поддерживать группу wechat непросто, потому что я не люблю разговаривать в группе. Кроме того, я также участвую во многих группах wechat. Атмосфера в начале хорошая. Все говорят о технологиях. Позже о технологиях говорят меньше, но это сплетни. Позже, когда все идет медленно, становится тихо, и в группе возникают конфликты
Конечно, я также знаю, что преимущества поддержания группы wechat очень велики. Если есть студенты с опытом работы в этой области, давайте пообщаемся друг с другом~
И издательство попросило меня написать книги
Они также действительно чувствуют себя непринужденно. Я все еще знаю несколько капель чернил в своем собственном желудке. В настоящее время это не должно сработать. В будущем давайте поговорим об этом.
Есть также некоторые магнаты, которые добавили wechat, вероятно, из-за помощи молодого поколения. Скажу вам по секрету, что вы можете многому научиться у круга друзей магната.
Я искренне предлагаю вам подвести итог своим собственным навыкам и записать то, что вы знаете, чтобы поделиться с вами, не говоря уже о том, что это приносит слишком большую ценность другим, но в любом случае это очень полезно для вас. Студенты, которые хотят общаться на эту тему, могут присоединиться ко мне, и я могу бескорыстно поделиться этим.
Можно сказать, что времени мало, пока время переполнено, оно всегда будет, у каждого есть 24 часа, и время самое справедливое для всех. Говоря об этом, я рекомендую вам прочитать книгу “Темное время”. Это мои заметки для чтения этой книги. Вы можете прочитать это.
Давайте начнем сегодняшнюю статью. В этой статье реализован простой удаленный вызов RPC. Перед внедрением вам необходимо знать, что такое RPC. Если вы не знаете, вы можете прочитать предыдущую статью “RPC в моих глазах”.
Следующий демонстрационный код в основном использует пул задач Вулфа и получает информацию по запросу/при получении задачи для обработки.
Например, в системе электронной коммерции два модуля, модуль персонального центра и модуль управления заказами, независимо развернуты, могут находиться не в компьютерном зале, могут не быть доменным именем, теперь личному центру необходимо получить данные о заказе через идентификатор пользователя и тип заказа.
Эффект реализации
Клиент
- HTTP-запрос
- TCP-запрос
//Code snippet
$demo = [
'type' => 'SW',
'token' => 'Bb1R3YLipbkTp5p0',
'param' => [
'class' => 'Order',
'method' => 'get_list',
'param' => [
'uid' => 1,
'type' => 2,
],
],
];
$this->client->send(json_encode($demo));Режим запроса
- Один запрос SW, ожидание результатов
После отправки запроса он назначается задаче и ожидает завершения задачи, прежде чем вернуться.
- Sn один запрос, не ждите результатов
Как только запрос выдан и назначен задаче, он возвращается напрямую.
отправка данных
$demo = [
'type' => 'SW',
'token' => 'Bb1R3YLipbkTp5p0',
'param' => [
'class' => 'Order',
'method' => 'get_list',
'param' => [
'uid' => 1,
'type' => 2,
],
],
];- Тип синхронных/асинхронных настроек
- Токен можно использовать для проверки разрешений
- Имя класса, запрошенное классом
- Имя метода запроса метода
- Параметр Uid один
- Введите параметр два
Возвращаемые данные
- Способ запроса
- Запрос и время время начала запроса
- Ответ “время окончания запроса времени
- Кодовый логотип
- Значение идентификатора MSG
- Данные контрактных данных
- Параметры запроса запроса
Код
Код
rawContent());
self::$query = $data;
if (empty($data)) {
self::$code = '-1';
Self:: $MSG = 'illegal request';
self::end($request, $response);
}
//Todo verification token
switch ($data['type']) {
Case 'SW': // single request, waiting for result
$task = [
'request' => $data,
'server' => 'http'
];
$rs = $serv->task(json_encode($task), -1, function ($serv, $task_id, $rs_data) use ($request, $response) {
self::$code = '1';
Self:: $MSG = 'success';
self::$data = $rs_data['response'];
self::end($request, $response);
});
if ($rs === false) {
self::$code = '-1';
Self:: $MSG = 'failed';
self::end($request, $response);
}
break;
Case 'Sn': // single request without waiting for results
$task = [
'request' => $data,
'server' => 'http'
];
$rs = $serv->task(json_encode($task));
if ($rs === false) {
self::$code = '-1';
Self:: $MSG = 'failed';
} else {
self::$code = '1';
Self:: $MSG = 'success';
}
self::end($request, $response);
break;
default:
self::$code = '-1';
Self:: $MSG = 'illegal request';
self::end($request, $response);
}
} catch(Exception $e) {
}
}
private static function end($request = null, $response = null)
{
$rs['request_method'] = $request->server['request_method'];
$rs['request_time'] = $request->server['request_time'];
$rs['response_time'] = time();
$rs['code'] = self::$code;
$rs['msg'] = self::$msg;
$rs['data'] = self::$data;
$rs['query'] = self::$query;
$response->end(json_encode($rs));
self::$data = [];
return;
}
}Код
$fd,
'request' => $data,
'server' => 'tcp',
'request_time' => self::$request_time,
];
$rs = $serv->task(json_encode($task));
if ($rs === false) {
self::$code = '-1';
Self:: $MSG = 'failed';
self::handlerTask($serv, $fd);
}
break;
Case 'Sn': // single request without waiting for results
$task = [
'fd' => $fd,
'request' => $data,
'server' => 'tcp',
'request_time' => self::$request_time,
];
$rs = $serv->task(json_encode($task));
if ($rs === false) {
self::$code = '-1';
Self:: $MSG = 'failed';
} else {
self::$code = '1';
Self:: $MSG = 'success';
}
self::handlerTask($serv, $fd);
break;
default:
self::$code = '-1';
Self:: $MSG = 'illegal request';
self::handlerTask($serv, $fd);
}
} catch(Exception $e) {
}
}
private static function handlerTask($serv, $fd)
{
$rs['request_method'] = 'TCP';
$rs['request_time'] = self::$request_time;
$rs['response_time'] = time();
$rs['code'] = self::$code;
$rs['msg'] = self::$msg;
$rs['data'] = self::$data;
$rs['query'] = self::$query;
$serv->send($fd, json_encode($rs));
}
}Резюме
Демонстрационный код предназначен только для справки. В этом есть много слабых мест!
Между вызывающим абонентом и поставщиком услуги должен быть реестр услуг. Очевидно, что в приведенном выше коде нет такого реестра служб, поэтому его необходимо реализовать самостоятельно.
Реестр служб отвечает за управление информацией об IP-адресах и портах, ее предоставление абонентам, а также за балансировку нагрузки и отработку отказа.
В зависимости от их собственной ситуации, внедрение сервиса регистрационного центра может быть простым и сложным. Также можно использовать redis, zookeeper и консультироваться.
Вы также можете узнать о системе шлюза, включая аутентификацию личности, аутентификацию полномочий, управление трафиком, мониторинг и раннее предупреждение
Мы рекомендуем Hprose, платформу RPC swool, которая поддерживает несколько языков.
Вот и все. Для демонстрации выше нужен исходный код, плюс мой wechat. (меню – > добавить мой wechat – > сканировать меня)
Рекомендуемое чтение
- Системное объяснение Единый вход единого входа
- Системное объяснение – Защита веб-безопасности PHP
- Системное объяснение – Технология кэширования PHP
- Системное объяснение – Проверка подписи интерфейса PHP
- Системное объяснение – высокоточная работа PHP с плавающей запятой
Эту статью добро пожаловать переслать, переслать пожалуйста, укажите автора и источник, спасибо!