Java Гениев
87 subscribers
204 photos
77 videos
180 links
Download Telegram
Устойчивость микросервисных Spring приложений: роль аннотации Transactional в предотвращении утечки соединений

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

Микросервисные Spring приложения сильно зависят от стабильного и эффективного взаимодействия с базой данных, которое часто осуществляется через Java Persistence API (JPA). Для поддержания высокой производительности важно правильно управлять пулом соединений и предотвращать утечки соединений, чтобы взаимодействие с базой данных не снижало производительность приложения.

https://habr.com/ru/companies/spring_aio/articles/827642/

👉
How-to Build Custom Java Runtimes with Jlink.

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

https://www.youtube.com/watch?v=mJKlxqQQeyI&t=52s

👉
👩‍💻 Интеграционные тесты контроллеров, интеграций с внешними API и безопасности.

Ждём вас на третьем занятии серии открытых практических уроков по тестированию Spring-приложений от OTUS, где мы:

- рассмотрим специфику тестирования классических и REST-контроллеров и интеграций с внешними API;
- уделим внимание тому, как проверить, что все конечные точки нашего приложения действительно защищены;
- ответим на все возникающие вопросы.

Спикер — Senior Software Engineer, опытный преподаватель и руководитель курса.

Встречаемся 16 июля в 20:00 мск в преддверии старта курса «Разработчик на Spring Framework».
Все участники вебинара получат специальную цену на обучение!

➡️ Регистрируйтесь прямо сейчас, чтобы не пропустить бесплатный урок и получить записи предыдущих вебинаров серии: https://vk.cc/cygmcP

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Зачем выбирать ReentrantLock вместо synchronized?

Объект класса ReentrantLock решает те же задачи, что и блок synchronized. Поток висит на вызове метода lock() в ожидании своей очереди занять этот объект. Владеть локом, как и находиться внутри блока synchronized может только один поток одновременно. unlock(), подобно выходу из блока синхронизации, освобождает объект-монитор для других потоков.

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

Шире и возможные режимы блокировки. Кроме обычного ожидающего lock(), вариант tryLock() с параметром ожидает своей очереди только заданное время, а без параметра – вообще не ждет, а только захватывает свободный лок.

Еще одно отличие – свойство fair. Лок с этим свойством обеспечивает «справедливость» очереди: пришедший раньше поток захватывает объект раньше. Блок synchronized не дает никаких гарантий порядка.

👉
♨️ Хотите добиться максимальной производительности от своих Java-проектов?

Научитесь искусству измерения производительности и оптимизации кода на нашем увлекательном онлайн-уроке.

Забудьте о гадании и предположениях!
На этом вебинаре мы расскажем вам о мощном инструменте Java Microbenchmark Harness (JMH) и его области применения. Вместе мы разберем работу с производительными тестами и сравнением различных алгоритмов.

Вебинар будет полезен как Java-разработчикам, которые ищут лучшие практики для оптимизации кода, так и тестировщикам, специализирующимся на нагрузочном тестировании.

Спикер — Tech Lead в одном из крупнейших российских банков и кандидат технических наук.

Готовы стать мастером производительности в Java?

➡️ Регистрируйтесь прямо сейчас и откройте новый уровень эффективности в своих проектах: https://vk.cc/cykdYt

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Курс по Kubernetes для разработчиков. Видеокурс по Docker в подарок ⤵️

Ваша компания решила мигрировать сервисы на Kubernetes?
Большая часть интересных вам вакансий требует навыков в K8s?
Вы не врубаетесь, где границы ответственности девопсов и разработчиков в работе с кубами?

Разбираемся с этим на курсе Слёрма «Kubernetes для разработчиков» 😎

Старт потока — 22 июля

ПРОГРАММА КУРСА

Вас ждут:
7 недель обучения 
112 часов практики + 26 часов теории
Общий чат со студентами, экспертами и куратором
Стенды для отработки практических навыков
Сдача сертификации
Итоговый проект

Эксперты — действующие devops-инженеры:
➡️ Марсель Ибраев, Senior System Engineer G42 Cloud
➡️ Павел Селиванов, архитектор Yandex Cloud

🎁 При оплате обучения до 22 июля — видеокурс по основам Docker в подарок🎁

🔗 ПРОЙТИ ПЕРВЫЕ ТРИ УРОКА БЕСПЛАТНО
Совет 💡

Если вы хотите получить сообщение о первопричине, вы можете легко и безопасно получить его с помощью Apache Commons ExceptionUtils. Методы getRootCauseMessage(Exception ex) выдают сообщение в виде {ClassNameWithoutPackage} {ThrowableMessage}

👉
⚛️Росатом ищет разработчиков на позицию Backend Developer (Java) HR TECH в Гринатом (IT-интегратор Росатома)

Требования: опыт разработки и поддержки микросервисов на Java; опыт работы с реляционным базами данных (PostgreSQL); опыт проведения Сode Review; знание основных методологий разработки программного обеспечения, принципов OOП, шаблонов проектирования, принципов SOLID, DRY, KISS; практика использования Test Containers в интеграционных тестах; отличное знание Spring/Spring Boot (Core, MVC/Webflux, Data/Integration, Security, Actuator, Auto configuration, AOP); опыт работы с Kafka; хорошее знание Maven/Gradle и CI/CD систем(Gitlab/Jenkins); профилирование кода, анализ дампов памяти, анализ логов, метрик и трассировок, тонкая настройка JVM.

Мы предлагаем: полностью удалённую работу на территории РФ или рабочее место в уютном офисе; конкурентную ЗП и премии, оформление по ТК с удобным графиком, выбор между удалёнкой и офисом, карьерный рост, ДМС со стоматологией, собственную платформу для обучения, конференции и тренинги.

👉Узнать подробнее и откликнуться можно по ссылке.
Бывают ли в Java утечки памяти?


Сначала стоит сказать, что это такое. Утечка памяти (memory leak) в широком смысле – потеря доступа к некоторой сущности, которая при этом всё еще остается «живой» и расходует ресурсы компьютера.

Основное отличие Java от языков вроде C – автоматическое управление памятью. В общем случае вам не нужно думать об удалении объекта из памяти. Когда он перестал быть нужен, сборщик мусора сделает это за вас.

Но всё-таки бывают случаи, когда JVM не способна помочь, и прибираться за собой нужно вручную:

1. Объекты в статических полях. Обычно они живут пока живёт класслоадер, который обычно живет до конца работы приложения. В эту же группу риска попадают синглтоны, которые обычно базируются на статиках. Отдельного внимания заслуживает случай утечки ThreadLocal.

2. Взаимодействие с нативным кодом и ручное управление памятью. Когда вы решаетесь на ручное/внешнее управление, вся ответственность за сборку мусора переходит на вас. Это касается использования Unsafe и нативных библиотек. Сюда же попадают различные утечки внешних ресурсов: например соединений с базой через нативный драйвер.

3. Неправильное использование коллекций. Несогласованность методов equals-hashCode может позволить ключам теряться внутри HashMap/HashSet. Размер зарезервированной памяти часто не совпадает с размером содержимого: тот же HashMap, однажды раздувшись, не умеет уменьшаться.
4. Использование finalize. Вмешиваясь в нормальную работу GC, вы, естественно, можете её нарушить. Поток финализации имеет низкий приоритет – даже корректная реализация метода может не успеть выполниться и привести к OutOfMemoryError.

5. Утечка inner-класса. В отличие от nested, inner класс содержит неявную ссылку на своего хозяина. Так что экземпляр хозяина гарантированно будет жить пока живут экземпляры его inner-классов.

6. Интернированные строки. Вызовом String.intern() вы подписываетесь под тем, что осознаете что делаете. Ручное использование оптимизационных хитростей JVM не может не сопровождаться риском. Поведение этого метода зависит от версии Java и реализации JVM.

7. Паттерн Flyweight/object pool. И пул строк, и вся модель памяти реализуют его. Неправильная программная реализация паттерна также может привести к утечке объектов – зависанию их в пулле без реальных применений снаружи.

8. Всевозможные логические утечки. Нарушение консистентности модели бизнес-данных может приводить к забытым объектам. Технически это всё еще один из пунктов выше. Типичный пример такой утечки – утечка Activity в Android.

Так что ответ на вопрос – редко, но бывают.


👉
Spring Boot Microservices проект электронной коммерции: пошаговое руководство

В этом уроке мы создадим простое приложение для электронной коммерции, используя архитектуру микросервисов с Spring Boot и Spring Cloud. Мы создадим следующие микросервисы:
⚫️Сервис продуктов: Управляет информацией о продукте.
⚫️Сервис заказов: Управляет заказами клиентов.
⚫️Inventory Service: Управляет инвентаризацией продукции.
⚫️Сервер Eureka Server: Обнаружение сервисов.
⚫️Шлюз API: Действует как единая точка входа в систему.


https://www.sourcecodeexamples.net/2024/05/spring-boot-microservices-e-commerce-project.html

👉
🤝 Не дай себя завязнуть в рутинных задачах!

🦾 Осваивай Spring и выходи на новый профессиональный уровень

Пройди тест по Java от OTUS

Проверь насколько хорошо ты знаешь Java и готов освоить Spring!

Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене.

👉 ПРОЙТИ ТЕСТ: https://vk.cc/cysfVZ

🎫 Начни обучение со скидкой в 10%, действует до конца июля.

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Совет по Java ☕️

В Java 22 появился новый форматированный тип ListFormat. Он создает или разбирает список конкатенированных строк с учетом локальных особенностей. Предусмотрено 3 типа конкатенации: STANDARD, OR и UNIT, и 3 стиля для каждого типа: FULL, SHORT и NARROW.

👉
Советы по Java 💡

Как инициализировать collections или map в Java? Конечно, вы можете использовать, например, статическую инициализацию фабрики (`List.of(...)` или `Map.of(...)`).
Но вы также можете воспользоваться функцией "инициализации двойной скобкой"

👉
⁉️ Kafka vs RabbitMQ — что выбрать?

Наш открытый урок — ваш шанс раз и навсегда понять, какая система лучше подходит для ваших задач.

Мы разберем ключевые различия между RabbitMQ и Apache Kafka, включая их архитектуру, производительность, способы хранения сообщений и внутреннюю организацию.
Вы увидите демонстрацию работы брокеров сообщений и получите сравнительный анализ, который поможет вам сделать осознанный выбор.

25 июля в 20:00 мск, ждем вас на открытом уроке, который пройдет в рамках онлайн-курса «Java Developer. Professional» в OTUS.

Занятие предназначено для разработчиков и архитекторов ПО.

👉 Записывайтесь на бесплатный вебинар «Kafka vs RabbitMQ: выбор правильной системы сообщений» прямо сейчас: https://vk.cc/cytTD7

🎫 Начните обучение со скидкой в 10%, действует до конца июля.

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
How to map Java Enum to custom values with JPA and Hibernate

Заметка, в которой рассказывается о том, как маппить Enum не в имя или порядковый номер, а в какое-то кастомное поле, содержащееся в енаме, используя для этого кастомный конвертер.

https://vladmihalcea.com/java-enum-custom-values/

👉
Эффективность Spring-приложений в рантайме. Текущее состояние дел и планы на будущее

Перевод статьи об оптимизации Spring-приложений. Рассматриваются как уже доступные GraalVM Native Image и Project CRaC, так и будущие оптимизации, входящие в Project Leyden.

В свете недавнего выхода Spring Framework 6.1 и Spring Boot 3.2, мы хотели бы поделиться обзором тех усилий, которые предпринимает команда Spring, чтобы позволить разработчикам оптимизировать эффективность их приложений во время выполнения.

https://habr.com/ru/companies/spring_aio/articles/824328/

👉
Летняя распродажа в Слёрме: -50% на все видеокурсы из списка

С 17 по 31 июля в Слёрме на все видеокурсы из этого списка скидка 50% по промокоду LETO2024.

До старта бизнес-сезона осталось меньше половины лета. Пока на вас не свалилось 500 новых проектов, можно спокойно разобраться в новом инструменте, подходе или методике.

Время до сентября — лучшее, чтобы прокачать свой стек 😉

Доступ к видеоурокам сохранится на 2 года
Вы можете спланировать учёбу на год вперёд, купить дешевле и учиться в любое время
Рассрочка действует и на акционные цены

Выбирайте курсы и пойдём учиться!

⚡️ В КАТАЛОГ КУРСОВ ⚡️
Совет Spring Framework💡

Вы можете автосопрягать несколько бинов, реализующих определенный интерфейс, в список, содержащий все реализации. Определите список с общим типом, который вы хотите использовать. Вы можете использовать инъекцию конструктора, как показано на картинке, или инъекцию поля.

👉
🚀 Расширенные советы по Spring Boot🚀

Создание собственного FailureAnalyzer

Перехват исключений при запуске и преобразование их в человекочитаемые сообщения эффективно достигается с помощью FailureAnalyzer в Spring Boot 🔥.

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto.application.failure-analyzer

👉
🔥What’s the Hack? ЭКСПО! Этим летом с 1 по 10 августа прими участие в хакатоне от Экспобанк, реши задачу по созданию системы управления клиентскими базами для компаний-партнеров Экспобанка и получи возможность забрать вознаграждение из призового фонда в 400.000 рублей!

Регистрируйся на хакатон до 29 июля включительно: https://экспохак.рф

🌐Хакатон пройдет в формате Онлайн - 9 дней интенсивной работы над проектом, а 10-го августа участники защищают свои решения перед представителями из компаний-партнеров Экспобанка!

🚀Главная цель – создать единый механизм управления клиентскими базами, позволяющий оптимизировать взаимодействие с клиентами и предлагать различные услуги из разных компаний, входящих в число компаний-партнеров Экспобанка. .

👨‍💻К участию приглашаются разработчики, Product менеджеры, IT-специалисты и бизнес-архитекторы.

На протяжении всего хакатона Вас ждут регулярные сессии с экспертами, которые помогут скорректировать Ваши идеи в нужно русло!

📌Ключевые события хакатона:
29 июля – Завер...