Бэкенд-разработчик Java (Профессиональный уровень)

Станьте профессиональным бэкенд-разработчиком на Java: углублённое изучение Spring Boot, микросервисов, безопасности (Spring Security), работы с базами данных (JPA, Hibernate), REST API, Docker, CI/CD и оптимизации производительности. Реальные проекты, практика с архитектурой, тестирование (JUnit, Mockito) и деплой в продакшн. Для тех, кто хочет выйти на senior-уровень и работать в IT-компаниях мечты.

Курс предназначен для разработчиков, уже владеющих основами Java и имеющих опыт работы с веб-технологиями. Программа охватывает профессиональные аспекты бэкенд-разработки: Spring Boot, микросервисную архитектуру, безопасность, работу с базами данных, тестирование, CI/CD и деплой. Обучение построено на реальных кейсах и финальном проекте уровня middle.

 

Что предстоит пройти на курсе:

  • Архитектура приложений и паттерны проектирования
  • Spring Boot: REST API, MVC, Data, Security
  • Работа с базами данных: JPA, Hibernate, миграции (Flyway/Liquibase)
  • Микросервисы: Spring Cloud, REST, gRPC, контейнеризация (Docker)
  • Безопасность: OAuth2, JWT, Spring Security
  • Тестирование: JUnit 5, Mockito, интеграционные тесты
  • CI/CD: Git, GitHub Actions, Jenkins, автоматизация сборки
  • Производительность: кэширование (Redis), асинхронные задачи (Spring Async, Kafka)
  • Финальный проект: создание масштабируемого сервиса с полной логикой backend
 

Ожидаемые результаты после прохождения:
Должен знать:
— Архитектурные подходы (MVC, CQRS, REST, микросервисы)
— Принципы безопасности в enterprise-приложениях
— Инструменты CI/CD и DevOps-подходы
— Паттерны проектирования и принципы SOLID

 

Должен уметь:
— Разрабатывать и масштабировать сервисы на Spring Boot
— Создавать безопасные REST API с авторизацией
— Работать с реляционными и NoSQL базами данных
— Писать unit и интеграционные тесты
— Контейнеризировать приложения через Docker
— Настраивать автоматическую сборку и деплой

 

1. Что такое Spring Boot и как он упрощает разработку бэкенд-приложений?
Spring Boot — это фреймворк, позволяющий быстро создавать автономные, готовые к запуску приложения на базе Spring. Он автоматизирует конфигурацию, предоставляет embedded серверы, starter-зависимости и Actuator для мониторинга.

 

2. В чём отличие между Spring Framework и Spring Boot?
Spring Framework — это набор модулей для построения enterprise-приложений, требующих ручной настройки. Spring Boot добавляет автонастройку, встроенные серверы и упрощает старт проекта без XML-конфигураций.

 

3. Что такое микросервисная архитектура и зачем она нужна?
Микросервисная архитектура разбивает приложение на независимые, легко масштабируемые сервисы, которые взаимодействуют через API. Это позволяет обновлять части системы отдельно и повышает отказоустойчивость.

 

4. Как работает Spring Security и какие задачи он решает?
Spring Security обеспечивает безопасность приложений: аутентификация, авторизация, защита от CSRF, OAuth2, JWT. Позволяет гибко настраивать доступ к эндпоинтам.

 

5. Что такое JPA и чем он отличается от Hibernate?
JPA (Java Persistence API) — стандарт ORM для работы с БД. Hibernate — его реализация. JPA абстрагирует код от конкретной реализации, что делает его более переносимым.

 

6. Как работают миграции в базах данных и какие инструменты используются в курсе?
Миграции — это управляемое изменение схемы БД. Используются Flyway и Liquibase, которые позволяют применять изменения в строгом порядке при старте приложения.

 

7. Что такое REST API и как его реализовать в Spring Boot?
REST API — это стиль взаимодействия через HTTP-запросы. В Spring Boot реализуется через контроллеры (@RestController), аннотации @GetMapping, @PostMapping и DTO-объекты.

 

8. Как работает контейнеризация и зачем используется Docker в backend-разработке?
Docker создаёт изолированные окружения (контейнеры) для запуска приложений. Удобен для тестирования, деплоя и масштабирования сервисов в production.

 

9. Что такое CI/CD и как он реализуется в профессиональных Java-проектах?
CI/CD — это практика автоматизации сборки, тестирования и деплоя приложений. Реализуется через GitHub Actions, Jenkins, GitLab CI. Обеспечивает стабильность и скорость доставки изменений.

 

10. Какие паттерны проектирования наиболее часто применяются в enterprise-приложениях?
Среди популярных: Singleton, Factory, Strategy, Repository, Observer, Command, CQRS. Они помогают организовать логику, повысить читаемость и тестируемость кода.

 

11. Что такое ORM и как он связан с JPA?
ORM (Object-Relational Mapping) — это технология связи объектов Java с таблицами БД. JPA — стандарт ORM, реализуемый Hibernate, который скрывает SQL-логику.

 

12. Как происходит тестирование в профессиональных Java-приложениях?
Используются unit-тесты (JUnit 5), mock-объекты (Mockito), интеграционные тесты, тестирование API (TestRestTemplate, MockMvc), тестирование БД (Testcontainers).

 

13. Что такое Kafka и как он используется в бэкенд-разработке?
Kafka — это распределённый потоковый брокер, используемый для обработки событий в реальном времени. Применяется для асинхронного обмена данными между микросервисами.

 

14. Что такое Redis и где он применяется в backend-системах?
Redis — это in-memory хранилище ключ-значение. Используется как кэш, очередь сообщений или временное хранилище для повышения производительности.

 

15. Что такое контейнер orchestration и зачем нужен Kubernetes?
Kubernetes — это система оркестровки контейнеров. Он управляет жизненным циклом подов, обеспечивает балансировку нагрузки, самовосстановление и масштабирование микросервисов.

 

16. Как происходит работа с JWT в Spring Security?
JWT (JSON Web Token) — это формат токена для передачи данных между сервисами. В Spring Security используется для stateless-аутентификации: генерируется, проверяется и хранится на клиенте.

 

17. Что такое Swagger (OpenAPI) и зачем он нужен?
Swagger — это инструмент для документирования и тестирования REST API. OpenAPI — стандарт спецификации, которую поддерживает Swagger UI для удобного просмотра эндпоинтов.

 

18. Как работает сериализация и десериализация JSON в Spring?
Spring использует Jackson и Gson для преобразования Java-объектов в JSON и обратно. ObjectMapper автоматически выполняет эти операции при работе с REST API.

 

19. Что такое многопоточность и как её использовать в Spring?
Многопоточность — параллельное выполнение задач. В Spring реализуется через @Async, TaskExecutor, CompletableFuture, Scheduled Tasks для повышения производительности.

 

20. Что такое Dependency Injection и как он реализован в Spring?
DI — паттерн внедрения зависимостей, реализуемый через @Autowired, @Component, @Service. Spring управляется графом зависимостей и создаёт бины автоматически.

 

21. Что такое AOP и как он применяется в Spring?
AOP (Aspect-Oriented Programming) позволяет вынести перекрёстную логику (логирование, безопасность) в отдельные классы. В Spring реализуется через @Aspect и Pointcut.

 

22. Что такое Bean Life Cycle в Spring и как он работает?
Bean Life Cycle — это этапы создания, инициализации и уничтожения бина. Поддерживает методы init() / destroy(), @PostConstruct / @PreDestroy, InitializingBean / DisposableBean.

 

23. Что такое Transaction Management и как он настраивается в Spring?
Transaction Management управляет транзакциями БД. В Spring настраивается через @Transactional, обеспечивая ACID-свойства и откат при ошибке.

 

24. Что такое SOLID и как они применяются в Java-разработке?
SOLID — это принципы проектирования: Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation, Dependency Inversion. Они обеспечивают чистую архитектуру и тестируемость.

 

25. Какие инструменты и подходы используются для логирования в Spring Boot?
В Spring Boot используется java.util.logging, Logback и Log4j2. Также можно интегрировать ELK Stack (Elasticsearch, Logstash, Kibana) для централизованного логирования и аналитики.

 

26. Что такое Spring Data и как он упрощает работу с базами данных?
Spring Data — это проект, предоставляющий унифицированный доступ к различным типам хранилищ (SQL/NoSQL). Он автоматизирует CRUD-операции через репозитории, поддерживает пагинацию, сортировку и запросы по методам.

 

27. Как работает Spring Cloud и какие компоненты в него входят?
Spring Cloud предоставляет инструменты для микросервисных архитектур: Service Discovery (Eureka), Configuration Server, Gateway, Load Balancer (Ribbon), Circuit Breaker (Resilience4j/Hystrix).

 

28. Что такое контекст приложения в Spring и как он организован?
ApplicationContext — это центральный интерфейс, управляющий жизненным циклом бинов и зависимостями. Он создаётся из конфигураций (Java Config / XML) и содержит все зарегистрированные бины.

 

29. Что такое Flyway и как он используется в миграциях БД?
Flyway — это инструмент управления версиями БД. Позволяет применять SQL-скрипты при старте приложения, обеспечивая согласованность структуры базы между средами разработки и продакшена.

 

30. Что такое Liquibase и чем он отличается от Flyway?
Liquibase использует XML/YAML/JSON/SQL для описания изменений в БД. Поддерживает rollback, более гибок в управлении изменениями, но сложнее в настройке по сравнению с Flyway.

 

31. Что такое Spring WebFlux и в чём его отличие от Spring MVC?
Spring WebFlux — реактивный фреймворк, поддерживающий неблокирующий I/O и реактивные потоки (Reactor). В отличие от Spring MVC, основан на Netty или других реактивных серверах.

 

32. Что такое Reactor и как он связан с WebFlux?
Reactor — библиотека реактивного программирования, реализующая Reactive Streams. WebFlux использует Mono и Flux из Reactor для обработки асинхронных данных и событий.

 

33. Что такое REST и как он отличается от SOAP?
REST — это стиль архитектуры, основанный на HTTP и простом формате данных (JSON/XML). SOAP — протокол с жёсткой спецификацией, WSDL и тяжёлыми сообщениями, менее популярен в современных системах.

 

34. Что такое gRPC и когда его стоит использовать вместо REST?
gRPC — высокопроизводительный RPC-фреймворк, использующий протобуферы и HTTP/2. Используется, когда важна скорость, типизация и эффективная передача данных между сервисами.

 

35. Что такое Protobuf и как он используется в gRPC?
Protobuf (Protocol Buffers) — механизм сериализации данных от Google. Определяется .proto-файлами, позволяет генерировать DTO для разных языков, обеспечивает компактность и скорость.

 

36. Что такое Actuator в Spring Boot и как его использовать?
Actuator предоставляет метрики, информацию о здоровье, логи и другие точки мониторинга. Полезен для наблюдения за состоянием сервиса в production-среде.

 

37. Как происходит работа с кэшированием в Spring?
Spring Cache абстрагирует использование кэша через @EnableCaching, @Cacheable, @CacheEvict. Поддерживает реализации: Caffeine, Redis, Hazelcast, Ehcache.

 

38. Что такое Thread Pool и как он настраивается в Spring?
Thread Pool — пул потоков, управляющий выполнением задач. Настраивается через TaskExecutor, например ThreadPoolTaskExecutor, с указанием corePoolSize, maxPoolSize и queueCapacity.

 

39. Что такое Scheduled Tasks и как их настраивать в Spring?
Scheduled Tasks — фоновые задачи с расписанием. Реализуются через @Scheduled(fixedRate = 5000), поддерживает cron-выражения и fixedDelay.

 

40. Что такое Message Queue и какие системы используются в Java?
Message Queue — очередь сообщений для асинхронной обработки. В Java популярны Kafka, RabbitMQ, ActiveMQ, Amazon SQS. Интегрируются через Spring Kafka, Spring AMQP.

 

41. Что такое Event Driven Architecture и как её реализовать на Spring?
EDA — архитектура, основанная на обработке событий. Реализуется через ApplicationEventPublisher, @EventListener, Kafka или RabbitMQ для распределённых систем.

 

42. Что такое Saga Pattern и где он применяется?
Saga — шаблон распределённых транзакций, где каждое действие имеет обратную операцию отката. Применяется в микросервисах для обеспечения консистентности без двухфазного коммита.

 

43. Что такое Domain-Driven Design и как он помогает в проектировании?
DDD — подход к проектированию, ориентированный на бизнес-домен. Разделение на Value Object, Entity, Aggregate Root, Repository, Domain Events помогает создавать понятные и тестируемые модели.

 

44. Что такое Hexagonal Architecture и как она связана с DDD?
Hexagonal (Ports & Adapters) — архитектура, отделяющая бизнес-логику от внешних систем. Часто используется вместе с DDD для достижения тестируемости и независимости от технологий.

 

45. Что такое Clean Architecture и как её реализовать в Java?
Clean Architecture — принцип разделения уровней приложения: domain, use cases, interface adapters, framework layer. В Java реализуется через модульное разделение и Dependency Rule.

 

46. Что такое Testcontainers и зачем он нужен в тестировании?
Testcontainers — библиотека, позволяющая запускать Docker-контейнеры во время тестирования. Используется для тестирования с реальными БД, Kafka, Redis и другими внешними системами.

 

47. Что такое MockMvc и как он используется в тестировании контроллеров?
MockMvc — фреймворк для тестирования web-слоя без запуска сервера. Позволяет проверять контроллеры через perform(), andExpect(), andReturn().

 

48. Что такое Swagger UI и как он интегрируется в Spring Boot?
Swagger UI — веб-интерфейс для просмотра и тестирования API. Интегрируется через зависимости springdoc-openapi-ui, аннотации OpenAPI и автоматически генерируется по аннотациям контроллеров.

 

49. Что такое GraalVM и как он влияет на Java-приложения?
GraalVM — виртуальная машина, позволяющая компилировать Java/Kotlin в native-биндинги. Ускоряет старт, снижает потребление памяти, полезен для serverless-архитектур.

 

50. Что такое Micronaut и Quarkus, и в чём их преимущество перед Spring Boot?
Micronaut и Quarkus — легковесные фреймворки, оптимизированные под cloud-native приложения. Меньше времени на старт, меньше памяти, подходят для serverless и GraalVM.

 

51. Что такое CQRS и как он используется в архитектуре приложений?
CQRS (Command Query Responsibility Segregation) — паттерн, разделяющий операции чтения и записи. Позволяет оптимизировать производительность, использовать разные модели для изменения и получения данных, особенно полезен в микросервисах.

 

52. Что такое Event Sourcing и как он связан с CQRS?
Event Sourcing — подход к хранению состояния системы через запись всех изменений в виде событий. Часто используется вместе с CQRS для разделения логики записи (события) и чтения (представления).

 

53. Как Spring Boot поддерживает работу с NoSQL-базами данных?
Spring Boot предоставляет модули Spring Data для работы с MongoDB, Cassandra, Redis и другими NoSQL базами. Поддерживает репозитории, конверсию типов и интеграцию через соответствующие драйверы.

 

54. Что такое OpenTelemetry и как он применяется в микросервисах?
OpenTelemetry — стандарт для сбора метрик, трассировки и логов. Используется для мониторинга распределённых систем, позволяет отслеживать выполнение запроса между сервисами.

 

55. Что такое Zipkin и как он помогает в диагностике микросервисов?
Zipkin — система распределённой трассировки, которая собирает данные о времени выполнения запросов между сервисами, позволяет находить узкие места и ошибки в цепочке вызовов.

 

56. Что такое Circuit Breaker и как он реализуется в Spring Cloud?
Circuit Breaker — паттерн для повышения отказоустойчивости. В Spring Cloud реализуется через Resilience4j или Hystrix, автоматически блокирует дальнейшие запросы к нестабильному сервису.

 

57. Что такое Service Mesh и как он связан с Istio и Kubernetes?
Service Mesh — слой управления сетевыми коммуникациями между микросервисами. Istio — один из популярных инструментов Service Mesh, работающий поверх Kubernetes и обеспечивающий безопасность, маршрутизацию и мониторинг.

 

58. Что такое API Gateway и как он используется в микросервисных архитектурах?
API Gateway — точка входа для клиентов, которая маршрутизирует запросы к нужным микросервисам, обеспечивает аутентификацию, ограничение скорости, балансировку нагрузки и другие cross-cutting concerns.

 

59. Что такое Configuration Server и зачем он нужен в Spring Cloud?
Configuration Server — централизованное хранилище настроек для микросервисов. Позволяет управлять конфигурацией из одного места, например, через Git-репозиторий, и динамически обновлять параметры.

 

60. Что такое Sleuth и как он связан с трассировкой в микросервисах?
Spring Cloud Sleuth добавляет уникальный trace ID и span ID ко всем запросам, что позволяет связывать логи и метрики между микросервисами для анализа и диагностики.

 

61. Что такое Load Balancing и как он реализуется в Spring Cloud?
Load Balancing — распределение трафика между несколькими экземплярами сервиса. В Spring Cloud реализуется через Ribbon или Spring Cloud LoadBalancer, работает вместе с Eureka для обнаружения сервисов.

 

62. Что такое Service Discovery и как он реализуется в Spring Cloud?
Service Discovery — механизм обнаружения микросервисов в сети. Реализуется через Eureka, Consul или Zookeeper, позволяет сервисам находить друг друга без жёстко заданных адресов.

 

63. Что такое OAuth2 и как его использовать в Spring Security?
OAuth2 — протокол делегирования доступа. В Spring Security используется для реализации авторизации через сторонние провайдеры (Google, GitHub), позволяет выдавать токены и управлять правами.

 

64. Что такое Keycloak и как он интегрируется с Java-приложениями?
Keycloak — сервер идентичности с поддержкой OAuth2 и SAML. Интегрируется с Spring Security через адаптеры и фильтры, позволяет управлять пользователями, ролями и SSO.

 

65. Что такое Vault и как он используется для управления секретами?
Vault — инструмент для безопасного хранения и доступа к секретам (токены, пароли). Интегрируется с Spring Cloud через Spring Cloud Config и Vault Connector, шифрует данные и управляет политиками доступа.

 

66. Что такое Distributed Tracing и какие инструменты используются в Java-экосистеме?
Distributed Tracing — это метод отслеживания выполнения запроса по нескольким сервисам. В Java используются Sleuth, Zipkin, Jaeger и OpenTelemetry для построения графа вызовов.

 

67. Что такое Health Check и как его реализовать в Spring Boot?
Health Check — проверка работоспособности сервиса. В Spring Boot реализуется через Actuator/health, можно добавлять собственные проверки через AbstractHealthIndicator.

 

68. Что такое Circuit Breaker и как он влияет на отказоустойчивость микросервисов?
Circuit Breaker предотвращает каскадные сбои, временно блокируя вызовы к неработающим сервисам. Увеличивает стабильность системы и позволяет возвращать fallback-ответы.

 

69. Что такое Feature Toggles и как их реализовать в Spring Boot?
Feature Toggle — механизм включения/выключения функционала на лету. Реализуется через Spring Cloud Config, @ConditionalOnProperty, либо специальные библиотеки, такие как Togglz.

 

70. Что такое Blue-Green Deployment и как он помогает в CI/CD?
Blue-Green Deployment — стратегия развертывания, при которой запускаются две версии сервиса: старая (blue) и новая (green). После тестирования трафик переключается на green, минимизируя downtime.

 

71. Что такое Canary Release и как она отличается от A/B-тестирования?
Canary Release — постепенное внедрение нового кода для части пользователей. Отличается от A/B тем, что ориентирован на техническую стабильность, а не на сравнение UX-решений.

 

72. Что такое Infrastructure as Code и как он реализуется в профессиональных Java-проектах?
Infrastructure as Code — описание и управление инфраструктурой через код (Terraform, Ansible, Pulumi). Позволяет автоматизировать развёртывание сред и гарантирует согласованность окружений.

 

73. Что такое Service Mesh и как он взаимодействует с Java-микросервисами?
Service Mesh — инфраструктура для управления коммуникацией между микросервисами. Istio и Linkerd могут использоваться с Java-сервисами, работающими в Kubernetes, обеспечивая безопасность и трассировку.

 

74. Что такое Async Communication и как её организовать в Java-микросервисах?
Async Communication — асинхронное взаимодействие через очереди сообщений. Организуется через Kafka, RabbitMQ, Spring AMQP, Spring for Apache Kafka. Повышает отказоустойчивость и масштабируемость.

 

75. Что такое Saga Orchestration и как она отличается от Choreography?
Saga Orchestration — централизованное управление распределёнными транзакциями через оркестратора. В отличие от Choreography, где события обрабатываются каждым сервисом, Orchestration контролирует последовательность действий.

1. Какой из следующих принципов SOLID описывает, что классы должны быть открыты для расширения, но закрыты для изменения?
A) Single Responsibility Principle
B) Liskov Substitution Principle
C) Dependency Inversion Principle
D) Open-Closed Principle
Правильный ответ: Open-Closed Principle

 

2. Какая аннотация в Spring Boot используется для автоматической инъекции зависимостей?
A) @Inject
B) @Resource
C) @Autowired
D) Все вышеперечисленные
Правильный ответ: Все вышеперечисленные

 

3. Какой интерфейс Spring Data JPA позволяет использовать методы запросов по имени?
A) CrudRepository
B) PagingAndSortingRepository
C) JpaRepository
D) Все вышеперечисленные
Правильный ответ: Все вышеперечисленные

 

4. Какой из следующих компонентов не относится к Spring Cloud?
A) Config Server
B) Eureka
C) Gateway
D) Hibernate Validator
Правильный ответ: Hibernate Validator

 

5. Какое утверждение верно о микросервисной архитектуре?
A) Все сервисы развернуты в одном процессе
B) Сервисы работают независимо и общаются через API
C) Невозможно масштабировать отдельные части приложения
D) Это форма монолитной архитектуры
Правильный ответ: Сервисы работают независимо и общаются через API

 

6. Какой шаблон проектирования позволяет отделить бизнес-логику от представления данных?
A) Observer
B) Factory
C) Strategy
D) MVC (Model-View-Controller)
Правильный ответ: MVC (Model-View-Controller)

 

7. Какой тип тестирования проверяет взаимодействие с базой данных?
A) Unit-тестирование
B) Mock-тестирование
C) Интеграционное тестирование
D) Smoke-тестирование
Правильный ответ: Интеграционное тестирование

 

8. Какой механизм в Spring Security обеспечивает защиту от CSRF-атак?
A) JWT
B) OAuth2
C) CSRF Protection
D) Role-based Access
Правильный ответ: CSRF Protection

 

9. Какая библиотека используется в Spring Boot для работы с JSON?
A) Gson
B) Jackson
C) Moshi
D) Все вышеперечисленные
Правильный ответ: Все вышеперечисленные

 

10. Какой фреймворк не является частью Spring Cloud?
A) Spring Cloud Gateway
B) Spring Cloud Sleuth
C) Spring Cloud Config
D) Spring Web MVC
Правильный ответ: Spring Web MVC

 

11. Какой паттерн проектирования используется для управления созданием объектов?
A) Proxy
B) Adapter
C) Decorator
D) Factory Method
Правильный ответ: Factory Method

 

12. Какой уровень архитектуры отвечает за взаимодействие с пользователем или внешними системами?
A) Application Layer
B) Domain Layer
C) Infrastructure Layer
D) Presentation Layer
Правильный ответ: Presentation Layer

 

13. Какой стандарт используется для передачи токенов в stateless аутентификации?
A) OAuth 1.0
B) LDAP
C) SAML
D) JWT
Правильный ответ: JWT

 

14. Какой из следующих классов используется для реактивного программирования в Spring?
A) ResponseEntity
B) ModelAndView
C) Mono
D) HttpSession
Правильный ответ: Mono

 

15. Какой из следующих протоколов поддерживает работу с потоками данных в реальном времени?
A) REST
B) SOAP
C) HTTP/1.1
D) gRPC
Правильный ответ: gRPC

 

16. Какой инструмент используется для создания Docker-образов на основе Dockerfile?
A) Kubernetes
B) Jenkins
C) Docker CLI
D) Ansible
Правильный ответ: Docker CLI

 

17. Какой шаблон проектирования используется для реализации логики, которая может меняться независимо от основного кода?
A) Singleton
B) Template Method
C) Strategy
D) Builder
Правильный ответ: Strategy

 

18. Какой уровень архитектуры содержит адаптеры для взаимодействия с внешним миром?
A) Application Layer
B) Domain Layer
C) Infrastructure Layer
D) Presentation Layer
Правильный ответ: Infrastructure Layer

 

19. Какой подход к деплою предполагает одновременную замену старой версии новой?
A) Canary Release
B) Rolling Update
C) Recreate
D) Blue-Green Deployment
Правильный ответ: Recreate

 

20. Какой из следующих инструментов не является частью CI/CD?
A) GitHub Actions
B) GitLab CI
C) Jenkins
D) Swagger UI
Правильный ответ: Swagger UI

 

21. Какой из следующих механизмов позволяет выполнять задачи в фоновом режиме в Spring?
A) @Scheduled
B) @Async
C) TaskScheduler
D) Все вышеперечисленные
Правильный ответ: Все вышеперечисленные

 

22. Какой из следующих компонентов используется для централизованного управления конфигурациями в микросервисах?
A) Spring Cloud Gateway
B) Spring Cloud Sleuth
C) Spring Cloud Stream
D) Spring Cloud Config Server
Правильный ответ: Spring Cloud Config Server

 

23. Какой из следующих инструментов используется для сбора метрик и наблюдения за состоянием Java-приложений?
A) Kibana
B) Grafana
C) Prometheus
D) Micrometer
Правильный ответ: Micrometer

 

24. Какой из следующих терминов описывает ситуацию, когда система продолжает работать даже при частичных сбоях?
A) Scalability
B) Maintainability
C) Observability
D) Fault Tolerance
Правильный ответ: Fault Tolerance

 

25. Какой из следующих фреймворков не поддерживает native-компиляцию?
A) GraalVM Native Image
B) Quarkus
C) Micronaut
D) Spring Framework
Правильный ответ: Spring Framework

 

26. Какой из следующих принципов SOLID гласит, что абстракции не должны зависеть от деталей, а детали — от абстракций?
A) Single Responsibility Principle
B) Liskov Substitution Principle
C) Interface Segregation Principle
D) Dependency Inversion Principle
Правильный ответ: Dependency Inversion Principle

 

27. Какая аннотация в Spring Boot используется для создания бинов, которые управляются контейнером?
A) @Bean
B) @Component
C) @Service
D) Все вышеперечисленные
Правильный ответ: Все вышеперечисленные

 

28. Какой интерфейс в Spring Data JPA позволяет выполнять запросы с пагинацией и сортировкой?
A) CrudRepository
B) QueryByExampleExecutor
C) PagingAndSortingRepository
D) Repository
Правильный ответ: PagingAndSortingRepository

 

29. Какой из следующих инструментов не является частью экосистемы микросервисов Spring Cloud?
A) Eureka
B) Gateway
C) Config Server
D) Hibernate Validator
Правильный ответ: Hibernate Validator

 

30. Какое утверждение верно о монолитной архитектуре?
A) Поддерживает независимое масштабирование компонентов
B) Все модули развернуты как единое приложение
C) Используется только в современных cloud-native приложениях
D) Требует Service Mesh для взаимодействия между частями
Правильный ответ: Все модули развернуты как единое приложение

 

31. Какой шаблон проектирования позволяет объектам изменять поведение в зависимости от своего состояния?
A) Strategy
B) Observer
C) Command
D) State
Правильный ответ: State

 

32. Какой уровень архитектуры содержит бизнес-правила и логику домена?
A) Application Layer
B) Infrastructure Layer
C) Presentation Layer
D) Domain Layer
Правильный ответ: Domain Layer

 

33. Какой подход к деплою обеспечивает минимальное время простоя за счет параллельного запуска новых версий сервиса?
A) Rolling Update
B) Recreate
C) Canary Release
D) Blue-Green Deployment
Правильный ответ: Blue-Green Deployment

 

34. Какой из следующих фреймворков не поддерживает реактивное программирование?
A) Spring WebFlux
B) Micronaut
C) Quarkus
D) Spring MVC
Правильный ответ: Spring MVC

 

35. Какой стандарт используется для документирования REST API в Spring Boot по умолчанию?
A) RAML
B) Swagger UI
C) Postman
D) OpenAPI
Правильный ответ: OpenAPI

 

36. Какой из следующих терминов описывает процесс разделения логики чтения и записи?
A) Event Sourcing
B) Saga Pattern
C) CQRS (Command Query Responsibility Segregation)
D) Hexagonal Architecture
Правильный ответ: CQRS (Command Query Responsibility Segregation)

 

37. Какой механизм в Spring Security используется для защиты от повторных HTTP-запросов?
A) JWT
B) OAuth 2.0
C) CSRF Protection
D) Role-based Access Control
Правильный ответ: CSRF Protection

 

38. Какой класс в Spring Framework представляет собой центральный интерфейс для управления бинами?
A) BeanFactory
B) ApplicationContext
C) Environment
D) ResourceLoader
Правильный ответ: ApplicationContext

 

39. Какой из следующих типов тестирования проверяет работу всей системы в целом?
A) Unit-тестирование
B) Интеграционное тестирование
C) Mock-тестирование
D) End-to-end тестирование
Правильный ответ: End-to-end тестирование

 

40. Какая зависимость добавляет поддержку безопасности в Spring Boot?
A) spring-boot-starter-web
B) spring-boot-starter-data-jpa
C) spring-boot-starter-security
D) spring-boot-starter-test
Правильный ответ: spring-boot-starter-security

 

41. Какой из следующих протоколов использует gRPC для обмена данными между клиентом и сервером?
A) JSON
B) XML
C) HTTP/2
D) WebSocket
Правильный ответ: HTTP/2

 

42. Какой из следующих форматов используется по умолчанию для сериализации данных в REST API?
A) XML
B) YAML
C) JSON
D) CSV
Правильный ответ: JSON

 

43. Какой из следующих классов не относится к реализации реактивного программирования в Spring?
A) Flux
B) Mono
C) WebClient
D) ResponseEntity
Правильный ответ: ResponseEntity

 

44. Какой инструмент используется для централизованного управления секретами в распределённых системах?
A) Consul
B) Vault
C) AWS Secrets Manager
D) Все вышеперечисленные
Правильный ответ: Все вышеперечисленные

 

45. Какой из следующих методов жизненного цикла бина вызывается перед его уничтожением?
A) init()
B) afterPropertiesSet()
C) start()
D) @PreDestroy
Правильный ответ: @PreDestroy

 

46. Какой из следующих классов не относится к работе с базами данных в Spring?
A) JdbcTemplate
B) NamedParameterJdbcTemplate
C) WebClient
D) HibernateTemplate
Правильный ответ: WebClient

 

47. Какой из следующих компонентов не является частью Spring Cloud Stream?
A) Binder
B) Message Channel
C) Source and Sink
D) Flyway
Правильный ответ: Flyway

 

48. Какой из следующих принципов не относится к SOLID?
A) Single Responsibility
B) Open-Closed
C) Dependency Inversion
D) KISS
Правильный ответ: KISS

 

49. Какой из следующих терминов описывает ситуацию, когда система продолжает работать даже при частичных сбоях?
A) Scalability
B) Maintainability
C) Observability
D) Fault Tolerance
Правильный ответ: Fault Tolerance

 

50. Какой из следующих шаблонов используется для хранения истории всех изменений в системе?
A) CQRS
B) Event Sourcing
C) Saga
D) Repository
Правильный ответ: Event Sourcing

 

51. Какой из следующих инструментов не предназначен для работы с контейнерами?
A) Docker
B) Podman
C) Jenkins
D) Kubernetes
Правильный ответ: Jenkins

 

52. Какой из следующих терминов описывает процесс автоматического обновления конфигурации без перезапуска сервиса?
A) Hot Swap
B) Live Reload
C) Dynamic Configuration
D) Hot Deployment
Правильный ответ: Dynamic Configuration

 

53. Какой из следующих механизмов используется для реализации fallback-поведения в микросервисах?
A) Retry
B) Cache
C) Load Balancer
D) Circuit Breaker
Правильный ответ: Circuit Breaker

 

54. Какой из следующих инструментов не используется для трассировки в микросервисах?
A) Zipkin
B) Jaeger
C) Sleuth
D) Swagger UI
Правильный ответ: Swagger UI

 

55. Какой из следующих классов не используется для работы с HTTP-запросами в Spring?
A) RestTemplate
B) WebClient
C) TestRestTemplate
D) MockMvc
Правильный ответ: MockMvc

 

56. Какой из следующих протоколов не поддерживается в Spring Security?
A) OAuth2
B) JWT
C) LDAP
D) FTP
Правильный ответ: FTP

 

57. Какой из следующих компонентов не является частью Spring Cloud?
A) Gateway
B) Circuit Breaker
C) Distributed Configuration
D) Hibernate ORM
Правильный ответ: Hibernate ORM

 

58. Какой из следующих уровней архитектуры содержит логику, связанную с пользовательским интерфейсом или внешними API?
A) Domain Layer
B) Infrastructure Layer
C) Application Layer
D) Presentation Layer
Правильный ответ: Presentation Layer

 

59. Какой из следующих паттернов позволяет динамически добавлять поведение к объекту?
A) Adapter
B) Factory
C) Proxy
D) Decorator
Правильный ответ: Decorator

 

60. Какой из следующих терминов описывает систему, которая может эффективно обрабатывать рост нагрузки?
A) Fault Tolerant
B) Maintainable
C) Observable
D) Scalable
Правильный ответ: Scalable

 

61. Какой из следующих инструментов не используется для логирования в Java-приложениях?
A) Logback
B) SLF4J
C) Log4j2
D) Micrometer
Правильный ответ: Micrometer

 

62. Какой из следующих терминов описывает способность системы восстанавливаться после сбоев?
A) Observability
B) Scalability
C) Resilience
D) Modularity
Правильный ответ: Resilience

 

63. Какой из следующих фреймворков позволяет создавать native-образы из Java-приложений?
A) Quarkus
B) Micronaut
C) GraalVM Native Image
D) Все вышеперечисленные
Правильный ответ: Все вышеперечисленные

 

64. Какой из следующих шаблонов используется для организации коммуникации между микросервисами через события?
A) Request-Response
B) Polling
C) Event Driven Architecture
D) Monolithic Architecture
Правильный ответ: Event Driven Architecture

 

65. Какой из следующих терминов описывает подход, при котором каждый микросервис имеет собственную БД?
A) Shared Database
B) Centralized DB
C) Database per Service
D) Global Schema
Правильный ответ: Database per Service

 

66. Какой из следующих принципов означает, что клиенты не должны зависеть от интерфейсов, которые они не используют?
A) Single Responsibility Principle
B) Open-Closed Principle
C) Dependency Inversion Principle
D) Interface Segregation Principle
Правильный ответ: Interface Segregation Principle

 

67. Какая аннотация в Spring используется для создания REST-контроллера с обработкой HTTP-запросов?
A) @Controller
B) @Service
C) @Component
D) @RestController
Правильный ответ: @RestController

 

68. Какой из следующих классов используется для работы с базами данных в реактивном стиле в Spring?
A) JdbcTemplate
B) HibernateTemplate
C) R2DBC (Reactive Relational Database Connectivity)
D) NamedParameterJdbcTemplate
Правильный ответ: R2DBC (Reactive Relational Database Connectivity)

 

69. Какой из следующих инструментов не относится к мониторингу и трассировке микросервисов?
A) Sleuth
B) Zipkin
C) Prometheus
D) Vault
Правильный ответ: Vault

 

70. Какой тип аутентификации использует токены, выдаваемые сервером авторизации?
A) Basic Auth
B) Session-based Auth
C) API Key
D) OAuth 2.0 / JWT
Правильный ответ: OAuth 2.0 / JWT

 

71. Какой из следующих компонентов не является частью Spring Cloud Gateway?
A) Route
B) Predicate
C) Filter
D) Event Listener
Правильный ответ: Event Listener

 

72. Какой из следующих паттернов проектирования позволяет создавать семейства связанных объектов без указания их конкретных классов?
A) Factory Method
B) Abstract Factory
C) Builder
D) Prototype
Правильный ответ: Abstract Factory

 

73. Какой уровень архитектуры содержит логику приложения, но не бизнес-правила?
A) Domain Layer
B) Infrastructure Layer
C) Presentation Layer
D) Application Layer
Правильный ответ: Application Layer

 

74. Какое утверждение верно о контейнерной оркестровке?
A) Docker сам по себе обеспечивает оркестровку
B) Kubernetes управляет жизненным циклом контейнеров
C) Kubernetes работает только с Windows контейнерами
D) Оркестровка не требуется в монолитных системах
Правильный ответ: Kubernetes управляет жизненным циклом контейнеров

 

75. Какой из следующих протоколов использует бинарную сериализацию для повышения производительности?
A) JSON
B) XML
C) Protobuf
D) YAML
Правильный ответ: Protobuf

Экзаменационный билет №1

Теоретическая часть

  1. Опишите, как работает механизм транзакций в Spring и какие аннотации используются для управления транзакциями.
  2. Что такое микросервисная архитектура и какие её ключевые особенности?

Ответы на теоретическую часть:

  1. Механизм транзакций в Spring:
    Spring предоставляет декларативное управление транзакциями через аннотацию @TransactionalОна применяется к классам или методам, чтобы указать, что операция должна выполняться в рамках транзакции.

    • @Transactional автоматически открывает транзакцию перед началом метода и фиксирует изменения после его завершения.
    • Если метод выбрасывает исключение, транзакция откатывается.
    • Можно настраивать propagation (например, REQUIRES_NEWSUPPORTSи isolation level.
     

    2. Микросервисная архитектура:
    Микросервисная архитектура — это подход, при котором приложение состоит из множества небольших автономных сервисов, каждый из которых решает свою конкретную задачу.
    Ключевые особенности:

    • Каждый сервис независим (разработка, развертывание, масштабирование)
    • Обмен данными между сервисами происходит через API (REST, gRPC, сообщения)
    • Используется Service Discovery (Eureka), Config Server, Circuit Breaker
    • Поддерживает CI/CD и контейнеризацию (Docker, Kubernetes)
 

Практическая часть

Напишите REST контроллер в Spring Boot, который обрабатывает GET-запрос по адресу /users/{id} и возвращает JSON-объект пользователя. Предположите, что у вас есть репозиторий UserRepository с методом Optional<User> findById(Long id).

 

 

@RestController
@RequestMapping("/users")
public class UserController {

    private final UserRepository userRepository;

    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @GetMapping("/{id}")
    public ResponseEntity<User> getUserById(@PathVariable Long id) {
        return userRepository.findById(id)
                .map(ResponseEntity::ok)
                .orElseThrow(() -> new RuntimeException("User not found"));
    }
}

 

Экзаменационный билет №2

Теоретическая часть

  1. Что такое OpenAPI / Swagger и зачем они нужны в бэкенд-разработке? Приведите пример использования в Spring Boot.
  2. Что такое Circuit Breaker и как он используется в распределённых системах? Какие реализации доступны в Spring Cloud?
 

Ответы на теоретическую часть:

  1. OpenAPI / Swagger:
    OpenAPI — это стандарт описания REST API, позволяющий документировать эндпоинты, параметры, заголовки и типы ответов.
    Swagger UI — инструмент для визуализации этой документации.
    В Spring Boot используется через зависимость springdoc-openapi-ui
    Пример аннотации:
@GetMapping("/hello")
@Operation(summary = "Возвращает приветственное сообщение")
public String sayHello() {
    return "Hello!";
}

      2. Circuit Breaker — паттерн, используемый для повышения отказоустойчивости системы. Он временно блокирует вызовы к нестабильным сервисам, чтобы избежать каскадных сбоев.
Реализации в Spring Cloud:

  • Resilience4j
  • Hystrix (устаревший)
  • Используются аннотации: @CircuitBreaker@Bulkhead@RateLimiter
 

Практическая часть

Напишите пример конфигурации Spring Security, которая позволяет только авторизованным пользователям с ролью ADMIN получать доступ к эндпоинту /admin/**

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests()
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().permitAll()
            .and()
            .httpBasic();
        return http.build();
    }
}

 

Экзаменационный билет №3

Теоретическая часть

  1. Что такое Flyway и как он помогает в управлении миграциями баз данных?
  2. Какие преимущества дает использование Docker в профессиональной Java-разработке?
 

Ответы на теоретическую часть:

  1. Flyway:
    Flyway — это инструмент управления версиями баз данных. Позволяет применять SQL-скрипты в определённом порядке при старте приложения.
    Использует файлы миграций с префиксами:

    • V1__init.sql — версионированная миграция
    • R__common.sql — повторяемая миграция
  2. Преимущества Docker:

    • Упрощает развертывание приложений
    • Гарантирует одинаковое поведение окружения (dev, staging, prod)
    • Поддерживает изолированность сервисов
    • Интегрируется с Kubernetes и CI/CD
    • Упрощает запуск зависимостей (PostgreSQL, Redis, Kafka)
 

Практическая часть

Напишите пример Dockerfile для Spring Boot приложения, собранного в виде JAR-файлаapp.jar

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY app.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

 

Экзаменационный билет №4

Теоретическая часть

  1. Что такое AOP в Spring и как он может использоваться в бэкенд-приложении? Приведите примеры использования.
  2. Как работают JWT-токены и как они интегрируются в Spring Security?
 

Ответы на теоретическую часть:

  1. AOP (Aspect-Oriented Programming):
    AOP позволяет выносить перекрёстную логику (логирование, безопасность, транзакции) в отдельные классы (aspects).
    Используется через @Aspect@Pointcut@Around@Before@After
    Пример: логирование всех HTTP-запросов через @Around с выводом времени выполнения.

 

  1. JWT (JSON Web Token):
    JWT — это stateless токен, содержащий данные о пользователе и подпись.
    Интегрируется через фильтр в Spring Security:

    • Создаётся токен с помощью Jwts.builder()
    • Проверяется через Jwts.parser()
    • Фильтр добавляется в цепочку безопасности
 

Практическая часть

Реализуйте простой Spring Boot фильтр, который проверяет наличие заголовка X-API-Key и блокирует запрос, если он отсутствует.

@Component
public class ApiKeyFilter extends OncePerRequestFilter {

    private static final String API_KEY_HEADER = "X-API-Key";
    private static final String API_KEY_VALUE = "secret123";

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        String apiKey = request.getHeader(API_KEY_HEADER);
        if (apiKey == null || !apiKey.equals(API_KEY_VALUE)) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Invalid or missing API key");
            return;
        }
        filterChain.doFilter(request, response);
    }
}

 

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Autowired
    private ApiKeyFilter apiKeyFilter;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.addFilterBefore(apiKeyFilter, UsernamePasswordAuthenticationFilter.class);
        http.authorizeHttpRequests()
                .anyRequest().authenticated()
            .and()
                .httpBasic();
        return http.build();
    }
}

 

Экзаменационный билет №5

Теоретическая часть

  1. Что такое реактивное программирование и как оно реализовано в Spring WebFlux?
  2. В чём разница между Mono и Flux в Reactor? Приведите примеры использования.
 

Ответы на теоретическую часть:

  1. Реактивное программирование в Spring WebFlux:
    Реактивное программирование — это парадигма, ориентированная на асинхронную обработку данных.
    Spring WebFlux основан на Netty и поддерживает реактивную модель.
    Использует Mono и Flux из Reactor, позволяет создавать неблокирующие контроллеры.
  2. Разница между Mono и Flux:

    • Mono<T> — представляет 0 или 1 элемент. Используется для одиночных результатов (например, findById()
    • Flux<T> — представляет 0..N элементов. Используется для потоковых данных (например, findAll()
Примеры:
@GetMapping("/user/{id}")
public Mono<User> getUser(@PathVariable Long id) {
    return userService.findById(id);
}

@GetMapping("/users")
public Flux<User> getAllUsers() {
    return userService.findAll();
}

 

Практическая часть

Напишите пример Spring Boot контроллера, который возвращает Flux<String> с сообщениями, отправляемыми через WebSocket.

@RestController
public class WebSocketController {

    @GetMapping("/ws/messages")
    public Flux<String> getMessages() {
        return Flux.interval(Duration.ofSeconds(1))
                  .map(sequence -> "Сообщение #" + sequence);
    }
}
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
    // WebSocket не требует дополнительной настройки для работы с WebFlux
}

 

Экзаменационный билет №6

Теоретическая часть

  1. Что такое Spring Boot Actuator и какие возможности он предоставляет для мониторинга и управления приложением?
  2. Какие принципы SOLID вы использовали в своих Java-проектах и как они помогают в проектировании?

Ответы на теоретическую часть:

  1. Spring Boot Actuator — это набор конечных точек, которые предоставляют информацию о состоянии работающего приложения. Позволяет:

    • Мониторить здоровье сервиса /actuator/health
    • Получать метрики /actuator/metrics
    • Управлять логированием /actuator/loggers
    • Получать информацию о версии /actuator/info
    • Выполнять graceful shutdown Используется в production-окружениях для диагностики и интеграции с системами мониторинга.
  2. SOLID — пять основополагающих принципов объектно-ориентированного проектирования:

    • Single Responsibility Principle — один класс должен иметь только одну причину для изменения.
    • Open-Closed Principle — классы должны быть открыты для расширения, но закрыты для модификации.
    • Liskov Substitution Principle — объекты в программе должны быть заменяемыми на экземпляры их подклассов без нарушения корректности программы.
    • Interface Segregation Principle — клиенты не должны зависеть от методов, которые они не используют.
    • Dependency Inversion Principle — зависимости должны строиться на абстракциях, а не на конкретных реализациях.
 

Практическая часть

Напишите пример использования @CircuitBreaker в Spring Cloud (например, с Resilience4j), чтобы защитить вызов внешнего микросервиса /api/data

@Service
public class ExternalServiceClient {

    @CircuitBreaker(name = "externalService", fallbackMethod = "fallbackData")
    public String fetchData() {
        // Предположим, что здесь выполняется REST-вызов
        throw new RuntimeException("Внешний сервис недоступен");
    }

    private String fallbackData(Throwable t) {
        return "Fallback response: Service is down";
    }
}
@RestController
@RequestMapping("/data")
public class DataController {

    private final ExternalServiceClient client;

    public DataController(ExternalServiceClient client) {
        this.client = client;
    }

    @GetMapping
    public String getData() {
        return client.fetchData();
    }
}

 

Экзаменационный билет №7

Теоретическая часть

  1. Объясните, что такое CQRS и в каких случаях его стоит применять. Приведите примеры из практики.
  2. Что такое Event Sourcing и как он связан с CQRS?
 

Ответы на теоретическую часть:

  1. CQRS (Command Query Responsibility Segregation) — это шаблон архитектуры, который разделяет операции чтения и записи. Это позволяет:

    • Разным моделям данных обслуживать разные задачи
    • Отдельно масштабировать слой чтения и записи
    • Увеличивать производительность и гибкость
     

    Пример: интернет-магазин, где запись заказа происходит через Command, а вывод списка заказов — через отдельный Query сервис.

  2. Event Sourcing — подход к хранению состояния системы в виде последовательности событий. Каждое изменение фиксируется как новое событие, и текущее состояние формируется путём воспроизведения всех событий.
    Связан с CQRS тем, что часто используется вместе:

    • CQRS разделает команды и запросы
    • Event Sourcing обеспечивает источник данных для Query-модели
 

Практическая часть

Реализуйте простую DTO-модель UserDTO и соответствующий контроллер, возвращающий список пользователей по GET-запросу /api/users

public class UserDTO {
    private Long id;
    private String username;
    private String email;

    // Геттеры и сеттеры
}
@RestController
@RequestMapping("/api/users")
public class UserController {

    @GetMapping
    public List<UserDTO> getAllUsers() {
        return List.of(
            new UserDTO(1L, "Alice", "alice@example.com"),
            new UserDTO(2L, "Bob", "bob@example.com")
        );
    }
}

 

Экзаменационный билет №8

Теоретическая часть

  1. Что такое контейнерная оркестровка и как Kubernetes управляет жизненным циклом контейнеров?
  2. Как работают транзакции в базах данных и как они управляются в Spring?
 

Ответы на теоретическую часть:

  1. Контейнерная оркестровка — это автоматизация запуска, управления и масштабирования контейнеров.
    Kubernetes управляет:

    • Подами (группа контейнеров)
    • Сервисами (обслуживание сетевых запросов)
    • ReplicaSet / Deployment (обеспечение нужного числа реплик)
    • ConfigMap и Secret (хранение настроек и секретов)
  2. Транзакции в БД и Spring:
    Транзакции обеспечивают ACID-гарантии (Atomicity, Consistency, Isolation, Durability).
    В Spring используются:

    • Аннотация @Transactional
    • Можно указывать propagation (например, REQUIRES_NEWREQUIRED
    • Также можно управлять isolation level, timeout и rollbackFor

Практическая часть

Напишите пример метода репозитория JPA, который удаляет пользователя по ID, и пометьте его как транзакционный.

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    @Transactional
    @Modifying
    @Query("DELETE FROM User u WHERE u.id = ?1")
    void deleteById(Long id);
}

 

Экзаменационный билет №9

Теоретическая часть

  1. Что такое CI/CD и как он реализуется в Java-проектах? Приведите примеры инструментов.
  2. Охарактеризуйте работу с тестами в профессиональном уровне Spring: JUnit 5, Mockito, интеграционное тестирование.
 

Ответы на теоретическую часть:

  1. CI/CD (Continuous Integration / Continuous Delivery):

    • CI — автоматическое собирание и тестирование кода при каждом коммите
    • CD — автоматическое развертывание в staging или production
      Инструменты:
    • GitHub Actions
    • GitLab CI
    • Jenkins
    • CircleCI
  2. Работа с тестами в Spring:

    • JUnit 5 — фреймворк для написания unit-тестов
    • Mockito — инструмент для создания mock-объектов и проверки поведения
    • Интеграционное тестирование — полная проверка работы компонента, включая БД, через @DataJpaTest@WebMvcTest@SpringBootTestTestcontainers

Практическая часть

Напишите юнит-тест с использованием JUnit 5 и Mockito для проверки метода UserService.getUserById()

@ExtendWith(MockitoExtension.class)
public class UserServiceTest {

    @InjectMocks
    private UserService userService;

    @Mock
    private UserRepository userRepository;

    @Test
    void testGetUserById() {
        User user = new User(1L, "John", "john@example.com");
        when(userRepository.findById(1L)).thenReturn(Optional.of(user));

        Optional<User> result = userService.getUserById(1L);

        assertTrue(result.isPresent());
        assertEquals("John", result.get().getName());
        verify(userRepository, times(1)).findById(1L);
    }
}

 

кзаменационный билет №10

Теоретическая часть

  1. Что такое Hexagonal Architecture и как она связана с DDD?
  2. В чём разница между @Component@Service@Repository@Controller в Spring?
 

Ответы на теоретическую часть:

  1. Hexagonal Architecture (Ports and Adapters) — это архитектурный подход, при котором бизнес-логика отделена от внешних систем (БД, API, UI).
    Она хорошо сочетается с Domain-Driven Design (DDD), поскольку:

    • Доменная модель находится в центре
    • Все взаимодействия происходят через порты
    • Приложение становится тестируемым и независимым от технологий
  2. Аннотации в Spring:

    • @Component — универсальная аннотация для обнаружения и регистрации бинов
    • @Service — специализация @Component, применяется на уровне бизнес-логики
    • @Repository — специализация @Component, применяется на уровне доступа к данным, также переводит SQL-исключения в Spring DAO-исключения
    • @Controller — обрабатывает HTTP-запросы, возвращает View
    • @RestController — комбинация @Controller и @ResponseBodyвозвращает JSON напрямую
 

Практическая часть

Напишите пример application.yml конфигурации для Spring Boot приложения, подключающего PostgreSQL через Hibernate.

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/mydb
    username: postgres
    password: mysecretpassword
    driver-class-name: org.postgresql.Driver
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        use-new-id-generator-mappings: false
    database-platform: org.hibernate.dialect.PostgreSQLDialect

 

Экзаменационный билет №11

Теоретическая часть

  1. Что такое Event Driven Architecture и как она реализуется в микросервисах? Приведите примеры использования в Spring.
  2. Какие задачи решает Service Mesh и как он связан с Istio и Kubernetes?
 

Ответы на теоретическую часть:

  1. Event Driven Architecture (EDA) — это стиль архитектуры, при котором компоненты взаимодействуют через события (event-based). В микросервисах:

    • Позволяет строить слабосвязанные системы
    • Упрощает масштабирование и отказоустойчивость
    • Реализуется через Kafka, RabbitMQ, Spring Cloud Stream
     

    Пример: сервис заказов отправляет событие OrderCreatedEventкоторое обрабатывается сервисом оплаты.

  2. Service Mesh — это уровень управления коммуникацией между микросервисами. Он обеспечивает:

    • Трассировку вызовов
    • Балансировку нагрузки
    • Цепочки вызовов
    • Безопасность на уровне сервисов
     

    Istio — один из популярных инструментов Service Mesh, работающий поверх Kubernetes. Он добавляет такие функции, как:

    • Traffic management
    • Security policies
    • Observability

Практическая часть

Напишите пример использования @KafkaListener в Spring Boot для чтения сообщений из топика orders

@Service
public class OrderConsumer {

    @KafkaListener(topics = "orders", groupId = "order-group")
    public void consume(OrderEvent event) {
        System.out.println("Получено событие: " + event);
        // Обработка события
    }
}
@Configuration
@EnableKafka
public class KafkaConfig {
    // Конфигурация Kafka (bootstrap-servers, consumer/producer properties)
}

 

Экзаменационный билет №12

Теоретическая часть

  1. Охарактеризуйте работу с миграциями баз данных через Liquibase. Чем он отличается от Flyway?
  2. Что такое Reactive Streams и какие интерфейсы они предоставляют в Java?
 

Ответы на теоретическую часть:

  1. Liquibase — это инструмент управления версиями баз данных. Отличается от Flyway тем, что:

    • Использует XML / YAML / JSON файлы для описания изменений
    • Поддерживает rollback
    • Может работать с любыми СУБД без жёсткой привязки к SQL стандартам
    • Позволяет использовать changelog-файлы с разными типами изменений (createTable, addColumn и др.)
  2. Reactive Streams — спецификация для неблокирующего потокового программирования. Интерфейсы:

    • Publisher<T> — источник данных
    • Subscriber<T> — получатель данных
    • Subscription — управление подпиской
    • Processor<T,R> — одновременно Publisher и Subscriber
     

    Эти интерфейсы лежат в основе Reactor (Mono/Flux), RxJava и других реактивных библиотек.

Практическая часть

Напишите пример конфигурации Kafka Producer в Spring Boot через application.yml и Java-код.

spring:
  kafka:
    bootstrap-servers: localhost:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
@Service
public class KafkaProducerService {

    private final KafkaTemplate<String, String> kafkaTemplate;

    public KafkaProducerService(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void sendOrderEvent(String message) {
        kafkaTemplate.send("orders", message);
    }
}

 

Экзаменационный билет №13

Теоретическая часть

  1. Что такое Vault и как он используется для хранения секретов в распределённых системах?
  2. Какие метрики можно собирать в Spring Boot с помощью Micrometer?

Ответы на теоретическую часть:

  1. Vault — это система для безопасного хранения и управления секретами (токены, пароли, API-ключи). В распределённых системах:

    • Предоставляет динамические секреты
    • Интегрируется через Spring Cloud Config Server
    • Поддерживает шифрование и политики доступа
  2. Micrometer — метрический сборщик, поддерживающий Prometheus, Datadog, Atlas и другие системы. В Spring Boot собирает:

    • HTTP-запросы (latency, error rate)
    • JVM-метрики (heap usage, GC time)
    • Тайминги бизнес-операций
    • Счётчики успешных/неудачных операций

Практическая часть

Напишите пример REST контроллера, который сохраняет пользователя в БД через JPA репозиторий.

@RestController
@RequestMapping("/api/users")
public class UserController {

    private final UserRepository userRepository;

    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User savedUser = userRepository.save(user);
        return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
    }
}
@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Геттеры и сеттеры
}

 

Экзаменационный билет №14

Теоретическая часть

  1. Что такое Clean Architecture и как она применяется в Java-разработке?
  2. Как работает механизм @Async в Spring и какие требования предъявляются к его использованию?
 

Ответы на теоретическую часть:

  1. Clean Architecture — это подход к проектированию, где слои разделены по уровням абстракции:

    • Domain Layer — содержит бизнес-правила
    • Application Layer — координирует выполнение use-case'ов
    • Interface Adapters — преобразование данных
    • Framework & Drivers — внешние зависимости (Spring, Hibernate)
     

    Применяется для достижения тестируемости, гибкости и независимости от технологий.

  2. @Async позволяет выполнять методы асинхронно, вне основного потока. Работает через proxy и требует:

    • Включения @EnableAsync
    • Настройки пула потоков (TaskExecutor)
    • Не поддерживает вызовы внутри одного класса
    • Методы должны быть публичными
 

Практическая часть

Напишите пример Spring Boot сервиса, который использует @Async для выполнения длительной операции.

@Service
@EnableAsync
public class BackgroundTaskService {

    @Async
    public void performLongTask() {
        try {
            Thread.sleep(5000);
            System.out.println("Задача завершена");
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}
@RestController
@RequestMapping("/tasks")
public class TaskController {

    private final BackgroundTaskService taskService;

    public TaskController(BackgroundTaskService taskService) {
        this.taskService = taskService;
    }

    @GetMapping("/start")
    public String startTask() {
        taskService.performLongTask();
        return "Задача запущена";
    }
}

 

Экзаменационный билет №15

Теоретическая часть

  1. Что такое Saga Pattern и в чём его отличие от двухфазного коммита?
  2. Как реализовать Graceful Shutdown в Spring Boot?
 

Ответы на теоретическую часть:

  1. Saga Pattern — это шаблон распределённых транзакций, где каждая операция имеет обратную (компенсирующую) операцию. Отличается от двухфазного коммита тем, что:

    • Не блокирует ресурсы
    • Делегирует управление транзакцией бизнес-логике
    • Подходит для микросервисов и distributed systems
  2. Graceful Shutdown — корректное завершение работы приложения без потери данных. В Spring Boot:

    • Активируется через server.shutdown=graceful в application.yml
    • Используется SpringApplication.exit() или actuator/shutdown
    • Завершает текущие запросы перед остановкой
 

Практическая часть

Напишите пример конфигурации application.yml с включенным graceful shutdown и logging уровнем INFO.

logging:
  level:
    com.example: INFO

server:
  port: 8080
  shutdown: graceful

spring:
  lifecycle:
    timeout-per-shutdown-phase: 30s

(1) Кейс: "Сбой в микросервисе авторизации. Проблема с токенами и доступом к API"


Описание кейса

Вы — бэкенд-разработчик на уровне Middle, работающий в команде разработки сервиса электронной коммерции.
Ваш микросервис auth-service отвечает за:

  • Регистрацию и вход пользователей
  • Генерацию JWT-токенов
  • Проверку прав доступа к другим микросервисам через Gateway
 

Пользователи начали жаловаться, что после входа не могут получить доступ к эндпоинтам /api/user/me/api/cartполучая ошибку 403 Forbidden
Также вы замечаете увеличение количества запросов с подозрительными заголовками и падение производительности приложения.


Фрагменты исходного кода:

AuthController.java

@RestController
@RequestMapping("/api/auth")
public class AuthController {

    private final UserService userService;
    private final JwtUtil jwtUtil;

    public AuthController(UserService userService, JwtUtil jwtUtil) {
        this.userService = userService;
        this.jwtUtil = jwtUtil;
    }

    @PostMapping("/login")
    public String login(@RequestBody LoginRequest request) {
        User user = userService.findByEmail(request.getEmail());
        if (!user.getPassword().equals(hashPassword(request.getPassword()))) {
            throw new UnauthorizedException("Неверные учетные данные");
        }
        return jwtUtil.generateToken(user);
    }

    // ... другие методы
}

 

JwtUtil.java

@Component
public class JwtUtil {

    private static final String SECRET_KEY = "mysecretkey"; // Секретная строка

    public String generateToken(User user) {
        return Jwts.builder()
                .setSubject(user.getEmail())
                .claim("role", user.getRole())
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }

    public String extractUsername(String token) {
        return Jwts.parser().parseClaimsJws(token).getBody().getSubject();
    }

    public boolean validateToken(String token) {
        try {
            Jwts.parser().parseClaimsJws(token);
            return true;
        } catch (JwtException e) {
            return false;
        }
    }
}

 

SecurityConfig.java

 

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .addFilterBefore(new JwtFilter(), UsernamePasswordAuthenticationFilter.class)
            .authorizeHttpRequests()
            .requestMatchers("/api/auth/**").permitAll()
            .anyRequest().authenticated();

        return http.build();
    }
}

 

JwtFilter.java

 

public class JwtFilter extends OncePerRequestFilter {

    private final JwtUtil jwtUtil;

    public JwtFilter(JwtUtil jwtUtil) {
        this.jwtUtil = jwtUtil;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain filterChain)
            throws ServletException, IOException {
        String token = getTokenFromHeader(request);

        if (token != null && jwtUtil.validateToken(token)) {
            String email = jwtUtil.extractUsername(token);
            UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(email, null, new ArrayList<>());
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }

        filterChain.doFilter(request, response);
    }

    private String getTokenFromHeader(HttpServletRequest request) {
        String bearer = request.getHeader("Authorization");
        return bearer == null ? null : bearer.substring(7);
    }
}

 

Логи из production:

WARN  o.s.c.s.AbstractResourceBasedLimiter - Rate limit exceeded for user 'test@example.com'
ERROR i.j.p.JwtException - JWT signature does not match locally computed signature
INFO  c.e.auth.JwtFilter - Invalid or expired token provided
DEBUG c.e.a.AuthController - Password comparison took 800ms for test@example.com

Анализ ситуации и выявление проблем


Проблема №1: Пароль хранится в БД в виде открытого текста

Риск: Если база данных будет скомпрометирована, злоумышленники смогут использовать данные напрямую.

Решение: Используйте безопасное хэширование паролей. Например, BCrypt:

@Autowired
private PasswordEncoder passwordEncoder;

// Сравнение пароля
if (!passwordEncoder.matches(rawPassword, storedHashedPassword)) {
    throw new UnauthorizedException("Неверный пароль");
}

Добавьте бин в конфигурацию:

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

 

Проблема №2: Использование простого секретного ключа для подписи JWT

Риск: Простой ключ подвержен атакам перебора, что угрожает безопасности всей системы.

Решение: Укажите более сложный ключ, длиной не менее 256 бит:

private static final String SECRET_KEY = Base64.getEncoder().encodeToString("strong-secret-key-for-jwt!".getBytes());

 

Проблема №3: Отсутствие проверки ролей пользователя при авторизации

Риск: Все пользователи могут получить доступ ко всем эндпоинтам, даже если они не имеют соответствующих прав.

Решение: Добавьте роли в Authentication объект:

Collection<? extends GrantedAuthority> authorities = 
        Collections.singletonList(new SimpleGrantedAuthority("ROLE_" + user.getRole()));
UsernamePasswordAuthenticationToken authentication = 
        new UsernamePasswordAuthenticationToken(email, null, authorities);

А в контроллере используйте аннотации Spring Security:

@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin/panel")
public ResponseEntity<?> adminPanel() { ... }

 

Проблема №4: Не указано время жизни токена

Риск: Даже при компрометации токена он может использоваться злоумышленниками долгое время.

Решение: Добавьте срок действия токена:

String expiration = "86400000"; // 24 часа
Jwts.builder()
   .setExpiration(new Date(System.currentTimeMillis() + Long.parseLong(expiration)))
   .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
   .compact();

 

Проблема №5: Метод .equals() используется для сравнения паролей

Риск: Уязвимость к timing-атакам, позволяет определить часть пароля по времени ответа.

Решение: Используйте PasswordEncoder.matches() вместо String.equals()

if (!passwordEncoder.matches(rawPassword, storedPassword)) {
    throw new UnauthorizedException("Неверный пароль");
}

 

Проблема №6: Долгое выполнение метода сравнения паролей

Риск: Может быть использовано для DoS-атак или замедления работы сервиса.

Решение: Измеряйте время выполнения и логируйте медленные операции. Используйте AOP для мониторинга:

@Around("execution(* com.example.auth.service.AuthController.login(..))")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
    long start = System.currentTimeMillis();
    Object result = joinPoint.proceed();
    long executionTime = System.currentTimeMillis() - start;
    if (executionTime > 500) {
        logger.warn("Медленная операция: {} ms", executionTime);
    }
    return result;
}

 

Проблема №7: Отсутствует защита от частых попыток входа

Риск: Возможны brute-force атаки на аккаунты пользователей.

Решение: Настройте Rate Limiting, например, через Resilience4j:

resilience4j.ratelimiter:
  instances:
    loginLimiter:
      limitForPeriod: 5
      periodDuration: 10s
      timeoutDuration: 0

Пример использования:

@CircuitBreaker(name = "loginService", fallbackMethod = "loginFallback")
@RateLimiter(name = "loginLimiter")
@PostMapping("/login")
public String login(@RequestBody LoginRequest request) {
    // логика
}

 

Проблема №8: Обработка токена не добавляет его в контекст безопасности

Риск: Даже при валидном токене система не знает, кто пользователь и с какими правами он залогинился.

Решение: Правильно передавайте аутентификационные данные:

String token = getTokenFromHeader(request);
if (token != null && jwtUtil.validateToken(token)) {
    String email = jwtUtil.extractUsername(token);
    Collection<? extends GrantedAuthority> authorities = getAuthoritiesFromToken(token);
    Authentication auth = new UsernamePasswordAuthenticationToken(email, null, authorities);
    SecurityContextHolder.getContext().setAuthentication(auth);
}

 

Проблема №9: В коде нет обработки исключений в фильтре

Риск: Сервис может падать из-за непредвиденных ситуаций, таких как отсутствие заголовка Authorization или поврежденный токен.

Решение: Добавьте защиту в фильтр:

@Override
protected void doFilterInternal(HttpServletRequest request,
                                HttpServletResponse response,
                                FilterChain filterChain)
        throws ServletException, IOException {
    try {
        String token = getTokenFromHeader(request);
        if (token != null && jwtUtil.validateToken(token)) {
            authenticateUser(request, token);
        }
    } catch (JwtException e) {
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid or expired token");
        return;
    }
    filterChain.doFilter(request, response);
}

 

Проблема №10: Нет механизмов восстановления при сбое

Риск: При сбое внешней зависимости (например, Redis, UserService), сервис может полностью отказать.

Решение: Добавьте Circuit Breaker (например, с помощью Resilience4j):

@CircuitBreaker(name = "userService", fallbackMethod = "fallbackResponse")
@GetMapping("/user/me")
public User getCurrentUser() {
    return userService.getCurrentUser();
}

private User fallbackResponse(Throwable t) {
    throw new ServiceUnavailableException("UserService недоступен", t);
}

Итоговые рекомендации по доработке

 

Обучающие моменты

  • Безопасная работа с токенами
  • Применение принципов безопасности в enterprise-приложениях
  • Обнаружение и исправление уязвимостей
  • Использование подходящих практик: JWT, Spring Security, Rate Limiter, Circuit Breaker
  • Интеграция инструментов: JJWT, BCrypt, Resilience4j
  • Разработка с учётом возможной компрометации

 

2) Кейс: "Падение производительности микросервиса. Проблема с базой данных и медленными запросами"


Описание ситуации

Вы — бэкенд-разработчик уровня Middle, работающий над системой заказов в онлайн-магазине на Spring Boot + PostgreSQL.

Ваш микросервис order-service отвечает за:

  • Создание заказов
  • Получение истории заказов пользователя
  • Обновление статуса заказа
 

На днях команда получила жалобы от пользователей:

  • Заказы создаются слишком медленно
  • Страница с историей заказов загружается более 10 секунд
  • Иногда сервис возвращает ошибки 504 Gateway Timeout
 

В логах вы замечаете следующие сообщения:

WARN  o.h.e.j.s.SqlExceptionHelper - SQL Warning:  Long running query detected
INFO  c.e.o.service.OrderService - Query took 8s for user 1234
ERROR o.a.c.c.Catalina - Thread pool is exhausted!
 

Фрагменты исходного кода

 

OrderController.java

 

@RestController
@RequestMapping("/api/orders")
public class OrderController {

    private final OrderService orderService;

    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }

    @PostMapping
    public ResponseEntity<OrderDTO> createOrder(@RequestBody OrderRequest request) {
        return ResponseEntity.ok(orderService.createOrder(request));
    }

    @GetMapping("/{userId}")
    public ResponseEntity<List<OrderDTO>> getOrdersByUserId(Long userId) {
        return ResponseEntity.ok(orderService.getOrdersByUserId(userId));
    }
}

 

OrderService.java

 

@Service
public class OrderService {

    private final OrderRepository orderRepository;
    private final ProductServiceClient productClient;

    public OrderService(OrderRepository orderRepository, ProductServiceClient productClient) {
        this.orderRepository = orderRepository;
        this.productClient = productClient;
    }

    public OrderDTO createOrder(OrderRequest request) {
        Product product = productClient.getProductById(request.getProductId());
        if (product == null || !isProductInStock(product)) {
            throw new RuntimeException("Товар недоступен");
        }

        Order order = new Order();
        order.setUserId(request.getUserId());
        order.setProductId(request.getProductId());
        order.setStatus("pending");
        order.setCreatedAt(new Date());

        return OrderDTO.from(orderRepository.save(order));
    }

    public List<OrderDTO> getOrdersByUserId(Long userId) {
        List<Order> orders = orderRepository.findByUserIdWithProducts(userId);
        return orders.stream().map(OrderDTO::from).toList();
    }

    private boolean isProductInStock(Product product) {
        try {
            Thread.sleep(200); // имитация вызова внешнего API
        } catch (InterruptedException ignored) {}
        return product.getStock() > 0;
    }
}

 

OrderRepository.java

 

public interface OrderRepository extends JpaRepository<Order, Long> {

    @Query("SELECT o FROM Order o JOIN FETCH o.product WHERE o.userId = :userId")
    List<Order> findByUserIdWithProducts(@Param("userId") Long userId);
}

 

ProductServiceClient.java (REST клиент)

@Component
public class ProductServiceClient {

    private final RestTemplate restTemplate;

    public ProductServiceClient(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public Product getProductById(Long id) {
        String url = "http://product-service/api/products/" + id;
        return restTemplate.getForObject(url, Product.class);
    }
}

 

 

Анализ ситуации и выявление возможных причин


Проблема №1: Синхронный REST-вызов к product-service внутри createOrder()

Риск: Высокое время ожидания блокирует поток, что приводит к переполнению пула потоков под высокой нагрузкой.

Решение: Переписать вызов через @Async или использовать реактивные клиенты WebClient

@Async
public CompletableFuture<Product> getProductByIdAsync(Long id) {
    String url = "http://product-service/api/products/" + id;
    return CompletableFuture.completedFuture(restTemplate.getForObject(url, Product.class));
}

Использование:

CompletableFuture<Product> productFuture = productService.getProductByIdAsync(request.getProductId());
productFuture.thenAccept(product -> { /* обработка */ });

 

Проблема №2: Медленный метод isProductInStock()

Риск: Искусственная задержка (Thread.sleep()) и синхронная проверка запасов замедляют обработку заказов.

Решение: Удалить искусственную задержку и использовать асинхронную проверку:

 

@Async
public CompletableFuture<Boolean> isProductAvailable(Long productId) {
    return CompletableFuture.supplyAsync(() -> {
        Product product = getProductById(productId);
        return product != null && product.getStock() > 0;
    });
}

 

Проблема №3: Тяжёлый N+1 запрос в findByUserIdWithProducts()

Риск: При использовании JOIN может быть избыточная нагрузка на БД, особенно если у пользователя много заказов.

Решение: Оптимизировать запрос через @EntityGraphчтобы загрузить связи одним запросом:

@EntityGraph(attributePaths = "product", type = EntityGraph.EntityGraphType.FETCH)
@Query("SELECT o FROM Order o WHERE o.userId = :userId")
List<Order> findByUserIdWithProducts(@Param("userId") Long userId);

 

Проблема №4: Отсутствие кэширования для часто используемых данных

Риск: Постоянный запрос одного и того же продукта замедляет систему.

Решение: Добавить кэширование через @Cacheable

@Cacheable("products")
public Product getProductById(Long id) {
    String url = "http://product-service/api/products/" + id;
    return restTemplate.getForObject(url, Product.class);
}
@Configuration
@EnableCaching
public class CachingConfig {}

 

Проблема №5: Отсутствие пагинации при выборке заказов

Риск: Если у пользователя тысячи заказов, он получает огромный ответ и медленный отклик.

Решение: Добавить пагинацию:

@GetMapping("/{userId}")
public ResponseEntity<Page<OrderDTO>> getOrdersByUserId(@PathVariable Long userId, Pageable pageable) {
    return ResponseEntity.ok(orderService.getOrdersByUserId(userId, pageable));
}

В сервисе:

public Page<OrderDTO> getOrdersByUserId(Long userId, Pageable pageable) {
    return orderRepository.findByUserId(userId, pageable).map(OrderDTO::from);
}

 

Проблема №6: Нет ограничений на частоту запросов

Риск: Сервис может быть взломан через DDoS-атаку или автоматические скрипты.

Решение: Добавить Rate Limiting через Resilience4j:

resilience4j.ratelimiter:
  instances:
    productLimiter:
      limitForPeriod: 10
      periodDuration: 10s

Использование:

@RateLimiter(name = "productLimiter")
public Product getProductById(Long id) {
    String url = "http://product-service/api/products/" + id;
    return restTemplate.getForObject(url, Product.class);
}

 

Проблема №7: Нет Circuit Breaker для внешних вызовов

Риск: При сбое product-service вся система останавливается.

Решение: Интеграция Resilience4j:

@CircuitBreaker(name = "productService", fallbackMethod = "fallbackProduct")
public Product getProductById(Long id) {
    String url = "http://product-service/api/products/" + id;
    return restTemplate.getForObject(url, Product.class);
}

private Product fallbackProduct(Long id, Throwable t) {
    log.warn("Fallback для продукта {}", id);
    return null;
}

 

Проблема №8: Нет логирования времени выполнения операций

Риск: Сложно диагностировать узкие места без метрик.

Решение: Использование AOP для логирования времени выполнения:

@Aspect
@Component
public class PerformanceLoggerAspect {

    @Around("execution(* com.example.order.service.OrderService.*(..))")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long executionTime = System.currentTimeMillis() - start;
        if (executionTime > 500) {
            log.warn("Медленная операция: {} ms | Method: {}", executionTime, joinPoint.getSignature());
        }
        return result;
    }
}

 

Проблема №9: Нет индексов в БД для поля userId

Риск: SELECT по userId выполняется медленно.

Решение: Добавить индекс в таблицу orders

CREATE INDEX idx_orders_user_id ON orders(user_id);

 

Проблема №10: Нет пула соединений к БД

Риск: Подключение к БД неэффективно, особенно под нагрузкой.

Решение: Настройка HikariCP в application.yml

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/orderdb
    username: postgres
    password: pass
    hikari:
      maximum-pool-size: 10
      connection-timeout: 20000
      idle-timeout: 30000
      max-lifetime: 180000

 

Обучающие моменты

  • Диагностика и оптимизация работы с БД
  • Асинхронное программирование в Spring
  • Кэширование и пагинация
  • Защита от перегрузки (Rate Limiting, Circuit Breaker)
  • Логирование и мониторинг производительности

Ролевая игра №1: "Спасите сервис! Производственная авария в онлайн-магазине"


Цель игры:

Повысить навыки диагностики и устранения критических ситуаций в микросервисной архитектуре, развить командную работу и применение профессиональных инструментов (Spring Boot, Docker, Kubernetes, Grafana, Prometheus, Resilience4j).

 

Формат игры:

  • Тип: Ролевая симуляция реального инцидента
  • Участники: 5–7 человек в команде (можно разделить на 2 команды для соревнования)
  • Длительность: 1.5 – 2 академических часа
  • Платформа: Офлайн или онлайн (Zoom/MS Teams + Miro / Notion / Trello)
  • Необходимые материалы:
    • Документация по системе
    • Пример логов
    • Postman-коллекция запросов
    • Структура сервисов
 

Сеттинг:

Вы — часть команды бэкенд-разработчиков в стартапе "OnlineShop" , который управляет интернет-магазином на Spring Boot.

Вас вызвали на экстренное совещание:

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

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

 

Роли в команде:

Роль
Ответственность
Team Lead / Architect
Организует процесс, принимает ключевые решения, следит за сроками
Backend Developer 1
Анализирует Java-код, ищет проблемы в бизнес-логике и БД
Backend Developer 2
Проверяет REST API, токены, безопасность, маршруты
DevOps Engineer
Изучает логи, мониторинг, состояние контейнеров
QA / Tester
Тестирует API, воспроизводит сценарии, проверяет исправления
SRE / Observability Specialist
Использует метрики из Grafana / Prometheus, анализирует производительность

Этапы игры:

1. Инцидент 

  • Команда получает описание ситуации.
  • Представляются логи, метрики, примеры запросов.
  • Цель: понять масштаб проблемы и начать диагностику.
 

2. Анализ системы 

  • Каждый участник изучает свою часть:
    • Логи приложения
    • Метрики CPU / RAM / DB
    • Состояние контейнеров
    • API-запросы
  • Выдвигаются гипотезы о причинах сбоя.
 

3. Обсуждение и поиск решений 

  • Команда обсуждает найденные проблемы.
  • Предлагает исправления:
    • Настройка пула соединений
    • Асинхронная обработка
    • Rate limiting
    • Кэширование
  • Обсуждается влияние изменений на стабильность.
 

4. Презентация и отчет 

  • Команда представляет:
    • Что произошло?
    • Какие действия были выполнены?
    • Какие изменения внедрены?
    • Какие меры профилактики предложены?
 

Обучающие эффекты:

  • Диагностика и расследование инцидентов
  • Чтение логов, метрик и графиков (Prometheus, Grafana)
  • Применение Circuit Breaker, Rate Limiter, Async, Caching
  • Работа с микросервисами и распределёнными системами
  • Понимание принципов отказоустойчивости и производительности
  • Командная работа и принятие решений под давлением
 

Возможные проблемы во время игры:

Возможная проблема
Как решить
Команда не может договориться о приоритетах
Установить Team Lead и использовать таймер
Не хватает знаний по метрикам
Провести короткий брифинг перед игрой
QA не может воспроизвести проблему
Предоставить Postman-коллекцию с тестовыми сценариями
DevOps не знаком с контейнерами
Подготовить чек-лист по Docker/Kubernetes
Backend не знает, как читать логи
Предоставить шаблон анал

 

 

Ролевая игра №2: "Инцидент в системе авторизации. Сбой токена, утечка данных"

 

Цель игры:

Повысить навыки диагностики и устранения критических инцидентов в системах безопасности.
Развить понимание уязвимостей, применение защитных мер и работу с аутентификацией/авторизацией на профессиональном уровне.

 

Формат игры:

  • Тип: Ролевая симуляция реального инцидента (security incident)
  • Участники: 4–6 человек в команде
  • Длительность: 1.5 – 2 академических часа
  • Платформа: Офлайн или онлайн (Zoom / MS Teams + Miro / Notion)
  • Необходимые материалы:
    • Пример кода auth-service с проблемами
    • Логи из production
    • Postman-коллекция с тестами
    • Документация по системе
 

Сеттинг:

Вы — часть команды разработчиков компании "SecureTech" , которая управляет платформой SaaS для управления проектами.

Сегодня утром команда получила экстренное сообщение:

«Обнаружены подозрительные входы в аккаунты пользователей. Некоторые токены действуют бесконечно. В логах есть признаки brute-force атаки. Нужно быстро найти источник угрозы и остановить возможную утечку».

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

 

Роли в команде:

Роль
Ответственность
Security Lead / Architect
Организует расследование, принимает решения по безопасности
Backend Developer 1
Анализирует Java-код сервиса авторизации
Backend Developer 2
Проверяет безопасность работы с JWT и Spring Security
QA / Tester
Тестирует API, воспроизводит сценарии, проверяет исправления
DevOps / Infra Engineer
Изучает логи, метрики, состояние контейнеров
Incident Reporter
Фиксирует ход расследования, оформляет отчет

Этапы игры:

1. Брифинг и описание инцидента 

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

2. Анализ системы и сбор информации 

  • Каждый участник изучает свою часть:
    • Код auth-service
    • Логи с ошибками
    • Примеры запросов с Postman
    • Настройки Spring Security
  • Выдвигаются гипотезы: где пробел в защите? Как злоумышленник мог получить доступ?
 

3. Обсуждение и предложения решений 

  • Обсуждаются найденные проблемы:
    • Уязвимости в токенах
    • Неправильная реализация ролей
    • Брутфорс и отсутствие защиты
  • Предлагаются исправления:
    • Использование BCryptPasswordEncoder
    • Добавление времени жизни токена
    • Rate limiting и Circuit Breaker
    • Поддержка ролей в Spring Security
 

4. Презентация и отчет

  • Команда представляет:
    • Что стало причиной инцидента?
    • Какие действия были выполнены?
    • Какие изменения внедрены?
    • Какие меры профилактики предложены?
 

Найденные проблемы и их решения:

Проблема
Решение
Пароли хранятся в открытом виде
Перейти наBCryptPasswordEncoder
Не указан срок действия токена
Добавить.setExpiration()вJwtUtil
Нет ограничений на частые попытки входа
Настроить@RateLimiter
Все токены действуют бесконечно
Реализовать Refresh Token
Нет проверки ролей в контроллерах
Использовать@PreAuthorize("hasRole('ADMIN')")
Плохая защита от timing-атак
ИспользоватьPasswordEncoder.matches()вместо.equals()
Нет обработки исключений в фильтре
Добавить try-catch и возврат 401
Нет fallback-механизма при сбое
ДобавитьCircuitBreaker
Токен передается в URL или cookie
Перейти на Bearer Token в заголовке Authorization
Нет мониторинга аутентификации
Интеграция с Micrometer и Alert 

 

 

Обучающие эффекты:

  • Понимание принципов безопасности в микросервисах
  • Диагностика и расследование утечек
  • Работа с JWT, Spring Security, OAuth2
  • Применение Resilience4j, Rate Limiter, Circuit Breaker
  • Чтение логов и метрик
  • Практика использования современных методов аутентификации и авторизации
 

Возможные проблемы во время игры:

Возможная проблема
Как решить
QA не знает, как тестировать токены
Подготовить шаблон Postman-запросов
Backend не понимает, где искать уязвимость
Провести короткий брифинг по Spring Security
DevOps не видит метрик
Подготовить Grafana дашборд заранее
Нет опыта работы с Rate Limiting
Показать простой пример Resilience4j
Команда теряет фокус
Установить четкие этапы и таймеры для каждого раунда

 

Ролевая игра №3: "Восстановление сервиса после сбоя в облаке"


Цель игры:

Научить студентов диагностировать и восстанавливать работу микросервиса после критического сбоя в облачной среде.
Игра направлена на развитие навыков работы с DevOps-инструментами, мониторингом, контейнерами и CI/CD.

 

Формат игры:

  • Тип: Ролевая симуляция / DevOps-расследование
  • Участники: 5–7 человек в команде (можно несколько команд)
  • Длительность: 2 академических часа
  • Платформа: Офлайн или онлайн (Zoom / MS Teams + Miro / Notion)
  • Необходимые материалы:
    • Логи из production
    • Метрики из Prometheus / Grafana
    • Скриншоты Kubernetes Dashboard
    • Postman-коллекция
    • Конфигурации: Dockerfile, deployment.yaml
 

Сеттинг:

Вы — часть команды инженеров компании CloudTech , которая управляет платформой управления задачами на основе Spring Boot и Kubernetes.

 

Сегодня утром команда получает экстренное уведомление:

«Сервис task-service перестал отвечать. В системе наблюдается резкое падение доступности, высокий уровень ошибок и исчерпание ресурсов».

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

 

Роли в команде:

Роль
Ответственность
DevOps Lead
Анализ состояния контейнеров, логов, Kubernetes
Backend Developer 1
Проверка Java-приложения, кода и транзакций
Backend Developer 2
Тестирование API, проверка бизнес-логики
SRE / Observability Engineer
Чтение метрик из Grafana / Prometheus
Incident Reporter
Фиксация хода расследования, оформление отчета
QA Engineer
Воспроизведение проблем через Postman, тестирование фиксов

Этапы игры:

1. Брифинг и описание инцидента 

  • Команда получает информацию о сбое сервиса.
  • Предоставляются фрагменты логов, скриншоты дашбордов, примеры запросов.
  • Обсуждается цель: восстановить работу сервиса за ограниченное время.
 

2. Анализ системы и сбор информации 

  • Участники изучают:
    • Логи из Kubernetes
    • Метрики CPU / RAM / Latency
    • Данные из Postman-запросов
    • Код сервиса
  • Выдвигаются гипотезы о причинах сбоя.
 

3. Обсуждение и предложения решений 

  • Команда обсуждает найденные проблемы:
    • Исчерпан пул потоков
    • Проблемы с подключением к БД
    • Подозрительные запросы от клиентов
  • Предлагаются решения:
    • Настройка HikariCP
    • Использование Circuit Breaker
    • Увеличение ресурсов контейнера
    • Лимиты и квоты в Kubernetes
 

4. Презентация и отчет 

  • Команда представляет:
    • Что стало причиной сбоя?
    • Какие действия были выполнены?
    • Какие изменения внедрены?
    • Какие меры профилактики предложены?

 


Найденные проблемы и их решения:

Проблема
Решение
Пул соединений исчерпан
Настроить HikariCP: увеличить max-pool-size
Тяжёлые запросы к БД
Добавить индексы, оптимизировать JPQL
Нет ограничения на количество одновременных запросов
Реализовать Rate Limiter через Resilience4j
Контейнер часто рестартует
Добавить readinessProbe / livenessProbe
Нет graceful shutdown
Настроитьserver.shutdown=gracefulи timeout
Пользователи получают 504 Gateway Timeout
Увеличить limits в deployment.yaml
Нет мониторинга
Интеграция Micrometer, Prometheus, AlertManager
Нет защиты от брутфорса
Добавить@RateLimiterна/login
Токены не истекают
Добавить.setExpiration()в JWT
Подозрительная активность в логах
Добавить логирование IP и User-Agent

Обучающие эффекты:

  • Диагностика и восстановление сервиса в production
  • Чтение логов и метрик в реальном времени
  • Работа с Kubernetes: pods, services, deployments
  • Настройка пула соединений и производительности JVM
  • Интеграция DevOps-инструментов: Grafana, Prometheus, Resilience4j
  • Развитие soft skills: командная работа, принятие решений, презентация
 

Возможные проблемы во время игры:

Возможная проблема
Как решить
Участники не знают, как читать логи
Подготовить шаблон анализа логов
Не знакомы с Kubernetes
Показать простой чек-лист по kubectl
QA не может воспроизвести проблему
Подготовить Postman-коллекцию
Backend не понимает, где искать ошибку
Показать, как использовать Actuator
DevOps не видит дашборды
Подготовить шаблоны Grafana / Pr

 

Ролевая игра №4: "Внедрение CI/CD. Битва за автоматизацию"


Цель игры:

Научить студентов проектировать, настраивать и внедрять полноценную систему CI/CD для Java-приложения.
Игра направлена на развитие навыков DevOps, автоматизации сборки, тестирования и деплоя.

 

Формат игры:

  • Тип: Ролевая симуляция / инженерная командная задача
  • Участники: 5–7 человек в команде (можно играть несколькими командами)
  • Длительность: 2 академических часа
  • Платформа: Офлайн или онлайн (Zoom / MS Teams + GitHub / GitLab + Notion / Miro)
  • Необходимые материалы:
    • Исходный код Spring Boot приложения
    • Заготовленный репозиторий без CI/CD
    • Стандартные файлы: Dockerfile, pom.xmlapplication.yml
    • Документация по CI/CD: GitHub Actions, Jenkins, ArgoCD
 

Сеттинг:

Вы — команда разработчиков стартапа DevStart , который запускает новую платформу управления задачами на базе Spring Boot.

 

Но до этого все изменения вручную собирались локально и деплоились через SSH. Это привело к проблемам:

«Очередной релиз сломал production. Нет тестов, нет контроля изменений. Пора внедрять CI/CD!»

Ваша задача — как можно быстрее внедрить автоматизированную систему доставки из старого репозитория, чтобы:

  • Все коммиты проверялись тестами
  • При успешном билде собирался Docker-образ
  • Прилив к ветке main происходил автоматический деплой в staging
  • Команда получала обратную связь о каждом шаге pipeline
 

Роли в команде:

Роль
Ответственность
Team Lead / DevOps Engineer
Координация процесса, настройка CI/CD, контроль времени
Backend Developer 1
Подготовка проекта, фикс ошибок в коде, добавление тестов
Backend Developer 2
Настройка Docker, работа с зависимостями, оптимизация сборки
QA Engineer
Проверка успешности сборки и тестов, создание тест-кейсов
Git Master
Управление репозиторием, ветками, pull request'ами
CI/CD Specialist
Написание pipeline, интеграция с GitHub Actions / Jenkins

Этапы игры:

1. Брифинг и постановка задачи 

  • Команда получает доступ к репозиторию.
  • Описание текущего состояния: нет автотестов, нет автоматической сборки, нет контейнеризации.
  • Цель: реализовать pipeline CI/CD за отведённое время.
 

2. Анализ проекта и подготовка 

  • Каждый участник изучает:
    • Архитектуру проекта
    • Требуется ли доработка кода?
    • Какие тесты нужно написать?
    • Как будет выглядеть Dockerfile?
    • Какой CI/CD использовать?
 

3. Реализация CI/CD 

  • Backend Developers пишут unit-тесты и поправляют код
  • DevOps настраивает Dockerfile и image
  • CI/CD Specialist создаёт workflow: GitHub Actions / Jenkinsfile
  • QA проверяет работу pipeline
 

4. Презентация и обсуждение 

  • Каждая команда демонстрирует свой pipeline:
    • Как происходит сборка
    • Что происходит при провале тестов
    • Как осуществляется деплой
  • Обсуждается:
    • Как улучшить надёжность
    • Как добавить мониторинг и алерты
    • Какие этапы можно автоматизировать дальше

Обучающие эффекты:

  • Внедрение CI/CD с нуля
  • Автоматизация тестирования и сборки
  • Интеграция Docker и GitHub Actions / Jenkins
  • Работа в команде по одному pipeline
  • Применение принципов DevOps и Infrastructure as Code
  • Понимание жизненного цикла приложения от IDE до продакшена
 

Возможные проблемы во время игры:

Возможная проблема
Как решить
Не умеют работать с Docker
Провести брифинг перед началом
Не знают, как писать workflow
Подготовить шаблон с пояснениями
Не понимают, как запустить тесты в pipeline
Добавить пример JUnit тестов
Не могут запустить Docker в CI
Использовать готовый registry
Нет опыта работы с Git
Разделить роли и дать чек-лист

 

Интеллект-карта №1: "Java и Spring Boot на профессиональном уровне"

Ветки:

  • Spring Boot

    • Автоконфигурация
    • Starter-зависимости
    • Actuator для мониторинга
    • Externalized Configuration application.yml@ConfigurationProperties
    • Профили окружений @Profile
  • Сервисы и контроллеры

    • @RestController@RequestMapping
    • @RequestBody / @ResponseBody
    • @PathVariable@RequestParam
    • DTO, Mapper, Validation
  • Работа с БД

    • JPA и Hibernate
    • @Entity@Repository
    • @Transactional
    • @DataJpaTest@WebMvcTest
  • Тестирование

    • JUnit 5: @BeforeEach@AfterEach@ParameterizedTest
    • Mockito: @Mock@InjectMockswhen(...).thenReturn(...)
    • Тестирование API: MockMvc, TestRestTemplate
    • Интеграционные тесты с Testcontainers
  • Безопасность

    • Spring Security: @EnableWebSecuritySecurityFilterChain
    • Аутентификация: @PreAuthorizehasRole()
    • JWT: генерация, валидация, фильтр
    • OAuth2 / OpenID Connect (по желанию)

 


Интеллект-карта №2: "Микросервисная архитектура и облачные технологии"

Ветки:

  • Микросервисы

    • Определение и особенности
    • Сравнение с монолитом
    • Communication: REST, gRPC, Messaging
  • Spring Cloud

    • Service Discovery: Eureka, Consul
    • Config Server: централизованное управление конфигами
    • Gateway: маршрутизация, фильтры
    • Circuit Breaker: Resilience4j, Hystrix (устаревший)
    • Load Balancer: Ribbon, WebClient + LB
  • Docker и контейнеризация

    • Dockerfile: FROM, COPY, CMD, ENTRYPOINT
    • Docker Compose: микросервисы и зависимости
    • Образы и контейнеры
    • Build, Push, Run
  • Kubernetes

    • Pod, Deployment, Service
    • Ingress, ConfigMap, Secret
    • Readiness / Liveness Probe
    • Helm Charts (по желанию)
  • CI/CD

    • GitHub Actions, GitLab CI, Jenkins
    • Pipeline stages: build → test → deploy
    • Автоматический деплой в staging / production
    • Уведомления и логирование
 

Интеллект-карта №3: "Профессиональная бэкенд-разработка и архитектура"

Ветки:

  • Архитектурные подходы

    • Монолит vs Микросервисы
    • Clean Architecture
    • Hexagonal Architecture
    • CQRS
    • Event Sourcing
  • Паттерны проектирования

    • Repository
    • Factory
    • Strategy
    • Decorator
    • Observer
    • Singleton
  • SOLID принципы

    • Single Responsibility
    • Open-Closed
    • Liskov Substitution
    • Interface Segregation
    • Dependency Inversion
  • DDD (Domain-Driven Design)

    • Value Object
    • Entity
    • Aggregate Root
    • Domain Events
    • Bounded Context
  • Реактивное программирование

    • WebFlux
    • Mono / Flux
    • Неблокирующий I/O
    • WebClient
    • Backpressure и flow control
 

Интеллект-карта №4: "Инструменты и практики DevOps в Java-разработке"

Ветки:

  • Логирование и трассировка

    • SLF4J, Logback, Log4j2
    • ELK Stack: Elasticsearch, Logstash, Kibana
    • Micrometer: сбор метрик
    • Prometheus + Grafana: дашборды и алерты
    • OpenTelemetry: распределённая трассировка
  • Контейнеры и оркестровка

    • Docker CLI, image, container
    • Dockerfile, multi-stage build
    • Docker Compose
    • Kubernetes: pods, services, deployments
    • Istio / Linkerd: service mesh
  • Наблюдаемость и мониторинг

    • Health check через Actuator
    • Logging и Monitoring
    • Tracing: Sleuth, Zipkin
    • AlertManager, Grafana dashboards
  • Автоматизация

    • GitHub Actions / GitLab CI
    • Jenkins, ArgoCD
    • Автоматическое тестирование
    • Canary Release, Blue-Green Deployment
    • Feature Toggles
  • Управление секретами

    • HashiCorp Vault
    • AWS Secrets Manager
    • Kubernetes Secrets
    • Spring Cloud Config Server

1. "Spring in Action" — Craig Walls

  • Уровень: Средний – профессиональный

  • Тип ресурса: Учебник / справочник

  • Краткое описание:
    Один из самых популярных учебников по Spring, написанный понятным языком с практическими примерами. Охватывает Spring Boot, Spring Security, Spring Data, Spring Cloud и другие модули.

  • Почему стоит использовать:
    Отличное введение в экосистему Spring, особенно полезен для освоения микросервисной архитектуры и CI/CD в Java.

 

2. "Java Concurrency in Practice" — Brian Goetz, Doug Lea и др.

  • Уровень: Профессиональный

  • Тип ресурса: Научно-практическая литература

  • Краткое описание:
    Фундаментальный труд о многопоточности в Java. Рассказывает о потокобезопасности, пулах потоков, реактивном программировании и современных паттернах параллелизма.

  • Почему стоит использовать:
    Идеально подходит для повышения уровня понимания JVM, Thread API, ForkJoinPool и Future/Promise.

 

3. "Clean Architecture: A Craftsman’s Guide to Software Structure and Design" — Robert C. Martin

  • Уровень: Профессиональный

  • Тип ресурса: Хрестоматия / методическое пособие

  • Краткое описание:
    Роберт Мартин объясняет, как строить масштабируемые и тестируемые системы. Книга содержит глубокий анализ принципов SOLID, DRY, KISS и разделения уровней архитектуры.

  • Почему стоит использовать:
    Для формирования правильного мышления при проектировании бэкенд-систем. Полезно на этапе изучения Clean Architecture, Hexagonal Architecture и DDD.

 

4. "Domain-Driven Design: Tackling Complexity in the Heart of Software" — Eric Evans

  • Уровень: Профессиональный

  • Тип ресурса: Научно-методическая хрестоматия

  • Краткое описание:
    Эта книга считается библией DDD. Она учит разрабатывать сложные бизнес-системы, выделять Bounded Contexts, создавать доменные модели и правильно организовывать взаимодействие между ними.

  • Почему стоит использовать:
    Для углублённого изучения архитектурных решений, особенно в контексте enterprise-приложений и микросервисов.

 

5. "Effective Java" — Joshua Bloch

  • Уровень: Профессиональный

  • Тип ресурса: Практическое пособие

  • Краткое описание:
    Автор книги — один из ключевых участников разработки Java Collections и Google Java Style Guide. Книга содержит 90 конкретных рекомендаций по написанию качественного, производительного и безопасного кода.

  • Почему стоит использовать:
    Идеальна для тех, кто хочет перейти от junior к middle/senior. Подходит как база для задачников и тестирования знаний.

  1. Java Pro: от бэкенда к микросервисам

    • Научитесь создавать отказоустойчивые, масштабируемые приложения на Spring Boot. Углублённое изучение безопасности, CI/CD и Docker.
  2. Spring Cloud для профессионалов

    • Курс построения распределённых систем с использованием Spring Cloud: Service Discovery, Gateway, Config Server, Circuit Breaker, контейнеризация и оркестровка.
  3. Микросервисы на Java: путь Middle разработчика

    • Практический курс по проектированию, тестированию и развертыванию микросервисов. Интеграция с Kafka, Redis, Istio и Kubernetes.
  4. Реактивная разработка на Spring WebFlux

    • Изучите реактивное программирование, работу с Flux/Mono, R2DBC и неблокирующую обработку данных в реальном времени.
  5. Enterprise Java: архитектура и безопасность

    • Расширенное обучение Clean Architecture, Domain-Driven Design, CQRS, Event Sourcing и защите сервисов через JWT, OAuth2 и Vault.
  6. Java и DevOps: полный цикл CI/CD

    • От написания кода до автоматического деплоя. GitHub Actions, Jenkins, Docker, Kubernetes, Helm, ArgoCD и практика production-деплоев.
  7. Создание масштабируемых систем на Java

    • Работа с нагрузкой, кэширование, очередь сообщений, распределённые транзакции, шардинг БД и подходы к повышению производительности.
  8. Spring Security: защита enterprise-приложений

    • Глубокое изучение аутентификации, авторизации, JWT, OAuth2, двухфакторной аутентификации и защиты от атак.
  9. Java и облачные технологии

    • Подготовьтесь к работе в cloud-native средах: AWS, GCP, Azure, Docker, Kubernetes, Istio и работа с managed services.
  10. Паттерны проектирования в Java: продвинутый уровень

    • Применение паттернов в real-world проектах: Observer, Strategy, Decorator, Repository, Saga, Circuit Breaker и другие enterprise-паттерны.
  11. Реальное тестирование Java-приложений

    • Юнит-тесты, интеграционные тесты, Mockito, Testcontainers, TDD/BDD, покрытие кода, инструменты вроде JaCoCo и Allure.
  12. Java Performance Tuning

    • Оптимизация JVM, анализ heap dumps, работа с GC, JMH, JProfiler, понимание bottleneck'ов и memory leaks.
  13. Java + Kafka: асинхронная обработка событий

    • Создание event-driven систем. Реализация pub/sub, stream processing, backpressure, idempotency и fault tolerance через Apache Kafka.
  14. Введение в DDD: Domain-Driven Design в Java

    • Разработка сложных систем через Bounded Context, Aggregate Root, Value Object, Domain Events и применение этих концепций в Spring Boot.
  15. Clean Architecture на практике

    • Построение чистых, тестируемых, независимых от технологий приложений. Примеры реализации на Spring Boot и Hexagonal Architecture.
  16. GraalVM Native Image и Quarkus в 2024 году

    • Обучение созданию native-приложений, ускоренному старту и снижению потребления ресурсов. Полезно для serverless и cloud-native решений.
  17. Spring Data и работа с базами данных

    • Многопоточная работа с PostgreSQL, MySQL, MongoDB, Redis. Использование Liquibase/Flyway, QueryDSL, кэширование и оптимизация запросов.
  18. Техническое собеседование для Middle Java Developer

    • Подготовка к собеседованиям: задачи по алгоритмам, архитектуре, Spring, SQL, REST API и примеры вопросов от крупных компаний.
  19. Java и GraalVM: следующее поколение JVM

    • Изучение возможностей GraalVM: polyglot runtime, AOT-компиляция, JIT-оптимизация, компиляция в native-образы.
  20. Spring Boot: от новичка к Production-специалисту

    • Профессиональное использование Spring Boot: Actuator, Micrometer, Profiles, Async, Scheduled Tasks, Transaction Management и мониторинг.
  21. Разработка с нуля до продакшена

    • Полный путь: от идеи до деплоя. Сборка, тестирование, контейнеризация, CI/CD, мониторинг и логирование.
  22. Java и Observability: метрики, логи, трассировка

    • Внедрение OpenTelemetry, Prometheus, Grafana, Zipkin, ELK Stack. Настраиваем наблюдаемость в микросервисах.
  23. Service Mesh и Istio в Java-системах

    • Как работает Istio, Envoy, sidecar proxy. Как внедрить его в Spring Boot, обеспечить security, routing, tracing и resilience.
  24. Реальный опыт с Spring Batch и Job Processing

    • Обработка больших объёмов данных, job scheduling, chunk-based processing, retry/fallback, partitioning. Для backend-инженеров уровня Middle+.
  25. Архитектура Java-приложений: от теории к практике

    • Сравнение архитектур: Monolith, Microservices, CQRS, Event Sourcing, Clean Architecture. Как выбрать правильную модель для вашего бизнеса?
Заявка ученика, студента, слушателя
Заявка преподавателя, репетитора админу сети.
17:07
11
Посещая этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.