Рубрики
Uncategorized

Внедрение RPC swool

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

Резюме

Это седьмая статья о 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-запрос
//Code snippet
php
$demo = [
    'type'  => 'SW',
    'token' => 'Bb1R3YLipbkTp5p0',
    'param' => [
        'class'  => 'Order',
        'method' => 'get_list',
        'param' => [
            'uid'  => 1,
            'type' => 2,
        ],
    ],
];

$ch = curl_init();
$options = [
    CURLOPT_URL  => 'http://10.211.55.4:9509/',
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => json_encode($demo),
];
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);
  • 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 с плавающей запятой

Эту статью добро пожаловать переслать, переслать пожалуйста, укажите автора и источник, спасибо!