Система разрабатывалась в рамках дисциплины “Высокопроизводительные системы” и в качестве pet-проекта для стажировки в Т-Банке в качестве Java-разработчика. Таже используется мной как демо-проект, например во время работы над моей ВКР.
Система включает в себя несколько основных сущностей: пользователи, продукты, заявки, теги и связи между пользователями и продуктами. Пользователи делятся на обычных пользователей (клиентов), менеджеров и админов. Клиенты могут:
- регистрироваться и авторизовываться (используется spring-security + JWT токен в хедере Authorization);
- создавать и просматривать продукты, к которым могут относиться как различные банковские услуги, например ипотечные и потребительские кредиты, так и какие-то небольшие товары при необходимости;
- добавлять новые заявки, в которых указан заявитель и продукт, который ему требуется (например, подача заявки определённым пользователем на определённый тип ипотечного кредита)
- добавлять и просматривать теги, которые нужны для классификации заявок («альфа-банк», «ипотека», «срочно» и т.д.)
- связываться с продуктами определённым образом (устанавлить роль относительно продукта) через сущность связи (самый наглядный пример -- определённый пользователь является владельцем определённого продукта (роль PRODUCT_OWNER), поэтому обладает большими правами на взаимодействие с ним).
Менеджеры могут изменять статус заявки (например, когда заявка начинает обрабатываться ставят ON_REVIEW, а когда заявка одобрена ставят APPROVED), админы же могут свободно изменять, удалять, обновлять все сущности, а также изменять роли других пользователей (например, повышать пользователя до роли менеджера или понижать обратно).
У сущности заявки также есть дополнительные внутренние сущности:
- документы, прикреплённые к конкретным заявкам (например, PDF-файл с заполненным заявлением на получение ипотечного кредита), для которых указывается их название, формат и место хранения;
- история заявки, в которой подробно указано, как, когда и кем менялся статус заявки
Система реализована в нескольких вариантах, отличающихся в первую очередь архитектурой (монолит Spring Boot; микросервисная архитектура; микросервисная архитектура, с микросервисами выполненными в соответствии с принципами чистой архитектуры), а также дополнительными функциональностями (например, в финальной версии внедрены такие технологии как Kafka и MinIO).
Ссылки на более ранние версии:
- https://github.com/KirillKrakov/bank-ticket-system-lab-1
- https://github.com/KirillKrakov/bank-ticket-system-lab-2
- https://github.com/KirillKrakov/bank-ticket-system-lab-3
Один из двух ведущих разработчиков проекта, отвечавший также за проектирование архитектуры при создании изначальной версии проекта и её доработку в дальнейшем (включая разработку и проведение модульных и интеграционных тестов). Кроме того я отвечал за развёртывание системы и ее системное тестирование.
Система написана на современном JVM стеке (Java 21 + Spring Boot) с использованием системы сборки Maven. Код более чем на 70% покрыт модульным и интеграционными тестами с использованием технологий testcontainers и junit-jupiter-api. Для взаимодействия с реляционной БД используется Spring Data JPA, а для хранения документов используется высокопроизводительное объектное хранилище MinIO, полностью совместимое с API Amazon S3. Развёртывание системы полностью автоматизировано через Docker. В качестве пользовательского интерфейса используется развёрнутая с помощью OpenApi 3 и Swagger интерактивная документация. Все микросервисы зарегистрированы в Eureka, их конфигурация автоматически определяется с помощью Config-Server. Доступ к микросервисам осуществляется через Spring Gateway, а для взаимодействия между ними используется Feign Client. Всего реализованы 3 системных микросервиса: config-server, service-discovery (Eureka), gateway и 6 микросервисов с бизнес-логикой:
- application-service для управления заявками, поступающими в банк;
- assignment-service, позволяющий задать определённую связь между услугами, предоставляемыми банком, и физическими или юридическими лицами (например, связь “исполнитель услуги”);
- file-service, контролирующих хранение и редактирование документов, связанных с конкретными заявками, услугами или физ. и юр. лицами;
- product-service для управления услугами, которые предоставляются банком;
- tag-service, позволяющий классифицировать заявки по различным группам в зависимости от выданного тега;
- user-service для регистрации и авторизации клиентов (физических и юридических лиц), а также сотрудников банка и админов системы.
Микросервисы были реализованы с помощью технологий, относящихся к реактивной Java (Reactor и R2DBC), безопасность данных гарантируется с помощью технологий Spring Security, а также использования JWT и алгоритмов хэширования. Уведомления пользователей реализованы с помощью Kafka, также эта технология используется для межсервисного асинхронного взаимодействия. Каждый из микросервисов реализован в соответствии с принципами чистой архитектуры.
docker-compose down -v # очистка всех томов docker-контейнера, т.е. удаление всех записей из БД
mvn -DskipTests package # сборка jar-файла
docker-compose up --build # запуск приложения
mvn -Dtest=*ServiceTest test # запуск всех unit-тестов
mvn -Dtest=*IntegrationTest test # запуск всех интеграционных тестов
mvn clean test jacoco:report # запуск всех тестов для формирования отчёта о покрытии кода- http://localhost:8080/v3/api-docs — OpenAPI спецификация (JSON)
- http://localhost:8080/swagger-ui/index.html — Swagger UI (интерактивный интерфейс)
Для ручной проверки запросов использовался Postman (в разделе Headers добавлен заголовок: Content-Type = application/json. Также можно создавать переменные в разделе Variables, например adminId, userId и т. д.)