Практические уроки для Backend, Data Engineering и DevOps
Площадка с пошаговыми туториалами и облачными окружениями. Изучаем теорию и сразу выполняем команды без настройки локальной среды. В каталоге PostgreSQL, Redis, Docker, Kubernetes, Airflow, Spark и ClickHouse.
https://prepare.sh/
👉 Java Portal
Площадка с пошаговыми туториалами и облачными окружениями. Изучаем теорию и сразу выполняем команды без настройки локальной среды. В каталоге PostgreSQL, Redis, Docker, Kubernetes, Airflow, Spark и ClickHouse.
https://prepare.sh/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
💡 Нужно найти все файлы в папке и её подпапках? Используйте
✅ Возвращает
✅ Фильтруйте файлы по расширению через
✅ Всегда закрывайте поток:
👉 Java Portal
Files.walk().✅ Возвращает
Stream<Path> для рекурсивного обхода дерева каталогов.✅ Фильтруйте файлы по расширению через
path.toString().endsWith(".java") или используйте любой другой предикат.✅ Всегда закрывайте поток:
try-with-resources автоматически освобождает ресурсы обхода.Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Spring Boot API отвечает тайм-аутами, а PostgreSQL выглядит здоровым?
CPU в норме, медленных запросов нет. Причина может быть в исчерпании пула соединений HikariCP. Когда все соединения заняты, новые запросы ждут освобождения одного из них. Если время ожидания превышает
Особенно коварны долгие транзакции: приложение может удерживать соединение, пока ждёт внешний API, хотя сама база в этот момент почти не работает.
В статье разбираются:
• Причины исчерпания пула.
• Влияние долгих транзакций.
• Диагностика по метрикам HikariCP.
• Практические способы устранения проблемы.
Читать статью
👉 Java Portal
CPU в норме, медленных запросов нет. Причина может быть в исчерпании пула соединений HikariCP. Когда все соединения заняты, новые запросы ждут освобождения одного из них. Если время ожидания превышает
connectionTimeout, получение соединения завершается ошибкой.Особенно коварны долгие транзакции: приложение может удерживать соединение, пока ждёт внешний API, хотя сама база в этот момент почти не работает.
В статье разбираются:
• Причины исчерпания пула.
• Влияние долгих транзакций.
• Диагностика по метрикам HikariCP.
• Практические способы устранения проблемы.
Читать статью
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
💡 Spring Boot 4: EnvironmentPostProcessor переехал в новый пакет
✅ Новый путь:
✅ Старый
✅ Обновите импорт в коде и ключ регистрации в
👉 Java Portal
✅ Новый путь:
org.springframework.boot.EnvironmentPostProcessor.✅ Старый
org.springframework.boot.env.EnvironmentPostProcessor пока работает, но помечен как устаревший (deprecated).✅ Обновите импорт в коде и ключ регистрации в
META-INF/spring.factories.Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Java Records, Lombok и POJO: в чём разница?
Все три подхода помогают описывать данные, но отвечают на разные потребности: краткость, генерация шаблонного кода и контроль над поведением класса.
• Record — компактный носитель данных. Records стали стандартной возможностью языка в Java 16:
Компилятор создаёт конструктор для всех компонентов, методы доступа
Неизменяемость поверхностная: поля компонентов —
• Lombok — меньше шаблонного кода. Аннотации позволяют генерировать методы и конструкторы при компиляции:
Lombok умеет создавать getters/setters, конструкторы,
Удобен для существующих проектов и классов с большим количеством повторяющегося кода. При этом добавляет зависимость при сборке и требует понимания того, что именно генерируется.
С JPA-сущностями аннотации стоит выбирать аккуратно: автоматически созданные
• POJO — обычный Java-объект. Класс без обязательной привязки к специальному фреймворку или модели программирования. Вы сами определяете конструкторы, валидацию, изменяемость, бизнес-логику и правила сравнения. Подходит для доменных моделей и классов с нестандартным поведением.
Это не три взаимоисключающих варианта: record — возможность языка, Lombok — инструмент генерации кода, POJO — характеристика класса. Класс с аннотациями Lombok вполне может оставаться POJO. Выбирайте подход по назначению класса, а не только по количеству сэкономленных строк.
👉 Java Portal
Все три подхода помогают описывать данные, но отвечают на разные потребности: краткость, генерация шаблонного кода и контроль над поведением класса.
• Record — компактный носитель данных. Records стали стандартной возможностью языка в Java 16:
public record User(
Long id,
String name,
String email
) {}
Компилятор создаёт конструктор для всех компонентов, методы доступа
id(), name(), email(), а также equals(), hashCode() и toString(). Подходит для DTO, моделей запросов и ответов API, данных событий.Неизменяемость поверхностная: поля компонентов —
final, но содержимое переданного списка или другого изменяемого объекта всё ещё может меняться.• Lombok — меньше шаблонного кода. Аннотации позволяют генерировать методы и конструкторы при компиляции:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private String email;
}
Lombok умеет создавать getters/setters, конструкторы,
equals(), hashCode(), toString() и builder через @Builder.Удобен для существующих проектов и классов с большим количеством повторяющегося кода. При этом добавляет зависимость при сборке и требует понимания того, что именно генерируется.
С JPA-сущностями аннотации стоит выбирать аккуратно: автоматически созданные
equals(), hashCode() и toString() могут некорректно работать со связями и ленивой загрузкой.• POJO — обычный Java-объект. Класс без обязательной привязки к специальному фреймворку или модели программирования. Вы сами определяете конструкторы, валидацию, изменяемость, бизнес-логику и правила сравнения. Подходит для доменных моделей и классов с нестандартным поведением.
Это не три взаимоисключающих варианта: record — возможность языка, Lombok — инструмент генерации кода, POJO — характеристика класса. Класс с аннотациями Lombok вполне может оставаться POJO. Выбирайте подход по назначению класса, а не только по количеству сэкономленных строк.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1
Java Records — больше, чем сокращённая запись класса
Вы получаете:
→ Поля компонентов с модификатором
→ Автоматические
→ Явный сигнал: «этот тип хранит данные».
Используйте records для DTO — меньше шаблонного кода, проще ревью.
👉 Java Portal
record User(String name, String email) {}Вы получаете:
→ Поля компонентов с модификатором
final.→ Автоматические
equals(), hashCode() и toString().→ Явный сигнал: «этот тип хранит данные».
Используйте records для DTO — меньше шаблонного кода, проще ревью.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
💡 Java: используйте Path и Files для работы с файлами
✅
✅
✅ Для простых операций нужно меньше шаблонного кода, чем с
👉 Java Portal
✅
Path.of(...) создаёт путь с учётом файловой системы текущей ОС.✅
Files.readString(), writeString() и readAllLines() позволяют читать и записывать текст одной строкой.✅ Для простых операций нужно меньше шаблонного кода, чем с
FileReader и BufferedReader.Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Ленивая инициализация в Spring Boot
Настройка
✅ Вместе с созданием бина откладывается и вызов
✅ Приложение запускается быстрее, но прогрев кэша или проверки схемы БД могут не выполниться, если соответствующий бин никто не запросит.
✅ Ошибки инициализации могут проявиться уже при первом запросе.
👉 Java Portal
Настройка
spring.main.lazy-initialization=true откладывает создание большинства бинов до момента, когда они понадобятся.✅ Вместе с созданием бина откладывается и вызов
@PostConstruct.✅ Приложение запускается быстрее, но прогрев кэша или проверки схемы БД могут не выполниться, если соответствующий бин никто не запросит.
✅ Ошибки инициализации могут проявиться уже при первом запросе.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
Что происходит между GET /users/123 и ответом API?
Несколько сотен миллисекунд могут включать установку соединения, балансировку нагрузки, проверку авторизации, обращение к кэшу и базе данных. Код контроллера занимает лишь часть этого времени.
В статье разобран путь запроса в приложении на Spring Boot:
• DNS и TLS.
• Балансировка нагрузки.
• Spring Security и JWT.
• Попадание и промах кэша Redis.
• Ожидание соединения из пула.
• Запросы к PostgreSQL.
• Взаимодействие с Kafka.
• Источники задержек на каждом этапе.
Не каждый запрос проходит все эти шаги: соединение может переиспользоваться, кэш — исключить обращение к БД, а Kafka участвует только там, где это предусмотрено логикой приложения.
Читать на Medium
👉 Java Portal
Несколько сотен миллисекунд могут включать установку соединения, балансировку нагрузки, проверку авторизации, обращение к кэшу и базе данных. Код контроллера занимает лишь часть этого времени.
В статье разобран путь запроса в приложении на Spring Boot:
• DNS и TLS.
• Балансировка нагрузки.
• Spring Security и JWT.
• Попадание и промах кэша Redis.
• Ожидание соединения из пула.
• Запросы к PostgreSQL.
• Взаимодействие с Kafka.
• Источники задержек на каждом этапе.
Не каждый запрос проходит все эти шаги: соединение может переиспользоваться, кэш — исключить обращение к БД, а Kafka участвует только там, где это предусмотрено логикой приложения.
Читать на Medium
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👀1
💡
✅ Используется в автоконфигурациях Spring Boot, например для Kafka и Redis.
✅ Если класса нет, условная конфигурация пропускается.
✅ В паре с
👉 Java Portal
@ConditionalOnClass: конфигурация включается, если нужный класс есть в classpath✅ Используется в автоконфигурациях Spring Boot, например для Kafka и Redis.
✅ Если класса нет, условная конфигурация пропускается.
✅ В паре с
@ConditionalOnMissingBean позволяет предоставить бин по умолчанию, который приложение может заменить собственным.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
Утечка памяти, фрагментация и нагрузка на GC: в чём разница?
Приложение потребляет много памяти — это ещё не означает утечку. Причины могут быть разными.
Memory Leak — ненужные объекты остаются достижимыми. Программа больше не использует их, но продолжает хранить ссылки, поэтому сборщик мусора не может освободить память.
Типичные причины: кэш без ограничений, растущие статические коллекции, неудалённые слушатели и неправильная работа с
Memory Fragmentation — свободная память есть, но она разбита на неудобные участки. Например, суммарно места достаточно, но нет подходящего непрерывного блока для выделения.
В Java влияние фрагментации зависит от сборщика мусора и области памяти: heap, native или off-heap. Многие сборщики перемещают объекты и уплотняют память, но это не устраняет все возможные случаи.
GC Pressure — объекты создаются быстрее, чем системе удобно их убирать. Память освобождается, однако GC приходится работать часто или интенсивно, расходуя CPU и увеличивая задержки.
Причины: высокая скорость выделения памяти, множество временных объектов, большие промежуточные структуры и частая сериализация.
При диагностике смотрите на разные сигналы:
• Утечка: какие объекты остаются живыми и что удерживает ссылки на них.
• Фрагментация: в какой области памяти не удаётся выделить нужный блок.
• GC Pressure: скорость аллокаций, частоту сборок, паузы и затраты CPU.
Увеличение
👉 Java Portal
Приложение потребляет много памяти — это ещё не означает утечку. Причины могут быть разными.
Memory Leak — ненужные объекты остаются достижимыми. Программа больше не использует их, но продолжает хранить ссылки, поэтому сборщик мусора не может освободить память.
Типичные причины: кэш без ограничений, растущие статические коллекции, неудалённые слушатели и неправильная работа с
ThreadLocal. Один из признаков — устойчивый рост занятой памяти даже после сборок мусора.Memory Fragmentation — свободная память есть, но она разбита на неудобные участки. Например, суммарно места достаточно, но нет подходящего непрерывного блока для выделения.
В Java влияние фрагментации зависит от сборщика мусора и области памяти: heap, native или off-heap. Многие сборщики перемещают объекты и уплотняют память, но это не устраняет все возможные случаи.
GC Pressure — объекты создаются быстрее, чем системе удобно их убирать. Память освобождается, однако GC приходится работать часто или интенсивно, расходуя CPU и увеличивая задержки.
Причины: высокая скорость выделения памяти, множество временных объектов, большие промежуточные структуры и частая сериализация.
При диагностике смотрите на разные сигналы:
• Утечка: какие объекты остаются живыми и что удерживает ссылки на них.
• Фрагментация: в какой области памяти не удаётся выделить нужный блок.
• GC Pressure: скорость аллокаций, частоту сборок, паузы и затраты CPU.
Увеличение
-Xmx иногда помогает, но при утечке лишь откладывает проблему. Сначала выясните, почему память растёт и на что тратится время GC.Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
💡 Spring Boot + Kafka: отправка и получение событий с минимумом кода
✅ Внедрите
✅ Добавьте
✅ Автоконфигурация Spring Boot настроит компоненты Kafka по параметрам
👉 Java Portal
✅ Внедрите
KafkaTemplate, чтобы отправлять сообщения в топик.✅ Добавьте
@KafkaListener к методу, чтобы обрабатывать входящие сообщения.✅ Автоконфигурация Spring Boot настроит компоненты Kafka по параметрам
spring.kafka.*.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Большинство разработчиков изучают Spring Boot, создавая CRUD API. Но для работы с backend в production этого далеко не достаточно.
В шпаргалке по Spring Boot, в которой собраны ключевые концепции, которые должен знать каждый backend-разработчик.
Что внутри:
• Архитектура Spring Boot
• Жизненный цикл HTTP-запроса
• Структура проекта
• Основные аннотации
• Подходы к построению REST API
• JPA и слой Repository
• Валидация данных
• Обработка исключений
• JWT и Spring Security
• HTTP-статусы
• Команды Docker
• Лучшие практики для production
Главная ошибка начинающих. Они сосредотачиваются только на связке:
Но упускают из виду:
• Валидацию данных
• Безопасность
• Логирование
• Транзакции
• Мониторинг
• Обработку ошибок
• Масштабируемость
Именно здесь начинается настоящая backend-разработка.
Важный момент о производительности в production. Большинство проблем с производительностью вызваны не самим Spring Boot. Чаще всего узкие места находятся в других компонентах системы:
• Медленные запросы к базе данных
• Отсутствие необходимых индексов
• Исчерпание пула соединений
• Сериализация больших объёмов данных
• Блокирующие внешние API
• Проблемы N+1 при выполнении запросов к базе данных
В каком порядке изучать Spring Boot.
Начальный уровень:
• REST API
• Контроллеры
• Внедрение зависимостей
• CRUD API
• Основы JPA
Средний уровень:
• Валидация
• Обработка исключений
• JWT и безопасность
• Транзакции
• Docker
Продвинутый уровень:
• Kafka
• Redis
• Микросервисы
• Распределённая трассировка (Distributed Tracing)
• Kubernetes
• Событийно-ориентированная архитектура (Event-Driven Architecture)
Мой любимый раздел — жизненный цикл запроса. Когда понимаешь, как запрос проходит через приложение, отлаживать ошибки становится гораздо проще:
Совет от опытных инженеров. Не ограничивайся изучением синтаксиса. Разбирайся в том:
• Почему системы выходят из строя.
• Где возникают узкие места производительности.
• Как работает масштабирование.
• Как искать и устранять проблемы в production.
Именно это отличает разработчиков, которые просто повторяют примеры из обучающих материалов, от настоящих backend-инженеров.
👉 Java Portal
В шпаргалке по Spring Boot, в которой собраны ключевые концепции, которые должен знать каждый backend-разработчик.
Что внутри:
• Архитектура Spring Boot
• Жизненный цикл HTTP-запроса
• Структура проекта
• Основные аннотации
• Подходы к построению REST API
• JPA и слой Repository
• Валидация данных
• Обработка исключений
• JWT и Spring Security
• HTTP-статусы
• Команды Docker
• Лучшие практики для production
Главная ошибка начинающих. Они сосредотачиваются только на связке:
Controller → Service → RepositoryНо упускают из виду:
• Валидацию данных
• Безопасность
• Логирование
• Транзакции
• Мониторинг
• Обработку ошибок
• Масштабируемость
Именно здесь начинается настоящая backend-разработка.
Важный момент о производительности в production. Большинство проблем с производительностью вызваны не самим Spring Boot. Чаще всего узкие места находятся в других компонентах системы:
• Медленные запросы к базе данных
• Отсутствие необходимых индексов
• Исчерпание пула соединений
• Сериализация больших объёмов данных
• Блокирующие внешние API
• Проблемы N+1 при выполнении запросов к базе данных
В каком порядке изучать Spring Boot.
Начальный уровень:
• REST API
• Контроллеры
• Внедрение зависимостей
• CRUD API
• Основы JPA
Средний уровень:
• Валидация
• Обработка исключений
• JWT и безопасность
• Транзакции
• Docker
Продвинутый уровень:
• Kafka
• Redis
• Микросервисы
• Распределённая трассировка (Distributed Tracing)
• Kubernetes
• Событийно-ориентированная архитектура (Event-Driven Architecture)
Мой любимый раздел — жизненный цикл запроса. Когда понимаешь, как запрос проходит через приложение, отлаживать ошибки становится гораздо проще:
Клиент
↓
Tomcat
↓
DispatcherServlet
↓
Controller
↓
Service
↓
Repository
↓
База данных
Совет от опытных инженеров. Не ограничивайся изучением синтаксиса. Разбирайся в том:
• Почему системы выходят из строя.
• Где возникают узкие места производительности.
• Как работает масштабирование.
• Как искать и устранять проблемы в production.
Именно это отличает разработчиков, которые просто повторяют примеры из обучающих материалов, от настоящих backend-инженеров.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Большинство воспринимает Spring Boot просто как фреймворк для создания REST API.
Но за ним скрывается гораздо более крупная экосистема 👇
• Spring Core и внедрение зависимостей
• Spring MVC и WebFlux
• JPA, Hibernate и базы данных
• Безопасность с JWT и OAuth 2.0
• Kafka и RabbitMQ
• Redis и распределённое кэширование
• Docker, Kubernetes и облачные платформы
• Мониторинг с Actuator, Prometheus и Grafana
Spring Boot упрощает настройку проекта, а понимание всех стоящих за ним уровней помогает стать сильнее как бэкенд-разработчик.
Фреймворк позволяет быстро начать работу.
Экосистема помогает создавать приложения для продакшена.
👉 Java Portal
Но за ним скрывается гораздо более крупная экосистема 👇
• Spring Core и внедрение зависимостей
• Spring MVC и WebFlux
• JPA, Hibernate и базы данных
• Безопасность с JWT и OAuth 2.0
• Kafka и RabbitMQ
• Redis и распределённое кэширование
• Docker, Kubernetes и облачные платформы
• Мониторинг с Actuator, Prometheus и Grafana
Spring Boot упрощает настройку проекта, а понимание всех стоящих за ним уровней помогает стать сильнее как бэкенд-разработчик.
Фреймворк позволяет быстро начать работу.
Экосистема помогает создавать приложения для продакшена.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3