Краткое руководство по созданию генератора Yeoman для создания микросервисов на примере приложения Express.js и Typescript.

Многие популярные проекты и компании хорошо реализовали архитектуру микросервисов. Одним из его преимуществ является то, что мы можем создать сервис с единственной ответственностью за конкретную бизнес-логику. Поэтому всякий раз, когда у компании появляется новая функция, мы можем создать новую услугу, слабо связанную с другими микросервисами.

Еще одно преимущество микросервисов в том, что мы можем развертывать их независимо. Это означает, что мы можем использовать любые языки или фреймворки, которые сервис считает подходящими. Но на практике компании обычно определяют язык / фреймворк по умолчанию для своих микросервисов. Эта стратегия позволяет инженерам быстро создавать сервис, и она полезна для повышения производительности и ремонтопригодности при ограниченных ресурсах инженера.

Когда потребность в новых сервисах высока, инженерам придется писать множество шаблонных кодов одной и той же структуры. Таким образом, мы можем создать генератор кода, чтобы уменьшить повторение, чтобы инженеры могли сосредоточиться только на разработке бизнес-логики микросервиса. Мы также можем установить соглашение о коде, определив структуру папок и шаблон проектирования в его шаблоне и рабочем процессе с помощью генератора кода.

Начало работы с Йоманом

Yeoman - это инструмент для создания строительных лесов, который поможет вам запустить новые проекты с любыми техническими стеками. Это модуль Node.js, и вы можете установить его из npm:

npm install -g yo

После того, как вы установили его, вы можете запустить Yeoman с помощью команды yo, и он отобразит все глобально установленные генераторы. Например, вы можете попробовать созданный мной генератор для создания микросервиса с Express.js и Typescript, клонировав репозиторий ниже, а затем запустите npm link в каталоге,



Теперь вы можете запустить генератор с yo ts-express. И ниже будут показаны подсказки с запросом вашей настройки.

Затем процесс продолжит запись шаблонных файлов из шаблонов и установку зависимостей, пока не отобразится сообщение ниже.

Создание нового генератора

Генератор Yeoman - это просто модуль Node.js. Чтобы создать генератор, вы должны создать новый проект узла, запустив npm init и задать имя с префиксомgenerator- (например, generator-microservice).

Генератору требуется зависимость Yeoman, которую вы можете установить, запустив npm install yeoman-generator. Yeoman автоматически обнаружит основной генератор и вспомогательные генераторы, если вы будете следовать структуре папок ниже.

├───package.json
└───generators/
    ├───app/
    │   └───index.js
    └───route/
        └───index.js
  • package.json - это файл манифеста NPM для проекта генератора.
  • generators/app/index.js - это место, где написан основной рабочий процесс генератора. Его можно выполнить, запустив yo microservice.
  • generators/route/index.js - это место, где написан рабочий процесс вспомогательного генератора. Его можно выполнить, запустив yo microservice:route.

В генераторе вы должны создать класс, расширяющий базовый генератор Yeoman. Затем мы можем определить задачи, создав методы внутри класса.

Каждая задача будет выполняться последовательно в соответствии с порядком написания. Вы можете называть свои методы как угодно или следовать зарезервированным именам методов Yeoman.

Йомен использует эти имена методов для последовательного сохранения приоритета задач; имена в порядке: initializing, prompting, configuring, default, writing, conflicts, install и end. Если имена ваших методов не совпадают с зарезервированными именами, они будут выполняться с default приоритетом задачи.

💡 Совет для профессионалов
Назовите метод с префиксом подчеркивания (_helper_method), чтобы создать вспомогательный метод, который не будет отображаться как задача.

Взаимодействие с пользователями

Генератор Yeoman, который мы создаем, представляет собой приложение CLI, поэтому пользователи должны взаимодействовать или определять свои настройки через терминал. Yeoman предлагает три подхода к взаимодействию с пользователем; они есть:

  1. Аргументы (yo microservice [argument])
    Аргументы передаются непосредственно после команды генератора. Чтобы получить аргумент, мы должны вызвать this.argument(<name>, <options>) в конструкторе класса. Затем мы можем получить данные из this.options[name].
  2. Параметры (yo microservice --[option])
    Параметры передаются как флаги командной строки. Подобно аргументам, мы должны вызвать this.option(<name>, <options>) в конструкторе. Тогда он будет доступен из this.options[name].
  3. Подсказки
    Подсказки - это последовательность вопросов, которые задаются пользователю последовательно. Это наиболее рекомендуемый подход для взаимодействия с пользователем, поскольку он обеспечивает более удобное взаимодействие с пользователем и поддерживает условные вопросы. Он также поддерживает несколько типов вопросов, таких как радио, флажки и т. Д., Поскольку основан на Inquirer.js.
    Мы можем вызвать this.prompt(), который получает массив подсказок в качестве аргумента. Он асинхронный, и мы должны вызывать его в задаче prompting. Когда пользователь закончит отвечать на запросы, метод вернет объект ответов.

Вот пример использования методов аргумента, параметра и приглашения для получения name микросервиса.

💡 Совет для профессионалов
Для удобства пользователя в подсказках могут отображаться несколько типов вопросов, условных вопросов и подтверждений ответов. Вы можете следить за документацией здесь.

Конфигурация данных настройки пользователя

После того, как мы получили данные настройки пользователя, нам может потребоваться обработать и настроить их, прежде чем использовать их в других задачах. Общие задачи, которые необходимо решить на этапе настройки:

  • Создавайте новые переменные на основе пользовательских данных для передачи в файлы шаблонов.
  • Объединяйте пользовательские данные из аргументов, вариантов и ответов.
  • Сохраните ответы пользователей и данные конфигурации в файле конфигурации Yeoman (.yo-rc.json) для использования в будущем или от других генераторов / подгенераторов.

Мы можем закодировать эти задачи в методе configuring, как показано ниже.

С помощью этого метода внутри проекта будет создан файл .yo-rc.json, который будет выглядеть следующим образом.

{
  "generator-microservice": {
    "name": "Example",
    "title": "ms-example"
  }
}

Создание файлов шаблонов

В нашем проекте генератора мы можем поместить файлы шаблонов в каталог templates генератора или суб-генератора, как показано ниже.

└───generators/
    ├───app/
    │   ├───templates/
    │   │   ├───index.js
    │   │   └───package.json
    │   └───index.js

Файл шаблона может быть любым файлом с любым расширением. Помимо стандартных кодов, мы также можем поместить файлы конфигурации проекта и файлы манифеста в качестве шаблонов.

Yeoman использует EJS для синтаксиса шаблонов. С помощью EJS мы можем скомпилировать код JS в шаблоне. Таким образом, мы можем передавать переменные или иметь условную запись в шаблоне. Вот пример использования EJS в шаблоне файла .env, который представляет собой файл переменных среды микросервиса.

В приведенном выше файле мы можем легко записать значение из переменной с синтаксисом EJS <%=. Мы также можем видеть, что блок конфигурации базы данных (строки 9–16) будет записан только тогда, когда переменная hasDb преобразуется в true.

💡 Совет для профессионалов
Мы можем использовать <%_ _%> вместо <% %>, чтобы очистить пробелы (пустую строку) вокруг него.

Создание шаблона из шаблонов

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

Как мы видим, мы используем встроенный метод Yeoman для копирования файлов шаблонов this.fs.copyTpl, которые получают три параметра: исходный путь, целевой путь и переменные шаблона. Yeoman также предоставляет функции преобразователя путей для получения пути текущего шаблона генератора (this.templatePath) и его целевого пути (this.destinationPath).

Настройка сгенерированного микросервиса для запуска

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

  1. Установите зависимости с точными версиями, предварительно определенными генератором. При таком подходе мы можем создать файл package.json как шаблон, в котором определены все зависимости. Таким образом, мы будем вызывать только this.npmInstall() в задаче install.
  2. Устанавливайте зависимости с последними версиями каждый раз при запуске генератора. Для этого мы можем передать список имен зависимостей, которые будут переданы функции this.npmInstall в качестве параметра.

Используя второй подход, вы можете увидеть пример его реализации в задаче install ниже.

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

Создание и составление подгенератора

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

Мы также можем создать подгенератор, чтобы сделать генератор более модульным, поскольку он может быть скомпонован с основным генератором. Вот пример модуля вспомогательного генератора для создания маршрута / конечной точки в микросервисе.

Как мы видим, модуль вспомогательного генератора имеет ту же концепцию, что и основной генератор. В нем есть взаимодействие с пользователем, настройка данных и копирование шаблонных задач. Поэтому мы можем объединить его с нашим основным генератором, чтобы выполнять их задачи в том же порядке. Для этого нам нужно только вызвать this.composeWith()function в задаче initializing, как показано ниже.

💡 Совет для профессионалов
Вы можете использовать файл конфигурации Yeoman .yo-rc.json для объединения данных от обоих генераторов.

Надеюсь, теперь вы можете попробовать создать свой собственный генератор микросервисов с помощью Yeoman. Я уверен, что стоит приложить дополнительные усилия, чтобы повысить скорость работы вашей команды.

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

использованная литература