Рубрики
Uncategorized

Архитектура модульной приложения — трубопроводы

При разработке программного обеспечения, иногда нам нужно разрешить нашему приложению иметь плагины или модули, разработанные третьими лицами. В этом посте мы увидим, в каких контекстах «трубопроводы» можно использовать в качестве механизма плагина.

Автор оригинала: Asmir Mustafic.

Это третий пост из серии постов, которые будут описывать стратегии для создания Модульные и расширяемые приложения. В этом посте мы начнем смотреть, как реализовать систему плагина, используя «трубопроводы». Некоторые реализации называют их «промежуточным программным обеспечением».

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

Вообще говоря, с «трубопроводами» у нас просто некоторые данные проходят через серию преобразований.

Приложение и компоненты

Некоторые реализации позволяют решить порядок выполнения, некоторые нет, некоторые не позволяют изменять заказ во время выполнения.

В качестве порядка выполнения может быть важен, шаг «Регистрация плагина» очень важен (см. первый пост для получения дополнительной информации об этом).

Использовать дело

Отличный пример трубопроводов — подразделение PSR-7 ( здесь хороший пост об этом), где каждый «плагин» может изменить HTTP-сообщение, добавив в качестве примера HTTP Cookies, учетные данные, сжатие, кэширование заголовков и так далее. Как пример, добавление файла cookie можно рассматривать как Добавление 1 функциональность, но В качестве примера сжимания HTTP-сообщения означает, что скорее всего, заменяет старое сообщение новым и сжатым.

ПРИМЕЧАНИЕ 1 : В настоящее время PSR-7 неизменяется, поэтому мы всегда заменяем старый объект новым.

Обработка текста может также быть довольно распространенным корпусом использования, как пример, если мы хотим извлечь только «важные» слова из текста. У нас могут быть шаги, которые выполняют токенизацию, удаление словных слоев, экстракции stemming и глаголов/существительных.

Другое использование трубопроводов может быть обработкой изображения. Допустим, мы хотим, чтобы пользователь загрузил изображение, которое необходимо сохранить. Изображение, вероятно, должно быть изменено, применило водяной знак и сжатый для хранения. Это 3 независимых шаги и, вероятно, полезны в разных случаях. Как пример:

  • Шаг «Watermarking» может использоваться также для изображения профиля,
  • «Изменение размера» можно использовать, вероятно, во многих других случаях, когда необходимо изменить размер изображения.

«Сжатие» может быть более деликатным, поскольку оно может сжать изображение как «.zip», муравей, другие преобразования должны иметь возможность иметь дело с этим типом данных.

Этот шаг ставит нас перед одним из недостатков этой системы плагина. «DataType», который проходит через трубопровод, должен быть известен трансформатором, чтобы позволить ему применить некоторое преобразование, но концепция трубопроводов является «изменением» данных DataType на каждом шаге.

Реализации

Разные потребности имеют разные реализации, в основном из-за различных типов данных, которые мы могли бы заинтересовать в обработке.

В следующих примерах, каждая реализация работы по различным типу данных, так что могут отличаться от других.

Трубопровод Лиги PHP

Трубопровод Лиги PHP Целью стать независимой библиотекой для реализации трубопроводов.

Реализация более «чисто» по сравнению с другими, «данные» всегда заменяются на новый на каждом этапе (неизменность). Шаги не могут заблокировать обработку или позже завод выполнения.

Основной пример может быть:

Регистрация

Трубопровод Реализация является минимальным, и регистрация полностью ручная. Выполнение заказа должно быть явно настроен.

pipe(new MultiplyTwoStage)
    ->pipe(new AddOneStage);


// run the pipeline

$pipeline->process(10); // Returns 21

Как вы можете видеть, Трубопровод не делает никаких предположений по данным и является минимальным.

Ласкар

Laravel Mardware Стратегия сильно используется в качестве плагина Система для этого.

Большая часть цикла запроса-отклика в Лыравлем обрабатывается им. Разные «плагины» могут добавлять их в трубопровод и выполнять некоторые операции в окончательное HTTP-сообщение, которое будет доставлено пользователю.

В качестве плагинов в этом случае у нас есть все, что может быть интересно взаимодействовать с HTTP-запросом.

Laravel Indurewares способен: изменить HTTP-сообщение, заменить его, изменить порядок трубопровода или даже чтобы остановить обработку трубопровода.

Посмотрим, как это работает:

getClientIp() === '1.2.3.4') {
            return redirect('/not-allowed');
        }

        return $next($request);
    }
}

Это один пример трансформатора. Если IP-адрес пользователя находится в черном списке, перенаправляйте его на определенную страницу ( Redirect («/не допустимый») ), в противном случае Позволяет обработку трубопровода продолжить $ Далее ($ запрос) Отказ В этом случае Checkip Трансформеры действуют «перед» следующим «следующим» шагом. В случае не уполномоченного пользователя Он останавливает обработку трубопровода.

Другой пример может быть

setContent(gzcompress($response->getContent()));
        $response->headers->set("Content-Encoding",  "gzip");

        return $next($request);
    }
}

В этом примере мы позволяем трубопроводу продолжить поток, а в конце мы сжимаем ответ.

В этом случае Compredresponse Трансформаторы действуют «после« следующего »шага.

Регистрация

В качестве механизма регистрации плагина LARAVEL использует явную конфигурацию, используя массив Amboldwares. Это простой, но достаточно мощный механизм, чтобы иметь дело с этим. Разработчик может выбрать, какие промежуточные программы используют и в каком порядке выполняются их.

Регистрация промежуточного программного обеспечения Laravel.

 \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

Larave предлагает также способ зарегистрировать Hedmostwares, действуя только на определенном URL/маршруте, но это уже деталь реализации.

Глоток

Гульп это инструмент сборки JavaScript.

Основан на концепции, что серия файлов проходит через серию преобразований и производить некоторый результат (большую часть времени некоторые .js или .css файлы). В качестве плагинов в этом случае у нас есть возможные трансформаторы для этих файлов.

var gulp = require('gulp');

var less = require('gulp-less');
var minifyCSS = require('gulp-csso');

gulp.task('css', function () {
  return gulp.src('client/templates/*.less') // get all the *.less files inside the client/templates folder
    .pipe(less()) // process *.less files
    .pipe(minifyCSS()) // compress them
    .pipe(gulp.dest('build/css')) // write the result to the build/css folder
});

Чтобы запустить эту «задачу» вам придется работать в вашей консоли что-то как Gulp CSS. .

Этот пример относительно просты. Задача по имени CSS был создан. Как «данные», мы используем * бессонница Файлы внутри Клиент/шаблоны папка; Данные проходят через меньше трансформатор (который преобразует их в CSS), то данные собираются в Minifycss это уменьшает размер CSS; В конце концов записи написаны на Build/CSS папка.

Больше реализации?

Как данные, с которыми мы можем работать, может быть действительно другим, Список возможных реализаций слишком долго обсуждаться здесь. Так же, как пример, это это просто список инструментов на основе трубопроводов в зоне системы администратора. Довольно большой, верно?

Заключение

Подход трубопровода полезен для Фильтр/редактирование данных Используя серию трансформаторов/фильтров. Добавление/редактирование данных может быть относительно простым, если структура данных мы работаем над, поддерживает ее явно (Как пример http заголовки), но когда дело доходит до добавления/редактирования чего-либо в структуре данных, которая не поддерживает ее Из коробки (HTTP Body) вещи могут стать более сложными. Ключевым фактором для работы трубопровода для работы хорошо, является удобная структура данных.

Преимущества:

  • Трансформаторы могут следовать строго «единым принципом ответственности»
  • Простая архитектура (это только данные, проходящие через преобразования)
  • Трансформаторы могут стать действительно восстановленными
  • Очень удобно для небольших изменений

Недостатки:

  • Трансформаторы могут нарушить данные
  • Трансформаторы должны хорошо понимать данные
  • Линейный поток (не может легко переработать, вещи случаются в заранее определенной последовательности … это может не работать в некоторых случаях)
  • (Если реализация позволяет изменить заказ выполнения или остановить обработку, все могут выйти из-под контроля, а отладки могут быть сложными)

«Трубопровод» Путь плагинов просты и мощный, но имеет очень специфические случаи использования.

Надеюсь, вам понравилась эта статья, и если у вас есть некоторые отзывы, не стесняйтесь оставлять комментарий.

Оригинал: «https://www.codementor.io/@goetas/modular-application-architecture-pipelines-elgngy480»