Сервисная технология на основе REST + RPC API делаем в турбо режиме

от автора

Мы привыкли почему-то разделять REST и RPC, мне кажется это разделение искусственным. Просто REST строже и ограничен в методах, и это не всегда оправдано в сложном приложении.

Сделаем простую основу для написания сервисно-ориентированной архитектуры. Как стек технологий используем славный Yii2, быстрый Nginx и молниеносный Redis. Почему именно так, станет ясно позднее.

Для управления сущностями на примитивном уровне СREATE, UPDATE, DELETE, GET нам вполне достаточно Rest техники которая заложена в Yii2.

Для облегчения работы в сцепке Nginx + Redis, нам придется использовать немного нестандартный подход, то есть полностью передать как параметры: класс, метод и другие нужные параметры. Для валидации этой компании используем наипростейшую форму Yii2 Model (для экономии места проигнорируем code style):

class QueryForm extends Model {    /**     * @properties for REST     */        public $restModel = '';  // Class    public $restMethod = ''; // Method    public $restId = null;   // Rest id модели     public $restAttributes = []; // аттрибуты модели     /**     * @properties for RPC     */    public $categories = []; // фильтр по типу места    public $tags = [];  // Теги для запроса    public $match = ''; //  запрос по фразе    public $cache = 1; // флаг кеширования //  ну и так далее ...  

Дальше соответственно валидация всей этой веселой компании, тут очевидно, надеюсь.

Nginx при определенных условиях (если нужны дополнительные модули — ссылка ниже) может перехватить ссылку, послать запрос в Redis, и если Redis по ключу ничего не найдет, то поднимем PHP Yii2, который методом actionCall подготовит ответ и запишет его в кеш (работающий на основе того же Redis).

$params = $this->getEncodeParams($key);  $query = new \common\models\QueryForm();  if ($query->validateParams($params)) {     $this->setHeader(self::CODE_OK, self::MSG_OK);     $this->setData($this->callDispatcher($query)); }  else {     $this->setHeader(self::CODE_ERROR, self::MSG_INPUT_PARAMETER_ERROR  . print_r($query->getErrors(), true));  }  $this->response(); 

Схематично диспечер callDispatcher, который обрабатывает REST и RPC:

1) Cначала запросы по ID: POST, GET, DELETE, CREATE (тут все просто благодоря Yii2).

2) Ну и наконец после этого в диспетчере обработаем запросы всех сущностей RPC, необходимых вашему приложению.

Что у нас в итоге:

— единый метод класса actionCall ($key), который обработает любой запрос REST и RPC.
— keуParams — универсальный закодированный ключ, который подходит для получения ответа сервиса, используя сцепку Nginx + Redis (за подробностями вам сюда), минуя PHP, и одновременно он подходит для обработки запроса используя PHP FM Yii2.

Если вам кажется, что будет неудобно работать с такими ссылками (url), то это не совсем так, немного смекалки — и все у вас будет очень даже удобно. Некоторые уже совсем очевидные вещи сознательно опущены.

Всем удачи, коллеги!

ссылка на оригинал статьи https://habrahabr.ru/post/276781/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *