Spring АйО
7.67K subscribers
262 photos
152 videos
338 links
Русскоязычное сообщество Spring-разработчиков.

Habr: bit.ly/433IK46
YouTube: bit.ly/4h3Ci0x
VK: bit.ly/4hF0OG8
Rutube: bit.ly/4b4UeX6
Яндекс Музыка: bit.ly/3EIizWy

Канал для общения: @spring_aio_chat
Download Telegram
🐳 Эффективное управление окружениями с Docker Compose

В рамках разработки приложений часто возникает необходимость в создании нескольких окружений. Например, окружение для продакшена и девелопмента. Эти окружения могут отличаться по конфигурациям, инструментам и сервисам, необходимым для работы.

Предположим, что мы хотим разработать окружения для Spring Boot приложения, использующего PostgreSQL и Kafka:
* Для продакшена: минимальный набор сервисов – Spring Boot, PostgreSQL и Kafka.
* Для разработки: расширенный набор, Spring Boot, PostgreSQL, Kafka и удобные инструменты для работы, такие как pgAdmin и KafkaUI.

Мы рассмотрим решение этой задачи в контексте использования Docker Compose. Отметим, что в большинстве случаев для продакшена рекомендуется использовать более продвинутые решения, например, Kubernetes.

Возможные способы решения поставленной задачи

1. Один файл с профилями
Можно описать все сервисы в одном docker-compose.yml и использовать профили для разделения сервисов, необходимых в продакшене и разработке. Такой подход позволит легко управлять сервисами, активируя нужные профили в зависимости от окружения.

Преимущества:
* Один файл для управления всеми сервисами.
* Легкость переключения между окружениями за счёт использования профилей.

Недостатки:
* Отсутствие гибкости: сложно настроить разные порты, скрипты инициализации для сервисов в разных окружениях.
* Не всегда удобен для сложных конфигураций.

2. Дублирование файлов

Преимущества:
* Полная гибкость в настройке каждого окружения.
* Можно легко добавить уникальные параметры и сервисы для каждого случая.

Недостатки:
* Дублирование кода.
* Сложность синхронизации изменений между файлами.
* Проблемы с поддержкой нескольких файлов (например, при добавлении нового сервиса).

3. Переиспользование сервисов с include и extends

Возможно, не все знают, но Docker Compose предоставляет ключевые слова include и extends, которые могут отлично подойти для нашей задачи. Эти конструкции позволяют избежать дублирования кода, переиспользуя общие сервисы между различными файлами.

* Include даёт возможность подключить один docker compose файл к другому, аналогично запуску нескольких файлов через терминал. Этот способ полезен, если нам нужно просто включить сервисы без дополнительных изменений.
* Extends – более гибкий инструмент, который позволяет подключить сервисы из одного файла в другой и переопределить их свойства, что особенно удобно, если требуется настроить окружение под разные нужды.

Преимущества:
* Избегаем дублирования кода.
* Гибкость при настройке сервисов в разных окружениях.
* Возможность вынести общие сервисы в отдельный файл и изменять их конфигурации в каждом окружении.

Недостатки:
* Сложнее в реализации и поддержке по сравнению с одним файлом с профилями.
* Потребуются дополнительные знания о синтаксисе docker-compose.

services.yml (общие сервисы)


version: '3.8'
services:
postgres:
image: postgres:13
kafka:
image: bitnami/kafka:latest


docker-compose.prod.yml:


version: '3.8'
services:
spring:
image: my-spring-app:latest
postgres:
extends:
file: services.yml
service: postgres
kafka:
extends:
file: services.yml
service: kafka


docker-compose.dev.yml:


version: '3.8'
services:
postgres:
extends:
file: services.yml
service: postgres
kafka:
extends:
file: services.yml
service: kafka
pgadmin:
image: dpage/pgadmin4
kafka-ui:
image: provectuslabs/kafka-ui


Таким образом, extends позволяет нам гибко конфигурировать окружения и при этом не дублировать код, что делает этот способ наиболее подходящим для нашей задачи.

Ставь ❤️ если знал про extends/include и 🔥 если не знал

#DockerCompose #Tips
Please open Telegram to view this post
VIEW IN TELEGRAM
😲 Java 23 - Launch Stream

Уже через 7 часов на YouTube канале Java пройдет прямая трансляция, посвящённая релизу Java под номером 23.

Расписание трансляции (время GMT+3 МСК):

Deep Dive into Java 23's Features!
16:00: Welcome and event agenda
16:05: Java Language Update by Gavin Bierman
16:20: Java Language Features in Action
16:35: Integrity by Default with Ron Pressler
16:55: Markdown Documentation Comments with Jonathan Gibbons
17:10: ZGC: Generational Mode by Default with Stefan Karlson

Java Outreach in 2024
17:25: Java Playground Updates with Denys Makogon and Heather Stephens
17:40: Java Community Report from Sharat Chander and Jim Grisanzio

Java Preview Features and Future work
18:10: Sneak Peek at GraalVM Updates with Alina Yurenko and Fabio Niephaus
18:30: Class-File API with Brian Goetz
18:45: State of Project Leyden with John Rose
18:15: Enjoy Your Evening!

😉 https://www.youtube.com/watch?v=QG9xKpgwOI4

Также про JEP'ы, включенные в этот релиз, компания JetBrains записала целую серию видео. Смотреть можно здесь: 😉 JEP Explained.
Please open Telegram to view this post
VIEW IN TELEGRAM
😎 Подчини паузы своей воле с Generational ZGC

Netflix перешел с G1 на Generational ZGC, начиная с JDK 21, из-за значительных преимуществ, связанных с многопоточной сборкой мусора.

Команда Spring АйО подготовила перевод статьи, в которой инженеры стримингового сервиса рассказали о неожиданных и ожидаемых преимуществах Generational ZGC.

📚 Читать на Хабре: https://habr.com/ru/companies/spring_aio/articles/844048/
Please open Telegram to view this post
VIEW IN TELEGRAM
🌳 JPA Entity Graph и нюансы его использования

Entity Graph — это один из мощных инструментов JPA, который помогает разработчикам гибко управлять загрузкой связанных сущностей. Entity Graph позволяет динамически настраивать загрузку данных во время выполнения программы, что делает его особенно полезным в проектах со сложными структурами данных.

Команда Spring АйО подготовила статью, в которой рассмотрела, как использовать Entity Graph.

📚Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/844336/

#SpringTips #JPA
🗓 Еженедельный дайджест №14

Для тех, кто был слишком занят на неделе или просто пропустил некоторые посты, публикуем дайджест!

Эффективное управление окружениями с Docker Composeрассказали про не всем известный способ настройки окружения с использованием extends и include

Java 23 - Launch StreamOracle в прямом эфире представил Java 23 и все её нововведения

Подчини паузы своей воле с Generational ZGCузнали от команды Netflix о неожиданных и ожидаемых преимуществах Generational ZGC

JPA Entity Graph и нюансы его использованияпогрузились в технологию гибкого переключения между стратегиями загрузки данных

Какой технологией пользуетесь для взаимодействия с базой данных в продакшн-среде?провели опрос среди участников сообщества, который вызвал не мало обсуждений в комментариях

😌 @spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
⭐️ Haulmont – партнёр Spring АйО

Друзья, хотим поделиться с вами важной новостью. Сообщество Spring АйО активно начало свою деятельность в начале лета, и, за этот, казалось бы, небольшой промежуток времени, мы успели сделать многое:

– Опубликовано 34 статьи на Хабре
– Общее количество постов в нашем канале превысило 200
– Сообщество насчитывает более 3 000 участников

Самое главное, нам удалось собрать отличную команду, которая занимается созданием материалов. Некоторых экспертов сообщества вы уже хорошо знаете, с другими мы вас ещё познакомим, а кто-то предпочитает помогать без личного упоминания.

Мы стремимся быть максимально прозрачными с вами и хотим отметить, что для производства качественного контента и поддержки команды необходимы финансовые ресурсы. Вы могли заметить, что в нашем сообществе отсутствует прямая реклама. Вместо этого мы выбрали путь сотрудничества с крупными технологическими компаниями на взаимовыгодных условиях.

В ближайшее время мы объявим всех партнёров сообщества, благодаря которым возможна стабильная работа команды Spring АйО. Вместо рекламы мы будем время от времени публиковать партнёрские посты, которые будут отмечены эмодзи – ⭐️.

–––

Встречайте нашего первого партнёра – компанию Haulmont. Haulmont – российская компания, специализирующаяся на разработке корпоративного программного обеспечения для коммерческого сектора и государственных структур. Для нас, как для Spring-разработчиков, Haulmont интересен таким продуктом, как Amplicode. Отметим, что команда Amplicode активно помогает нам в создании материалов и приглашает нас принимать участие в своих мероприятиях, за что им отдельное спасибо!

Благодаря поддержке наших партнёров, мы сможем продолжать развивать сообщество и создавать для вас качественный контент 💚
Please open Telegram to view this post
VIEW IN TELEGRAM
🪲 Взлом JVM-приложения с помощью отладчика IntelliJ IDEA

Что если мы скажем вам, что отладчик может стать не просто инструментом для поиска ошибок, а настоящим "режимом бога" в мире кода?

В новом переводе от команды Spring АйО рассматривается, как можно исследовать память приложения и изменить его функциональность, при этом не затрагивая исходного кода, а используя только лишь отладчик IntelliJ IDEA.

📚Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/845554/
Please open Telegram to view this post
VIEW IN TELEGRAM
#ВопросЭксперту: Spring Data R2DBC. Что не так с реактивными ORM?

В новом посте из цикла "#ВопросЭксперту" Михаил Поливаха – эксперт сообщества Spring АйО, ответил на мучающий многих вопрос и рассказал про нюансы Spring Data R2DBC.

–––

Работать с RDBMS в реактивных приложениях бывает сложно, и на то есть реальные причины. Тут совершенно неважно, написаны эти приложения с использованием RXJava или Project Reactor, есть некоторые проблемы на стыке концепций. Но надо понимать, что иногда с этим добром приходится работать, поэтому предлагаю взглянуть на пример ниже (полный код можно увидеть в моем playground репо на GitHub'е):


@Table("orders")
public class Order {

@Id
@EqualsAndHashCode.Include
private Long id;
private String status;
@MappedCollection(keyColumn = "order_id", idColumn = "order_id")
private List<OrderItem> orderItems;
}

@Table("order_item")
public class OrderItem {

@Id
@EqualsAndHashCode.Include
private Long id;
private String name;
private double price;
}

public interface OrderRepository extends ReactiveCrudRepository<Order, Long> { }

// INSERT INTO orders(id, "status") VALUES(1, 'NEW');
// INSERT INTO order_item("name", "order_id") VALUES('Lego', 1);
class OrderRepositoryTest extends AbstractPostgreSQLIntegrationTest {
@Test
void testR2dbcAggregateLoading() {
StepVerifier
.create(orderRepository.findById(1L))
.expectNextMatches(order -> {
System.out.println(order);
return order.getOrderItems().size() == 2 && order.getStatus().equals("NEW");
})
.expectComplete()
.verify();
}
}


А теперь ответьте на вопрос: "Пройдет ли тест успешно?". Я специально сделал пример довольно простым, убрал какие-то доп. компоненты/настройки.

На самом деле проблема в том, что у нас не подгрузилось One-To-Many отношение. Казалось бы, в концепцию DDD оно нормально ложится, и в Spring Data JDBC оно работает нормально. В таком случае вопрос: "Что пошло не так и почему?". Наверное, многим будет интересно узнать, что же случилось?

Ответ я разобью на пункты:

1. Это не баг, поддержки любого рода relation'ов в Spring Data R2DBC сейчас нет.
2. Конкретно в текущем случае, который мы рассматриваем, сделать поддержку relation'ов можно.
3. Почему поддержки relation'ов нет сейчас? TL;DR: потому что отсутствует нормальный способ реализовать поддержку relation'ов в общем случае(!) для Aggregates с учетом парадигмы реактивного программирования.

Хочу заметить, что, в целом, реализовать поддержку relation'ов можно, но будут свои нюансы и вытекающие проблемы. Поскольку эта тема очень большая, детали того, почему же так, что делать, и какие планы работы с этим, я поясню на своем докладе на Joker.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚠️ Критическая уязвимость с оценкой CVSS 9.9 обнаружена в системах GNU/Linux

Недавно была обнаружена критическая уязвимость, угрожающая всем системам GNU/Linux, которая позволяет выполнять код удаленно без аутентификации. Проблема затронула такие компании, как Canonical и Red Hat, и получила оценку 9.9 из 10 по шкале CVSS, что подтверждает её серьёзность. Пока патч не выпущен, разработчики и пользователи находятся в состоянии неопределенности, опасаясь возможных последствий.

В новом переводе от команды Spring АйО приводятся подробности о сроках раскрытия деталей уязвимости и предлагаются временные меры для защиты систем.

📚Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/846498/
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🗓 Еженедельный дайджест №15

Для тех, кто был слишком занят на неделе или просто пропустил некоторые посты, публикуем дайджест!

Взлом JVM-приложения с помощью отладчика IntelliJ IDEAизменили функциональность приложения, при этом не притронулись к исходному коду

Hibernate 7.0 уже близко!поделились новостью про грядущее обновление Hibernate

#ВопросЭксперту: Spring Data R2DBC. Что не так с реактивными ORM?посмотрели на интересный кейс из реактивного стека от эксперта сообщества

Критическая уязвимость с оценкой CVSS 9.9 обнаружена в системах GNU/Linuxне оставили без внимания недавно обнаруженную проблему в GNU/Linux, а также способы ее обхода

Если бы программисты строили дома #old_but_goldпоностальгировали и посмеялись с рассказа с аналогией между строителями и программистами

😌 @spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
📏 Почему нет достойных форматтеров кода для Java?

Форматирование кода в Java всегда было темой обсуждения среди разработчиков. Многочисленные инструменты предлагают свои решения, но ни один из них не кажется идеальным. Так, возникает вопрос: есть ли форматтер, который действительно отвечает всем нашим требованиям?

В новом переводе от команды Spring АйО рассмотрены популярные инструменты, их плюсы и минусы, а также рассуждения на тему: может ли Java-экосистема предложить достойный форматтер?

📚Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/846278/