BFF Java to Java Script
Я занимаюсь фронтенд‑разработкой и имею опыт миграции серверных решений между технологическими стеками. В этой статье поделюсь опытом переноса BFF‑сервиса с платформы Java Servlet на современный фреймворк NestJS (на базе Node.js и TypeScript), а также сопутствующей настройкой инфраструктуры и тестового покрытия.
Исходный проект
Исходный проект представляет собой веб‑приложение со следующими характеристиками:
- Фронтенд: реализован в виде SPA на базе Vue.js.
- Бэкенд‑для‑фронтенда (BFF): выполнен на Java Servlet.
- Сборка проекта: осуществляется с помощью Maven.
- Развёртывание: выполняется на сервере приложений Apache Tomcat.
- Процесс развёртывания: осуществлялся вручную путём копирования собранного артефакта (WAR‑файла) в соответствующую директорию на сервере.
- Тестирование: отсутствовало автоматизированное тестовое покрытие — все проверки выполнялись вручную либо через прямые запросы к API.
Такая архитектура требует аккуратной миграции серверной части без нарушения работы клиентского приложения. Ручной способ развёртывания и отсутствие тестов подчёркивают необходимость:
- автоматизации процессов сборки и развёртывания в новой инфраструктуре;
- внедрения комплексного тестового покрытия (юнит‑, интеграционные и E2E‑тесты) на этапе перехода на современный стек.
Актуальность задачи
Переход с Java Servlet на NestJS (при сохранении фронтенда на Vue.js, который будет размещаться через Nginx) обусловлен следующими преимуществами:
- Унификация стека: использование единого языка (TypeScript) на фронтенде и бэкенде упрощает командную разработку.
- Повышенная продуктивность: декларативный стиль NestJS, встроенная поддержка DI и модульности сокращают время на написание и поддержку кода.
- Богатая экосистема: npm‑пакеты и готовые решения для типичных задач (валидация, логирование, кеширование).
- Удобство тестирования: встроенная интеграция с Jest и возможностями мокирования.
- Гибкость развёртывания: лёгкость контейнеризации (Docker) и масштабирования в облачных средах. NestJS‑приложение запускается в отдельном Docker‑контейнере, что обеспечивает изолированность бизнес‑логики, удобство обновления и горизонтального масштабирования бэкенда, статический Vue.js‑фронтенд размещается в отдельном контейнере с Nginx, что гарантирует высокую производительность доставки статических ресурсов и гибкость настройки HTTP‑параметров.
Совместимость с существующей инфраструктурой
При этом важно сохранить совместимость с существующей инфраструктурой:
- аутентификация через NTLM (Windows Integrated Authentication);
- проксирование через Nginx с сохранением семантики запросов и заголовков;
- внедрение полного тестового покрытия, включая E2E‑тесты с имитацией NTLM‑аутентификации (в исходном проекте тесты отсутствовали).
Ключевые задачи:
- обеспечить бесшовный переход без потери функциональности для клиентов;
- сохранить совместимость с корпоративными политиками безопасности (NTLM);
- внедрить надёжное тестовое окружение для верификации работы сервиса после миграции;
- автоматизировать процессы сборки и развёртывания (в противовес ручному копированию файлов);
- предоставить практические рекомендации по устранению типичных проблем.
Структура гайда
Материал разбит на логические блоки:
Перенос BFF на NestJS
- Установка зависимостей express-ntlm:
$ npm install express-ntlm
- NTLM middleware:
import { Injectable, NestMiddleware } from '@nestjs/common'; import { Request, Response, NextFunction } from 'express'; import ntlm from 'express-ntlm'; @Injectable() export class NTLMMiddleware implements NestMiddleware { use(req: Request, res: Response, next: NextFunction) { return ntlm({ domain: process.env.DOMAIN, domaincontroller: process.env.DOMAIN_CONTROLLER, })(req, res, next); } } export class AppModule { configure(consumer: MiddlewareConsumer) { consumer.apply(NTLMMiddleware).forRoutes('*'); } }
- Установка зависимостей express-ntlm:
Настройка Nginx и NTLM
Конфигурация прокси и аутентификации.
- Nginx NTLM-модуль — это дополнительный модуль для веб-сервера Nginx, который позволяет реализовать аутентификацию по протоколу NTLM.
- Проверка версии Nginx:
$ nginx -v # nginx version: nginx/1.26.3
- Сборка и установка модуля (сокращённо).
- Настройка конфигурации:
{ upstream http_backend { server 127.0.0.1:8080; ntlm; } server { ... location /http/ { proxy_pass http://http_backend; proxy_http_version 1.1; proxy_set_header Connection ""; } }
Добавление тестов Cypress
Интеграция E2E‑тестов с поддержкой NTLM.
- Установка Cypress и плагина:
$ npm install cypress --save-dev $ npm install cypress-ntlm-auth --save-dev
- Настройка аутентификации NTLM в тестах.
- Установка Cypress и плагина:
Добавление Redis для кэширования и управления сессиями
Внедрение Redis при миграции BFF‑сервиса на NestJS позволит:
- снизить нагрузку на основную базу данных за счёт кэширования часто запрашиваемых данных;
- обеспечить масштабируемость при горизонтальном развёртывании нескольких инстансов NestJS‑приложения (общее хранилище сессий);
- реализовать фоновые задачи и очереди сообщений (при дальнейшем развитии системы);
- ускорить отклик API за счёт хранения промежуточных результатов вычислений.
Установка зависимостей:
$ npm install @nestjs/redis cache-manager redis $ npm install --save-dev @types/redis</pre>
Контейнеризация с Docker и Docker Compose
Создание образов и оркестрация сервисов:
- подготовка
Dockerfileдля NestJS‑приложения; - настройка
docker-compose.ymlдля локального развёртывания; - определение сервисов (приложение, Nginx);
- управление окружениями (dev/prod) через переменные окружения;
- сборка и запуск контейнеров;
- настройка томов и сетей для взаимодействия сервисов.
- подготовка
Внедрение CI/CD на базе GitLab Actions
Автоматизация процессов сборки, тестирования и развёртывания:
- создание файла конфигурации
.gitlab-ci.yml; - определение этапов пайплайна (
build,test,lint,deploy); - настройка заданий для запуска юнит‑тестов и E2E‑тестов;
- автоматизированная сборка Docker‑образов;
- развёртывание в тестовую и продакшн‑среды;
- настройка уведомлений о статусе сборок;
- работа с секретами и переменными окружения в GitLab;
- стратегии ветвления и триггеры для разных окружений (
merge request,main branch).
- создание файла конфигурации
Заключение и рекомендации
Итоги и направления дальнейшего развития:
- подведение итогов выполненной миграции;
- анализ достигнутых улучшений (производительность, масштабируемость, удобство поддержки);
- рекомендации по мониторингу и логированию в новой инфраструктуре;
- планы по дальнейшему развитию (добавление новых модулей, оптимизация производительности, расширение тестового покрытия);
- чек‑лист для будущих миграций аналогичных проектов.