Резюме
Это седьмая статья о 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 с плавающей запятой
Эту статью добро пожаловать переслать, переслать пожалуйста, укажите автора и источник, спасибо!