Как собрать сервис автоматизации документов из трёх языков: практический разбор
Разбор архитектуры сервиса автоматизации дипломных приложений: Java API, Python-обработка Excel, XML-генерация и Docker Compose.
Современные серверные системы всё чаще проектируются не как единое приложение, а как набор небольших независимых сервисов, написанных на разных языках и объединённых общим протоколом. В этом разборе на примере сервиса автоматизации приложений к дипломам показано, какие инженерные решения стоят за такой «полиглот»-архитектурой и почему она оправдана для прикладной задачи.
Задача
Исходная работа рутинна: взять Excel-ведомость с дисциплинами, часами и оценками, проверить её на ошибки и выгрузить в строгий XML-формат. Ручная обработка занимает много времени и провоцирует ошибки, поэтому процесс имеет смысл автоматизировать.
Задача разбита на два сценария:
- сборка сводной таблицы с подсветкой проблемных ячеек;
- генерация XML-документа по заданному шаблону.
Архитектура: почему три модуля, а не один
Система намеренно разделена на три независимых сервиса вместо одного монолитного приложения.
- java-api — входной шлюз. Принимает HTTP-запросы и маршрутизирует задачи. Построен на лёгком фреймворке Takes: для шлюза достаточно минималистичного слоя, а не полновесного Spring.
- python-engine — модуль обработки таблиц на FastAPI совместно с pandas и openpyxl. Читает Excel, выявляет несоответствия и выделяет проблемные ячейки цветом.
- python-xml-engine — генератор XML по шаблону, также на FastAPI.
Такое разделение даёт практическую выгоду: каждый модуль можно дорабатывать и перезапускать отдельно. Python применяется там, где он силён в обработке данных, Java — в роли надёжного API-слоя. Каждый язык используется по своему прямому назначению.
Пример: подсветка ошибок в Excel
Наиболее показательный фрагмент — логика проверки ячеек. С помощью openpyxl сервис проходит по файлу и заливает цветом значения, которые выглядят подозрительно: пустые ячейки и символы ! и ?.
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
fill = PatternFill(start_color="FFC7CE",
end_color="FFC7CE",
fill_type="solid")
for row in ws.iter_rows():
for cell in row:
if cell.value in (None, "", "!", "?"):
cell.fill = fill # отметили проблему
Приём простой, но именно он экономит часы ручной сверки: проверяющему достаточно просмотреть выделенные ячейки, а не весь файл.
Docker: запуск одной командой
Три сервиса означают три потенциальные точки сбоя при настройке окружения. Эту сложность снимает Docker Compose: все модули описаны в docker-compose.yml, работают в общей сети и запускаются одной командой.
docker-compose up --build
Подход исключает ситуацию «работает только на моей машине» и ручную установку Java и Python. Воспроизводимое окружение здесь — не удобство, а требование к прикладному сервису.
Выводы
- Крупную задачу полезно разбивать на независимые сервисы.
- Языки можно сочетать, подбирая инструмент под конкретную подзадачу.
- Связка pandas и openpyxl эффективна для работы с Excel.
- Docker Compose превращает разнородный стек в единый воспроизводимый проект.
Доступность
Проект открыт под лицензией MIT и доступен без регистрации и ограничений: можно запустить демонстрационную версию, развернуть сервис локально или изучить исходный код.
- Демонстрация: пгту-ртф.рф
- Исходный код: github.com/nikita-konkin/diploma_supplement_service
Теги
Другие обновления по проекту
От Excel-ведомости до XML: как сервис собирает приложение к диплому по шагам
Пошаговый разбор алгоритма: разбор Excel, сопоставление дисциплин, подсветка проблемных ячеек и сборка XML.