Чтобы вам было проще ориентироваться в постах, мы разделили весь контент по 4 основным направлениям:
🔹 #CoreJava — фундаментальные знания: JVM, JDK, ООП, многопоточность, паттерны и базовые концепции. Всё, что помогает понимать Java глубже, а не просто «писать код, чтобы работало».
🔹 #Enterprise — прикладные инструменты и практика: Spring, Hibernate, Kafka, Docker, микросервисы. Всё, что встречается в работе разработчика каждый день.
🔹 #DevLife — сообщество и карьера: мемы, холивары, задачи с собесов, советы по развитию и личные рубрики. Всё, что создаёт атмосферу и объединяет нас как комьюнити.
🔹 #News — дайджесты, свежие анонсы, релизы и новости. А также реклама и инфоповоды, которые стоит знать.
👉 Используйте теги, чтобы быстро находить посты по интересующей теме.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥3👏1
Byteman — это фреймворк для «инъекций» в байткод во время выполнения. Он позволяет менять поведение Java-программ без пересборки и изменения исходного кода.
— Правила-инъекции на DSL (можно подмешать логику в любой метод).
— Удобен для тестирования сложных сценариев (например, эмуляция исключений или задержек).
— Поддержка динамической подгрузки/удаления правил без перезапуска приложения.
— Используется для отладки, тестирования отказоустойчивости и профилирования.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍3⚡1
✅ Чек-лист по Spring Boot профилям
Чтобы не путаться в окружениях и не тащить dev в прод 🚨 — держите компактный список best practices.
Карточка для сохранения👆🏻
🐸 Библиотека джависта
#Enterprise
Чтобы не путаться в окружениях и не тащить dev в прод 🚨 — держите компактный список best practices.
Карточка для сохранения👆🏻
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥3❤1👾1
Spring Boot из коробки интегрируется с Micrometer, позволяя собирать метрики и отправлять их в Prometheus, Grafana или другие системы мониторинга. Чтобы быстро поднять стек наблюдаемости — подключаем AI.
📝 Промпт:
Generate an observability integration for a Spring Boot 3 application using Micrometer and Prometheus.
— Enable Micrometer metrics in a Spring Boot application.
— Configure PrometheusMeterRegistry for collecting application metrics.
— Expose /actuator/prometheus endpoint for Prometheus scraping.
— Add custom application metrics using MeterRegistry (timers, counters, gauges).
— Configure histograms for REST API response times.
— Integrate Micrometer with Logback for unified metrics and logging.
— Enable health checks with Spring Boot Actuator (disk space, DB, cache).
— Set up Grafana dashboards for visualizing metrics and alerts.
— Добавьте
Enable Distributed Tracing with OpenTelemetry
для отслеживания запросов в распределённых системах.— Добавьте
Configure Grafana Alertmanager integration
для настройки алертов и уведомлений.— Добавьте
Implement custom business metrics (e.g. orders per minute)
для отслеживания доменных метрик приложения.#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2❤1
🎯 IntelliJ IDEA: Bookmarks и Context Bookmarks
Большие проекты → десятки файлов → сотни классов. Иногда нужно быстро вернуться к «тем самым» местам в коде. В ход идут Bookmarks — и особенно Context Bookmarks.
🔹 Что делает
— Позволяет отмечать строки или файлы как закладки
— Поддерживает нумерацию (быстрый переход по цифре)
— Context Bookmarks автоматически привязывают закладки к рабочему контексту (ветке, задаче)
🔹 Зачем это нужно
— Удобно при отладке: отмечаете подозрительные места и прыгаете между ними
— Можно держать список TODO прямо в коде, без комментариев
— Context Bookmarks запоминают, что именно важно для текущей задачи, и не мешают в будущем
🔹 Как использовать
— Обычная закладка: F11 (Windows/Linux) или F3 (macOS)
— Закладка с номером: Ctrl+Shift+<цифра> (Windows/Linux) или ⌘⇧<цифра> (macOS)
— Быстрый переход: Ctrl+<цифра>
— Context Bookmarks: активируются в View → Tool Windows → Bookmarks
🐸 Библиотека джависта
#Enterprise
Большие проекты → десятки файлов → сотни классов. Иногда нужно быстро вернуться к «тем самым» местам в коде. В ход идут Bookmarks — и особенно Context Bookmarks.
🔹 Что делает
— Позволяет отмечать строки или файлы как закладки
— Поддерживает нумерацию (быстрый переход по цифре)
— Context Bookmarks автоматически привязывают закладки к рабочему контексту (ветке, задаче)
🔹 Зачем это нужно
— Удобно при отладке: отмечаете подозрительные места и прыгаете между ними
— Можно держать список TODO прямо в коде, без комментариев
— Context Bookmarks запоминают, что именно важно для текущей задачи, и не мешают в будущем
🔹 Как использовать
— Обычная закладка: F11 (Windows/Linux) или F3 (macOS)
— Закладка с номером: Ctrl+Shift+<цифра> (Windows/Linux) или ⌘⇧<цифра> (macOS)
— Быстрый переход: Ctrl+<цифра>
— Context Bookmarks: активируются в View → Tool Windows → Bookmarks
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2👏1
🎯 Spring Boot + Docker Compose: пошаговая интеграция
В проде редко гоняют приложения напрямую — почти всегда через Docker. А с появлением spring-boot-docker-compose интеграция стала проще: можно поднимать всю инфраструктуру (Postgres, Redis, Kafka и т.д.) одной командой вместе с приложением.
1️⃣ Подготовка зависимостей
В Spring Boot 3.1 добавили официальный стартер:
2️⃣ docker-compose.yml
Определим инфраструктуру (например, Postgres + pgAdmin):
3️⃣ Автоматическая интеграция
Spring Boot сам подтянет конфигурацию из docker-compose.yml. Просто укажите профиль:
или
При старте Boot поднимет контейнеры и подставит spring.datasource.url, username, password.
4️⃣ Кастомизация application-compose.yml
Если нужны дополнительные параметры — кладём их в src/main/resources/application-compose.yml:
5️⃣ Полезные приёмы
— Фиксируйте версии образов, а не latest (для воспроизводимости).
— Healthcheck в docker-compose.yml помогает Boot ждать готовности контейнера.
— Можно запускать docker compose up -d руками, если не хотите, чтобы Boot сам управлял контейнерами.
— Для CI/CD обычно используют отдельные docker-compose.override.yml или Helm чарты, но для дев-окружения spring-boot-docker-compose очень экономит время.
Ставьте 👍🏼, если нужен более подробный пост про настройку docker-compose.yml
🐸 Библиотека джависта
#Enterprise
В проде редко гоняют приложения напрямую — почти всегда через Docker. А с появлением spring-boot-docker-compose интеграция стала проще: можно поднимать всю инфраструктуру (Postgres, Redis, Kafka и т.д.) одной командой вместе с приложением.
В Spring Boot 3.1 добавили официальный стартер:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-docker-compose</artifactId>
<scope>runtime</scope>
</dependency>
ИЛИ
dependencies {
runtimeOnly("org.springframework.boot:spring-boot-docker-compose")
}
Определим инфраструктуру (например, Postgres + pgAdmin):
version: '3.8'
services:
postgres:
image: postgres:16-alpine
container_name: app-postgres
environment:
POSTGRES_DB: app
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
pgadmin:
image: dpage/pgadmin4
environment:
PGADMIN_DEFAULT_EMAIL: admin@app.local
PGADMIN_DEFAULT_PASSWORD: secret
ports:
- "8081:80"
depends_on:
- postgres
volumes:
postgres_data:
Spring Boot сам подтянет конфигурацию из docker-compose.yml. Просто укажите профиль:
./mvnw spring-boot:run -Dspring.profiles.active=compose
или
./gradlew bootRun --args='--spring.profiles.active=compose'
При старте Boot поднимет контейнеры и подставит spring.datasource.url, username, password.
Если нужны дополнительные параметры — кладём их в src/main/resources/application-compose.yml:
spring:
datasource:
hikari:
maximum-pool-size: 5
— Фиксируйте версии образов, а не latest (для воспроизводимости).
— Healthcheck в docker-compose.yml помогает Boot ждать готовности контейнера.
— Можно запускать docker compose up -d руками, если не хотите, чтобы Boot сам управлял контейнерами.
— Для CI/CD обычно используют отдельные docker-compose.override.yml или Helm чарты, но для дев-окружения spring-boot-docker-compose очень экономит время.
Ставьте 👍🏼, если нужен более подробный пост про настройку docker-compose.yml
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30🔥1👏1
🛡 Role-Based Access Control (RBAC) в Spring Security
В корпоративных системах управление доступом часто становится узким местом — особенно когда речь идёт о гибкой настройке ролей и разрешений. Вместо ручного «if-else администрирования» можно подключить AI и быстро нагенерировать полноценный слой RBAC.
📝 Промпт:
💡 Расширения:
— Добавьте
— Добавьте
— Добавьте
🐸 Библиотека джависта
#Enterprise
В корпоративных системах управление доступом часто становится узким местом — особенно когда речь идёт о гибкой настройке ролей и разрешений. Вместо ручного «if-else администрирования» можно подключить AI и быстро нагенерировать полноценный слой RBAC.
📝 Промпт:
Generate a Spring Security configuration for a Spring Boot 3 application with Role-Based Access Control (RBAC).
— Configure Spring Security with role-based access (ADMIN, USER, MANAGER).
— Implement method-level security with @PreAuthorize and SpEL expressions.
— Set up JWT authentication with custom claims (roles, permissions).
— Create a PermissionEvaluator for fine-grained access checks (e.g. entity-level access).
— Integrate with a database-backed UserDetailsService for dynamic role management.
— Add an admin API endpoint for managing roles and permissions at runtime.
— Ensure audit logging of access control decisions.
— Добавьте
Multi-tenancy support with tenant-aware role resolution
.— Добавьте
Attribute-Based Access Control (ABAC)
для сложных бизнес-правил.— Добавьте
Integration with Keycloak или OAuth2 provider
для централизованного управления доступом.#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1👏1
Когда код становится сложнее, простого Find Usages уже мало. Хотите понять, откуда пришло значение переменной или куда оно утекает? Для этого есть Analyze Data Flow.
🔹 Что делает
— Позволяет проследить поток данных: где переменная инициализируется, как модифицируется и где используется
— Работает не только для переменных, но и для параметров методов, полей и возвращаемых значений
— Может анализировать как «куда идёт», так и «откуда пришло» (Forward/Backward analysis)
🔹 Зачем это нужно
— Быстро понять, почему метод получает null (и где он берётся)
— Выявить неочевидные зависимости между частями кода
— Ускорить отладку без бесконечного «шагания» по дебаггеру
🔹 Как использовать
— Выделите переменную или метод
— Analyze → Data Flow to Here / Data Flow from Here
— IDEA визуально покажет дерево зависимостей
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥3👏2❤1
Тут собраны самые популярные и эффективные инструменты для разных направлений: IDE, ИИ, безопасность и многое другое.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2❤1
🔥 Spring Security: как работает @PreAuthorize и зачем он нужен
В продакшн-коде часто возникает задача ограничить доступ к методам сервиса или контроллера. Делать это вручную — значит плодить дублирование и путать бизнес-логику с проверками. Для этого в Spring Security есть аннотация @PreAuthorize.
🔵 Как это работает
1. Аннотация вешается на метод (контроллер или сервис).
2. При вызове метода Spring Security перехватывает обращение и проверяет условие, указанное в аннотации.
3. Условие описывается на языке SpEL (Spring Expression Language), где доступно:
▪️ authentication — текущий объект аутентификации;
▪️ principal — данные текущего пользователя;
▪️ #id, #dto и т.д. — аргументы метода, к которым можно обратиться напрямую.
Пример:
→ метод вызовется только для пользователей с ролью ADMIN.
🔵 Что можно писать внутри
— Проверка ролей и прав
— Собственные условия
→ Здесь доступ только к своему профилю.
— Комбинации условий
Логика пишется прямо в SpEL:
— Сервисы внутри выражений
В выражение можно подключать свои бины:
→ бин reviewSecurity должен быть в контексте Spring и возвращать true/false.
🔵 Зачем это нужно
— Не надо вручную писать проверки в каждом методе.
— Авторизация централизована и читается прямо на уровне API.
— Условия можно вынести в отдельный сервис, чтобы не захламлять аннотацию.
👉 В итоге @PreAuthorize — это не только про роли, а про гибкий DSL проверки доступа, который можно расширять под проект: от банальной проверки ролей до бизнес-логики уровня "пользователь может редактировать только свои документы, если они ещё не опубликованы".
🐸 Библиотека джависта
#Enterprise
В продакшн-коде часто возникает задача ограничить доступ к методам сервиса или контроллера. Делать это вручную — значит плодить дублирование и путать бизнес-логику с проверками. Для этого в Spring Security есть аннотация @PreAuthorize.
1. Аннотация вешается на метод (контроллер или сервис).
2. При вызове метода Spring Security перехватывает обращение и проверяет условие, указанное в аннотации.
3. Условие описывается на языке SpEL (Spring Expression Language), где доступно:
▪️ authentication — текущий объект аутентификации;
▪️ principal — данные текущего пользователя;
▪️ #id, #dto и т.д. — аргументы метода, к которым можно обратиться напрямую.
Пример:
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long id) { ... }
→ метод вызовется только для пользователей с ролью ADMIN.
— Проверка ролей и прав
hasRole('USER'), hasAnyRole('ADMIN','MODERATOR')
hasAuthority('SCOPE_read') (актуально при работе с OAuth2)
— Собственные условия
@PreAuthorize("#id == authentication.principal.id")
public UserProfile getProfile(Long id) { ... }
→ Здесь доступ только к своему профилю.
— Комбинации условий
Логика пишется прямо в SpEL:
@PreAuthorize("hasRole('ADMIN') or @securityService.isOwner(#docId)")
public Document update(Long docId) { ... }
— Сервисы внутри выражений
В выражение можно подключать свои бины:
@PreAuthorize("@reviewSecurity.isOwner(#id, authentication)")
public Review update(Long id) { ... }
→ бин reviewSecurity должен быть в контексте Spring и возвращать true/false.
— Не надо вручную писать проверки в каждом методе.
— Авторизация централизована и читается прямо на уровне API.
— Условия можно вынести в отдельный сервис, чтобы не захламлять аннотацию.
👉 В итоге @PreAuthorize — это не только про роли, а про гибкий DSL проверки доступа, который можно расширять под проект: от банальной проверки ролей до бизнес-логики уровня "пользователь может редактировать только свои документы, если они ещё не опубликованы".
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍5🔥1
Производительность enterprise-систем часто упирается в кэширование. Но один только Redis — не всегда оптимально: сетевые вызовы вносят задержки, а локальные кэши не делятся данными между инстансами. Решение — связка in-memory и распределённого кэша.
📝 Промпт:
Generate a Spring Boot 3 configuration with multi-level caching (L1 + L2).
— Integrate Caffeine as in-memory (L1) cache for ultra-fast lookups.
— Integrate Redis as distributed (L2) cache for cross-instance consistency.
— Configure CacheManager that combines Caffeine (short-lived) and Redis (longer TTL) transparently.
— Implement annotation-based caching with @Cacheable, @CachePut, and @CacheEvict.
— Add fallback to DB if both caches miss, with metrics for hit/miss ratios.
— Ensure proper serialization (Jackson or Kryo) for complex entities in Redis.
— Provide cache invalidation strategies (per entity, per tenant, global).
— Добавьте Near-cache pattern для высоконагруженных сервисов.
— Интегрируйте с Spring Data Redis Streams для event-driven invalidation.
— Настройте Prometheus + Grafana dashboards для мониторинга кэш-слоя.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2❤1👏1
Когда в проекте сотни файлов и десятки классов — навигация превращается в хаос. А вы знали, что IDEA помнит все места, где вы недавно были?
🔹 Что делает
— Показывает список недавних мест в коде (не просто открытых файлов)
— Можно искать по содержимому, не только по имени
— Можно найти только изменённые фрагменты
🔹 Зачем это нужно
— Молниеносно возвращает к недавнему месту редактирования
— Полезно при ревью, багфиксе или исследовании сложных фрагментов
— Работает лучше, чем "Recent Files", ведь учитывает даже переходы внутри одного файла
🔹 Как использовать
— Нажмите
Ctrl+Shift+E
(Windows/Linux) или ⌘+Shift+E
(macOS)— Появится список последних мест где вы были. Можно также искать лишь изменённые фрагменты (повторно нажмите то же сочетание)
— Начните вводить фрагмент кода или имени и IDEA сама сузит поиск
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍6❤2
🎯 Как быстро настроить Zero-Downtime деплой Spring Boot-приложения с помощью Docker + Traefik
Обновлять сервис без остановки — не роскошь, а необходимость. Ни пользователи, ни ваши коллеги не должны видеть "502 Bad Gateway", пока вы выкатываете новую версию.
Пошагово разберём, как сделать быстрый и бесшовный деплой с балансировкой между версиями.
1️⃣ Готовим Dockerfile
Собираем образ:
2️⃣ Добавляем Traefik как reverse proxy
Создаём docker-compose.yml:
version: '3.8'
Запускаем:
Traefik автоматически поднимет роутер и начнёт проксировать трафик.
3️⃣ Выкатываем новую версию без даунтайма
Создаём новый образ:
Добавляем в docker-compose.yml рядом:
Теперь Traefik балансирует между двумя версиями — 1.0.0 и 1.1.0.
Можно спокойно проверить, что новая версия работает корректно.
4️⃣ Плавно отключаем старую
Если всё ок — выключаем старый контейнер:
Traefik мгновенно перестроит маршрут — без обрывов соединений.
Ни один пользователь не заметит переключения.
5️⃣ Добавляем health-checks для надёжности
В application.yml:
И в Docker-compose:
Traefik будет держать в балансе только живые инстансы.
Всё просто и надёжно.
💡 Что мы получили:
— Обновления без простоев
— Автоматическую балансировку
— Self-healing через health-checks
— Легко масштабируемую инфраструктуру для staging/prod
🐸 Библиотека джависта
#Enterprise
Обновлять сервис без остановки — не роскошь, а необходимость. Ни пользователи, ни ваши коллеги не должны видеть "502 Bad Gateway", пока вы выкатываете новую версию.
Пошагово разберём, как сделать быстрый и бесшовный деплой с балансировкой между версиями.
FROM eclipse-temurin:21-jdk
WORKDIR /app
COPY target/myapp.jar app.jar
ENTRYPOINT ["java","-jar","/app/app.jar"]
Собираем образ:
docker build -t myapp:1.0.0 .
Создаём docker-compose.yml:
version: '3.8'
services:
traefik:
image: traefik:v3.1
command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
ports:
- "80:80"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
myapp_v1:
image: myapp:1.0.0
labels:
- "traefik.enable=true"
- "traefik.http.routers.myapp.rule=Host(`myapp.local`)"
- "traefik.http.services.myapp.loadbalancer.server.port=8080"
Запускаем:
docker compose up -d
Traefik автоматически поднимет роутер и начнёт проксировать трафик.
Создаём новый образ:
docker build -t myapp:1.1.0 .
Добавляем в docker-compose.yml рядом:
myapp_v2:
image: myapp:1.1.0
labels:
- "traefik.enable=true"
- "traefik.http.routers.myapp.rule=Host(`myapp.local`)"
- "traefik.http.services.myapp.loadbalancer.server.port=8080"
Теперь Traefik балансирует между двумя версиями — 1.0.0 и 1.1.0.
Можно спокойно проверить, что новая версия работает корректно.
Если всё ок — выключаем старый контейнер:
docker compose stop myapp_v1
docker compose rm -f myapp_v1
Traefik мгновенно перестроит маршрут — без обрывов соединений.
Ни один пользователь не заметит переключения.
В application.yml:
management:
endpoints:
web:
exposure:
include: health
И в Docker-compose:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
interval: 10s
timeout: 3s
retries: 3
Traefik будет держать в балансе только живые инстансы.
Всё просто и надёжно.
— Обновления без простоев
— Автоматическую балансировку
— Self-healing через health-checks
— Легко масштабируемую инфраструктуру для staging/prod
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1👏1🤔1
🛰 Event-Driven Architecture с Apache Kafka
Монолиты и REST-взаимодействие упираются в масштабируемость. Event-driven архитектура с Kafka позволяет строить реактивные цепочки бизнес-логики, где события становятся мостом между сервисами.
📝 Промпт:
💡 Расширения:
— Настройте Kafka Streams для real-time агрегатов.
— Интегрируйте с Schema Registry для версионирования событий.
— Добавьте Observability: trace event flow with OpenTelemetry.
🐸 Библиотека джависта
#Enterprise
Монолиты и REST-взаимодействие упираются в масштабируемость. Event-driven архитектура с Kafka позволяет строить реактивные цепочки бизнес-логики, где события становятся мостом между сервисами.
📝 Промпт:
Generate a Spring Boot 3 microservice architecture example with Apache Kafka event-driven communication.
— Configure Kafka producer and consumer with Spring Kafka.
— Use JSON Schema/Avro for message serialization and schema validation.
— Implement a domain event publisher (e.g. OrderCreatedEvent).
— Add event listener services that react asynchronously (e.g. notification service, billing service).
— Implement idempotency strategy for consumers (deduplication of events).
— Use Kafka Transactions for exactly-once semantics.
— Add Dead Letter Queue (DLQ) handling for failed messages.
— Настройте Kafka Streams для real-time агрегатов.
— Интегрируйте с Schema Registry для версионирования событий.
— Добавьте Observability: trace event flow with OpenTelemetry.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2👏1
Когда IDE открыта часами, вкладок — десятки, а вы пытаетесь вспомнить, "где же я правил этот метод", эта комбинация спасает от паники.
🔹 Что делает
— Мгновенно возвращает курсор к последнему месту, где вы редактировали код
— Работает даже после навигации по проекту, переходов в другие файлы или классы
— Поддерживает “историю изменений” — можно нажимать несколько раз, чтобы двигаться назад по правкам
🔹 Зачем это нужно
— Экономит время при переключениях между файлами
— Полезно при дебаге или анализе кода, когда IDE уводит вас по ссылкам вглубь проекта
— Убирает хаос при работе с большим количеством вкладок
🔹 Как использовать
— Нажмите Ctrl+Shift+Backspace (Windows/Linux) или ⌘+Shift+Backspace (macOS)
— IDEA вернёт вас туда, где вы последний раз редактировали код
— Повторите комбинацию несколько раз — и вы пройдёте “назад по следам” своих правок
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍9❤4
⚙️ Spring Boot + Flyway: пошаговая настройка миграций базы данных
Когда проект живёт дольше полугода — ручное обновление схемы БД превращается в хаос.
Flyway решает эту проблему: управляет версионированием схемы и миграциями через SQL-скрипты прямо из вашего приложения.
Для настройки:
1️⃣ Добавляем зависимость
Также добавляет драйвер для вашей БД.
2️⃣ Создаём структуру для миграций
По умолчанию Flyway ищет скрипты в:
Пример:
Имена файлов важны — Flyway сортирует их по версии (V1, V2, ...).
3️⃣ Пример SQL-миграции
4️⃣ Настройки Flyway в application.yml
Flyway выполнит все миграции, которых ещё нет в таблице flyway_schema_history.
5️⃣ Команды и интеграция
▪️ Локально:
или просто запустите Spring Boot — миграции применятся автоматически.
▪️ Для CI/CD:
— Используйте flyway:validate перед деплоем.
— Добавляйте новые SQL-файлы при изменении схемы.
— Не редактируйте старые версии (они уже зафиксированы).
6️⃣ Полезные практики
— Используйте R__-скрипты (repeatable migrations) для справочников, триггеров, процедур.
— Версионируйте миграции в Git вместе с кодом.
— Проверяйте миграции на чистой базе перед мержем.
— Совмещайте с Testcontainers для автоматической проверки миграций в CI.
💡 Преимущество Flyway — прозрачная история эволюции базы. Можно воспроизвести схему любой версии, не ломая прод.
🐸 Библиотека джависта
#Enterprise
Когда проект живёт дольше полугода — ручное обновление схемы БД превращается в хаос.
Flyway решает эту проблему: управляет версионированием схемы и миграциями через SQL-скрипты прямо из вашего приложения.
Для настройки:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
ИЛИ
implementation("org.flywaydb:flyway-core")
Также добавляет драйвер для вашей БД.
По умолчанию Flyway ищет скрипты в:
src/main/resources/db/migration/
Пример:
db/migration/
├─ V1__init_schema.sql
├─ V2__add_users_table.sql
└─ V3__add_index_email.sql
Имена файлов важны — Flyway сортирует их по версии (V1, V2, ...).
— V1__init_schema.sql
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL
);
— V2__add_users_table.sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT now()
);
spring:
datasource:
url: jdbc:postgresql://localhost:5432/app
username: app
password: secret
flyway:
enabled: true
baseline-on-migrate: true
locations: classpath:db/migration
Flyway выполнит все миграции, которых ещё нет в таблице flyway_schema_history.
▪️ Локально:
./mvnw flyway:migrate
или просто запустите Spring Boot — миграции применятся автоматически.
▪️ Для CI/CD:
— Используйте flyway:validate перед деплоем.
— Добавляйте новые SQL-файлы при изменении схемы.
— Не редактируйте старые версии (они уже зафиксированы).
— Используйте R__-скрипты (repeatable migrations) для справочников, триггеров, процедур.
— Версионируйте миграции в Git вместе с кодом.
— Проверяйте миграции на чистой базе перед мержем.
— Совмещайте с Testcontainers для автоматической проверки миграций в CI.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥3👏1
🚀 Java Roadmap 2025
В 2025 году Java продолжает развиваться, и вот на что стоит обратить внимание в учёбе. Роадмапа на картинке, ниже ключевые моменты.
1️⃣ Основы и ООП
Фокус на record классы (Java 16+), абстракция и полиформизм.
2️⃣ Коллекции и потоки
Основной тренд — использование Streams API (Java 8+) и неизменяемых коллекций (Java 9+).
3️⃣ Многозадачность
Project Loom и виртуальные потоки (Java 21) упростят многозадачность и повысит производительность.
4️⃣ Функциональное программирование
Расширение использования лямбда-выражений и функциональных интерфейсов.
5️⃣ Web и микросервисы
Активное использование Spring Boot, Spring Cloud, Swagger/OpenAPI для документации.
6️⃣ Тестирование и сборка
JUnit 5, Mockito, Testcontainers и инструменты сборки Maven и Gradle для автоматизации.
7️⃣ Базы данных и ORM
Знания JDBC, Hibernate, JPA для создания надежных и масштабируемых систем.
🐸 Библиотека джависта
#Enterprise
В 2025 году Java продолжает развиваться, и вот на что стоит обратить внимание в учёбе. Роадмапа на картинке, ниже ключевые моменты.
Фокус на record классы (Java 16+), абстракция и полиформизм.
Основной тренд — использование Streams API (Java 8+) и неизменяемых коллекций (Java 9+).
Project Loom и виртуальные потоки (Java 21) упростят многозадачность и повысит производительность.
Расширение использования лямбда-выражений и функциональных интерфейсов.
Активное использование Spring Boot, Spring Cloud, Swagger/OpenAPI для документации.
JUnit 5, Mockito, Testcontainers и инструменты сборки Maven и Gradle для автоматизации.
Знания JDBC, Hibernate, JPA для создания надежных и масштабируемых систем.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥5❤2🥱1
🛡 Circuit Breaker & Resilience4j
В микросервисах падение одного сервиса может уронить всю систему — эффект «домино». Circuit Breaker помогает изолировать сбои и держать SLA под контролем.
📝 Промпт:
💡 Расширения:
— Настройте TimeLimiter для защиты от зависаний.
— Интегрируйте с Spring Cloud Gateway для глобальных политик.
— Добавьте Grafana dashboards для визуализации отказоустойчивости.
🐸 Библиотека джависта
#Enterprise
В микросервисах падение одного сервиса может уронить всю систему — эффект «домино». Circuit Breaker помогает изолировать сбои и держать SLA под контролем.
📝 Промпт:
Generate a Spring Boot 3 configuration with Resilience4j Circuit Breaker.
— Configure Circuit Breaker around external HTTP calls (e.g. RestTemplate/WebClient).
— Add Retry policy with exponential backoff.
— Add Rate Limiter and Bulkhead isolation (thread pool separation).
— Provide fallback methods (graceful degradation).
— Enable metrics collection with Micrometer and Prometheus.
— Expose actuator endpoints for circuit state monitoring.
— Add chaos testing scenario: simulate latency and failures.
— Настройте TimeLimiter для защиты от зависаний.
— Интегрируйте с Spring Cloud Gateway для глобальных политик.
— Добавьте Grafana dashboards для визуализации отказоустойчивости.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🔥1
Всё ещё запускаете проект мышкой? Тогда этот пост для вас.
На самом деле IDEA умеет стартовать, дебажить и останавливать приложение полностью без кликов мышью. После пары дней привычки вы забудете, где находится зелёная кнопка ▶️.
🔹 Что делает
— Позволяет запускать и останавливать проект, не касаясь мыши
— Работает с любыми конфигурациями: Application, Maven, Gradle, Spring Boot и др.
— Поддерживает горячий перезапуск (rerun) и мгновенный переход к дебагу
🔹 Зачем это нужно
— Ускоряет цикл “правка → запуск → проверка”
— Позволяет фокусироваться на коде, не отвлекаясь на интерфейс
— Особенно удобно при работе на ноутбуке или в tmux-подобном флоу
🔹 Как использовать
▶️ Shift + F10 — запустить последнюю конфигурацию
🐞 Shift + F9 — запустить в режиме отладки
⏹️ Ctrl + F2 — остановить выполнение
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥2
🔥 Как подключить Keycloak к Spring Boot проекту
Keycloak — это современный open-source Identity Provider от Red Hat, который часто используется в enterprise-проектах для SSO (Single Sign-On), OAuth2 и OpenID Connect. Ниже — пошаговая настройка интеграции Keycloak с Spring Boot 3 и Spring Security 6.
1️⃣ Зависимости
Проверьте, что в проекте есть или добавьте следующие зависимости:
— Spring Web
— Spring Security
— OAuth2 Resource Server
— OAuth2 Client
2️⃣ Разворачиваем Keycloak
Запустите Keycloak через Docker:
После запуска откройте http://localhost:8080, войдите под admin/admin и создайте realm, например demo-realm.
3️⃣ Настройка клиента в Keycloak
В разделе Clients → Create client укажите:
— Client ID: spring-client
— Client Protocol: openid-connect
— Root URL: http://localhost:8081
В разделе Settings:
— Установите Access Type → confidential
— Включите Standard Flow Enabled
— Укажите Redirect URI: http://localhost:8081/login/oauth2/code/keycloak
Сохраните и перейдите на вкладку Credentials — скопируйте Client Secret.
4️⃣ Настройка application.yml
5️⃣ Конфигурация безопасности
Настройте SecurityConfig.java:
🧠 Зачем это нужно:
Keycloak снимает с вас головную боль по хранению паролей, управлению ролями и сессиями. Он интегрируется с LDAP, AD, SAML и десятками внешних OAuth-провайдеров.
🐸 Библиотека джависта
#Enterprise
Keycloak — это современный open-source Identity Provider от Red Hat, который часто используется в enterprise-проектах для SSO (Single Sign-On), OAuth2 и OpenID Connect. Ниже — пошаговая настройка интеграции Keycloak с Spring Boot 3 и Spring Security 6.
Проверьте, что в проекте есть или добавьте следующие зависимости:
— Spring Web
— Spring Security
— OAuth2 Resource Server
— OAuth2 Client
Запустите Keycloak через Docker:
docker run -d \
-p 8080:8080 \
-e KEYCLOAK_ADMIN=admin \
-e KEYCLOAK_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:25.0.2 start-dev
После запуска откройте http://localhost:8080, войдите под admin/admin и создайте realm, например demo-realm.
В разделе Clients → Create client укажите:
— Client ID: spring-client
— Client Protocol: openid-connect
— Root URL: http://localhost:8081
В разделе Settings:
— Установите Access Type → confidential
— Включите Standard Flow Enabled
— Укажите Redirect URI: http://localhost:8081/login/oauth2/code/keycloak
Сохраните и перейдите на вкладку Credentials — скопируйте Client Secret.
server:
port: 8081
spring:
security:
oauth2:
client:
registration:
keycloak:
client-id: spring-client
client-secret: YOUR_CLIENT_SECRET
scope: openid, profile, email
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
provider:
keycloak:
issuer-uri: http://localhost:8080/realms/demo-realm
Настройте SecurityConfig.java:
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/public").permitAll()
.anyRequest().authenticated()
)
.oauth2Login(Customizer.withDefaults())
.logout(logout -> logout
.logoutSuccessUrl("/")
.invalidateHttpSession(true)
);
return http.build();
}
}
🧠 Зачем это нужно:
Keycloak снимает с вас головную боль по хранению паролей, управлению ролями и сессиями. Он интегрируется с LDAP, AD, SAML и десятками внешних OAuth-провайдеров.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥1