Как бы вы начали новый проект микросервиса на TypeScript? Опишите основные шаги и инструменты, которые вы бы использовали для настройки проекта для быстрого прототипирования.
Подсказки:
- Подумайте о выборе фреймворка, например, Express.js, SvelteKit, Next.js, и какие ORM подходят для этих фреймворков. Объясните, почему некоторые фреймворки подходят для быстрого прототипирования, а другие — нет.
- Подумайте о повторном использовании существующей инфраструктуры балансировки нагрузки, мониторинга, развертывания с высокой доступностью.
- Подумайте о проектировании контракта API и стратегии тестирования с автотестами и e2e.
- Понимание подходов к разработке API-first и тестированию контрактов.
- Опыт работы с контейнерами для разработки и инфраструктурой как кодом.
Выше ожиданий:
- Опыт с observability инструментами и подходами (трейсинг, мониторинг).
- Уже есть опыт работы с Playwright.
Когда основная цель — быстрый прототипирование или минимальное время выхода на рынок, следует полагаться на инфраструктуру и технологии, которые уже доступны или известны команде. Добавление совершенно новых технологий или фреймворков добавляет ненужные риски и следует избегать.
Текст ниже описывает, как можно мыслить в случае нового проекта с нуля.
Выбор фреймворка
Выберите подходящий фреймворк для быстрого прототипирования. Рассмотрите следующие варианты:
- Express.js: Минимальный и гибкий фреймворк для веб-приложений Node.js. Он легкий и позволяет быстро настроить, что делает его идеальным для быстрого прототипирования. Express.js предоставляет мощный набор функций для веб- и мобильных приложений, включая маршрутизацию, поддержку middleware и лёгкую интеграцию с различными движками шаблонов.
- SvelteKit: Фреймворк для создания веб-приложений с помощью Svelte. SvelteKit обеспечивает быстрый процесс разработки с функциями, такими как рендеринг на стороне сервера, разделение кода и маршрутизация на основе файлов. Он известен своей простотой и производительностью, что делает его хорошим выбором для быстрого прототипирования.
- Next.js: Фреймворк React, который позволяет выполнять рендеринг на стороне сервера и генерировать статические сайты. Next.js предлагает отличное взаимодействие с разработчиками с такими функциями, как автоматическое разделение кода, оптимизированная производительность и встроенная поддержка CSS. Он подходит для быстрого создания полнофункциональных приложений.
Для быстрого прототипирования рекомендуется использовать Express.js или SvelteKit из-за их простоты и быстрого процесса настройки. Next.js, хотя и мощный, может добавить больше сложности, что может замедлить начальную фазу прототипирования.
Проектирование контракта API
Придерживайтесь API-First, чтобы спроектировать интерфейс микросервиса и поделиться контрактами API с клиентами до полной реализации.
- Используйте Спецификацию OpenAPI (ранее Swagger) для определения контракта API.
- Создайте файл
swagger.yaml
илиopenapi.json
, чтобы документировать конечные точки, структуры запросов/ответов и модели данных. - Рассмотрите использование таких инструментов, как Swagger UI, для интерактивной документации API.
Выбор базы данных и ORM
Выберите базу данных и инструмент ORM (Object-Relational Mapping) подходящий для быстрого прототипирования:
- Для реляционных баз данных рассмотрите PostgreSQL или MySQL.
- Для NoSQL БД MongoDB является популярным выбором.
- Используйте ORM, такой как TypeORM или Prisma, для проектов на TypeScript. Эти ORM обеспечивают типо-безопасность и упрощают операции с базой данных, ускоряя разработку.
Стратегия тестирования
Реализуйте стратегию тестирования для надёжного прототипирования и экономии времени на каждом цикле сборки и тестирования.
- Используйте Jest в качестве фреймворка для тестирования модулей и интеграционных тестов.
- Реализуйте интеграционные тесты для обеспечения совместимости API.
- Настройте тестирование по всему циклу (e2e) с использованием Playwright для автоматизированного тестирования браузера.
- Настройте CI/CD пайплайн с использованием инструментов, таких как Jenkins, GitHub Actions или GitLab CI, для автоматизации процессов тестирования и развертывания.
Контейнеры разработки
Используйте контейнеры разработки для согласованных сред разработки и образа Docker в качестве артефактов развертывания.
- Используйте Docker, чтобы контейнеризировать приложение и его зависимости.
- Используйте Docker Compose для описания и запуска среды приложения.
Для сред разработки и тестирования можно использовать Docker Compose для удобного развертывания и низких затрат на обслуживание.
Инфраструктура как код (IaC)
Реализуйте Инфраструктура как код для воспроизводимой и контролируемой версией инфраструктуры. Это может сэкономить много времени для запуска приложения на пустых серверах или стендах.
- Используйте инструменты, такие как Terraform, для определения и управления ресурсами облака.
- Создавайте скрипты IaC для подготовки необходимых ресурсов, таких как базы данных, балансировщики нагрузки и вычислительные инстансы. Это может быть Ansible, а не только Terraform.
- Храните скрипты IaC в системе управления версиями вместе с кодом приложения.
Важно убедиться, что инструменты и поставщики IaC уже зрелые, и мы не будем тратить время на устранение неполадок и отладку.
Observability и мониторинг
Настройте инструменты observability и мониторинга для лучшего понимания состояния сервиса, что помогает в поиске ошибок и устранении неполадок. Важно использовать существующую инфраструктуру для логов, метрик и трассировки. Реализуйте сбор логов и метрик с более высоким приоритетом из-за простоты этой задачи и высокой пользы.
- Реализуйте структурированный логирование с использованием библиотек, таких как Pino, для более лёгкого анализа логов.
- Используйте Prometheus для сбора метрик и Grafana для визуализации и оповещений.
- Реализуйте распределённое трейсинг с помощью инструментов, таких как Jaeger, для отслеживания запросов через сервисы.
Документация
Ведите документацию для микросервиса. Это позволит делиться информацией с коллегами и работать над проектом или функциональностью параллельно.
- Используйте инструменты, такие как Swagger UI или ReDoc, для генерации интерактивной документации API из спецификации OpenAPI.
- Документируйте архитектурные решения с помощью Записей архитектурных решений (ADR).
- Поддерживайте файл README.md с чёткими инструкциями по установке и запуску проекта.
Непрерывная интеграция и развертывание (CI/CD)
Настройте пайплайн CI/CD для автоматизированного тестирования и развертывания:
- Используйте Jenkins, GitHub Actions или GitLab CI для автоматизации процессов сборки, тестирования и развертывания.
- Реализуйте фича-флаги, чтобы обеспечить быстрое развертывание и откат функциональности.