В рамках разработки приложений часто возникает необходимость в создании нескольких окружений. Например, окружение для продакшена и девелопмента. Эти окружения могут отличаться по конфигурациям, инструментам и сервисам, необходимым для работы.
Предположим, что мы хотим разработать окружения для 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
Уже через 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!
Также про JEP'ы, включенные в этот релиз, компания JetBrains записала целую серию видео. Смотреть можно здесь:
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Java 23 - Launch Stream
Come celebrate the #Java 23 launch with us on September 17th from 13:00 to 16:30 UTC. We will cover new features, community updates, and what to expect from future releases. We'll have presentations from exciting guests like Brian Goetz, Ron Pressler, Gavin…
Netflix перешел с G1 на Generational ZGC, начиная с JDK 21, из-за значительных преимуществ, связанных с многопоточной сборкой мусора.
Команда Spring АйО подготовила перевод статьи, в которой инженеры стримингового сервиса рассказали о неожиданных и ожидаемых преимуществах Generational ZGC.
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
Entity Graph — это один из мощных инструментов JPA, который помогает разработчикам гибко управлять загрузкой связанных сущностей. Entity Graph позволяет динамически настраивать загрузку данных во время выполнения программы, что делает его особенно полезным в проектах со сложными структурами данных.
Команда Spring АйО подготовила статью, в которой рассмотрела, как использовать Entity Graph.
📚Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/844336/
#SpringTips #JPA
Какой технологией пользуетесь для взаимодействия с базой данных в продакшн-среде?
Anonymous Poll
74%
Spring Data JPA
19%
Spring Data JDBC/R2DBC
7%
Spring Data MongoDB/Reactive MongoDB
11%
Spring Data Redis/Reactive Redis
2%
Spring Data Cassandra/Reactive Cassandra
4%
Spring Data Elasticsearch
27%
Spring JDBC
4%
Spring MyBatis Framework
11%
JOOQ
4%
Свой вариант напишу в комментариях
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Для тех, кто был слишком занят на неделе или просто пропустил некоторые посты, публикуем дайджест!
– Эффективное управление окружениями с Docker Compose — рассказали про не всем известный способ настройки окружения с использованием extends и include
– Java 23 - Launch Stream — Oracle в прямом эфире представил Java 23 и все её нововведения
– Подчини паузы своей воле с Generational ZGC — узнали от команды Netflix о неожиданных и ожидаемых преимуществах Generational ZGC
– JPA Entity Graph и нюансы его использования — погрузились в технологию гибкого переключения между стратегиями загрузки данных
– Какой технологией пользуетесь для взаимодействия с базой данных в продакшн-среде? — провели опрос среди участников сообщества, который вызвал не мало обсуждений в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
Друзья, хотим поделиться с вами важной новостью. Сообщество 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/
Что если мы скажем вам, что отладчик может стать не просто инструментом для поиска ошибок, а настоящим "режимом бога" в мире кода?
В новом переводе от команды Spring АйО рассматривается, как можно исследовать память приложения и изменить его функциональность, при этом не затрагивая исходного кода, а используя только лишь отладчик IntelliJ IDEA.
📚Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/845554/
В новом посте из цикла "#ВопросЭксперту" Михаил Поливаха – эксперт сообщества 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
Недавно была обнаружена критическая уязвимость, угрожающая всем системам 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
Кстати, сколько вам лет?
Anonymous Poll
3%
меньше 20
37%
от 20 до 30
36%
от 30 до 40
16%
от 40 до 50
3%
от 50 до 60
1%
больше 60
2%
не хочу говорить
Для тех, кто был слишком занят на неделе или просто пропустил некоторые посты, публикуем дайджест!
– Взлом JVM-приложения с помощью отладчика IntelliJ IDEA — изменили функциональность приложения, при этом не притронулись к исходному коду
– Hibernate 7.0 уже близко! — поделились новостью про грядущее обновление Hibernate
– #ВопросЭксперту: Spring Data R2DBC. Что не так с реактивными ORM? — посмотрели на интересный кейс из реактивного стека от эксперта сообщества
– Критическая уязвимость с оценкой CVSS 9.9 обнаружена в системах GNU/Linux — не оставили без внимания недавно обнаруженную проблему в GNU/Linux, а также способы ее обхода
– Если бы программисты строили дома #old_but_gold — поностальгировали и посмеялись с рассказа с аналогией между строителями и программистами
Please open Telegram to view this post
VIEW IN TELEGRAM
📏 Почему нет достойных форматтеров кода для Java?
Форматирование кода в Java всегда было темой обсуждения среди разработчиков. Многочисленные инструменты предлагают свои решения, но ни один из них не кажется идеальным. Так, возникает вопрос: есть ли форматтер, который действительно отвечает всем нашим требованиям?
В новом переводе от команды Spring АйО рассмотрены популярные инструменты, их плюсы и минусы, а также рассуждения на тему: может ли Java-экосистема предложить достойный форматтер?
📚Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/846278/
Форматирование кода в Java всегда было темой обсуждения среди разработчиков. Многочисленные инструменты предлагают свои решения, но ни один из них не кажется идеальным. Так, возникает вопрос: есть ли форматтер, который действительно отвечает всем нашим требованиям?
В новом переводе от команды Spring АйО рассмотрены популярные инструменты, их плюсы и минусы, а также рассуждения на тему: может ли Java-экосистема предложить достойный форматтер?
📚Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/846278/