Нужно быстро набросать сервис для бизнес-функции? AI поможет сэкономить часы на шаблонах, валидации и boilerplate.
📝 Промпт:
Generate a Spring Boot REST endpoint that handles [описание бизнес-логики]. Include request/response DTOs, validation, exception handling, and service-layer interaction. Use best practices and explain design decisions.
— Добавьте
Use Java 17+ features if possible
, чтобы сразу писать современно— Добавьте
Add unit tests for controller and service
, чтобы не откладывать на потом— Добавьте
Make it modular for future feature extension
, если планируется масштабированиеPlease open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🎯 Как добавить кастомные метрики в Spring Boot Actuator
В проде важно не просто «чтобы работало», а знать, как работает. Spring Boot Actuator позволяет получать системную информацию, но по-настоящему полезным он становится с кастомными метриками.
1️⃣ Добавьте зависимости
Также добавьте экспорт метрик в application.yml:
2️⃣ Создайте кастомную метрику
Например, метрика количества обращений к сервису:
Теперь можно вызывать countRequest() в любом месте.
3️⃣ Интегрируйте в проект
Каждый вызов /hello увеличивает счётчик.
4️⃣ Проверьте метрику
Откройте в браузере или через curl:
Найдите строку:
📌 Реальный профит: такие метрики позволяют строить Grafana-дэшборды, ставить алерты в Prometheus и быстро ловить аномалии.
💬 Используете кастомные метрики или довольствуетесь встроенными?
🐸 Библиотека джависта #буст
В проде важно не просто «чтобы работало», а знать, как работает. Spring Boot Actuator позволяет получать системную информацию, но по-настоящему полезным он становится с кастомными метриками.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
Также добавьте экспорт метрик в application.yml:
management:
endpoints:
web:
exposure:
include: health, info, metrics, prometheus
metrics:
export:
prometheus:
enabled: true
Например, метрика количества обращений к сервису:
@Component
public class CustomMetrics {
private final Counter requestCounter;
public CustomMetrics(MeterRegistry registry) {
this.requestCounter = Counter.builder("custom_requests_total")
.description("Total custom requests")
.register(registry);
}
public void countRequest() {
requestCounter.increment();
}
}
Теперь можно вызывать countRequest() в любом месте.
@RestController
@RequiredArgsConstructor
public class MetricsTestController {
private final CustomMetrics customMetrics;
@GetMapping("/hello")
public String hello() {
customMetrics.countRequest();
return "Hello!";
}
}
Каждый вызов /hello увеличивает счётчик.
Откройте в браузере или через curl:
http://localhost:8080/actuator/prometheus
Найдите строку:
custom_requests_total{...} 42.0
Please open Telegram to view this post
VIEW IN TELEGRAM
С выходом Java 21 в стабильный релиз sealed-типы наконец-то стали полноценным инструментом. Формально они позволяют явно ограничивать наследование, делают модель более предсказуемой и защищённой.
Казалось бы — бери и используй везде, особенно там, где важна неизменность и контроль, как в DDD, CQRS или API-слоях.
Но в реальности мнения расходятся. Одни начинают всё новое писать через sealed, чтобы убрать "лишнюю гибкость", другие придерживаются старого доброго interface + impl, ссылаясь на читаемость, тестируемость и простоту изменений.
Sealed — это реальный шаг вперёд в проработке модели, или ненужный контроль там, где раньше всё было гибко и понятно?
Please open Telegram to view this post
VIEW IN TELEGRAM
Знаете, как в Java обычно обновить одно поле в неизменяемом объекте? Нужно создавать копию с нужным значением. Муторно. Lombok умеет делать это элегантно.
🔹 Что делает @With
Генерирует методы withX(...), которые создают копию объекта с изменённым полем. Подходит для immutable-моделей и паттерна builder. Класс при этом должен быть final (например, через @Value или вручную).
🔹 Пример
@Value
@With
public class User {
String name;
int age;
}
Теперь можно:
User user1 = new User("Alice", 25);
User user2 = user1.withAge(30); // создаётся новый объект с новым age
Объекты остаются неизменяемыми, но при этом легко "обновляемыми".
🔹 Зачем это нужно
— Удобно при работе с immutable-классами.
— Простой способ "копировать с изменением".
— Чистый, декларативный стиль без boilerplate.
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 HTTP/2: эволюция веб-протокола
Если вы работаете с REST API, микросервисами или веб-приложениями на Spring Boot, понимание HTTP/2 — не просто полезно, а необходимо.
В отличие от HTTP/1.1, где каждое TCP-соединение обрабатывает только один запрос одновременно, HTTP/2 позволяет осуществлять параллельную передачу нескольких запросов и ответов по одному соединению.
Это означает:
— Экономия ресурсов сервера и клиента.
— Одновременная передача нескольких потоков данных.
— Уменьшение объема передаваемой информации.
🔗 Подробнее в статье
🐸 Библиотека джависта #буст
Если вы работаете с REST API, микросервисами или веб-приложениями на Spring Boot, понимание HTTP/2 — не просто полезно, а необходимо.
В отличие от HTTP/1.1, где каждое TCP-соединение обрабатывает только один запрос одновременно, HTTP/2 позволяет осуществлять параллельную передачу нескольких запросов и ответов по одному соединению.
Это означает:
— Экономия ресурсов сервера и клиента.
— Одновременная передача нескольких потоков данных.
— Уменьшение объема передаваемой информации.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔹 Как избавиться от Flaky-тестов с помощью JMina
Рассматривается использование библиотеки JMina для стабилизации нестабильных тестов. Автор делится практиками выявления и устранения причин нестабильности, улучшая надежность тестового покрытия.
🔹 Как ZGC аллоцирует память в хипе
Анализируется поведение сборщика мусора ZGC при выделении памяти. Обсуждаются особенности работы ZGC, его преимущества и потенциальные подводные камни при использовании в различных сценариях.
🔹 Паттерны и методологии разработки
Подборка материалов, посвященных современным паттернам проектирования и методологиям разработки. Рассматриваются лучшие практики, помогающие создавать устойчивые и масштабируемые приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Библиотека задач по Java | тесты, код, задания
Какой признак характерен для архитектуры CQRS?
Anonymous Quiz
75%
Разделение команд (изменений) и запросов (чтения)
10%
Использование одного сервиса для чтения и записи
4%
Обязательное хранение в SQL
6%
Отказ от асинхронных коммуникаций
5%
Хранение бизнес-логики на клиенте
Разработчик бэкенда (BDUI-платформа) — 220 000 — 480 000 ₽ — гибрид (Москва)
Java-разработчик — от 100 000 до 200 000 ₽ — удалёнка
Java Developer — от 300 000 ₽ — удалёнка
Senior Java Developer — от 4 500 до 6 000 € — гибрид (Москва)
Please open Telegram to view this post
VIEW IN TELEGRAM
Проблема: При большом количестве одновременных запросов блокирующая модель ввода-вывода приводит к исчерпанию потоков и задержкам в обработке, что негативно сказывается на отклике приложения и пользовательском опыте.
Решение: в книге Mastering Spring Boot 3.0 автор предлагает использовать Spring WebFlux — реактивный стек Spring, основанный на неблокирующей модели ввода-вывода. Это позволяет обрабатывать тысячи одновременных запросов с минимальными затратами ресурсов, обеспечивая высокую отзывчивость и масштабируемость приложения.
Пример реализации реактивного REST-контроллера с использованием Spring WebFlux:
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping
public Flux<User> getAllUsers() {
return userService.getAllUsers();
}
@GetMapping("/{id}")
public Mono<ResponseEntity<User>> getUserById(@PathVariable String id) {
return userService.getUserById(id)
.map(ResponseEntity::ok)
.defaultIfEmpty(ResponseEntity.notFound().build());
}
@PostMapping
public Mono<User> createUser(@RequestBody User user) {
return userService.createUser(user);
}
}
В этом примере используются типы Flux и Mono из Project Reactor для представления потоков данных и одиночных значений соответственно. Это позволяет обрабатывать запросы и ответы асинхронно и неблокирующим образом.
Преимущества:
— Неблокирующая модель ввода-вывода позволяет эффективно использовать ресурсы при высоких нагрузках.
— Асинхронная обработка запросов обеспечивает быстрый отклик даже при большом количестве одновременных пользователей.
— Интеграция с другими реактивными библиотеками и потоками данных упрощает построение сложных бизнес-процессов.
Еще больше полезных книг — в нашем канале @progbook
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Есть бизнес-логика, которая требует многозадачности, но нужно сделать это грамотно и без лишних усилий? ИИ поможет сэкономить время на сложных аспектах работы с потоками и синхронизацией.
📝 Промпт:
Generate a Spring Boot service that processes [описание бизнес-логики] with multithreading support. Use Java concurrency features like ExecutorService, CompletableFuture, or @Async. Ensure thread safety, synchronization, and efficient thread pool management. Explain design decisions and trade-offs.
— Используйте
Java 17+ features
, чтобы сразу писать асинхронный и многозадачный код на современном уровне— Добавьте
Add thread pool management
, чтобы контролировать нагрузку и избежать перегрузок— Добавьте
Add exception handling for multithreading
, чтобы предотвратить ошибки в параллельных операцияхPlease open Telegram to view this post
VIEW IN TELEGRAM
🛠 20 нюансов PostgreSQL
PostgreSQL давно перестал быть просто популярной СУБД — сегодня это мощный, гибкий и инновационный инструмент, способный решать самые сложные задачи в масштабируемых приложениях.
Если вы серьезно занимаетесь бэкендом и хотите держать руку на пульсе самых важных особенностей и тонкостей PostgreSQL, то игнорировать эти нюансы нельзя:
— как правильно оптимизировать запросы и работу с индексами,
— тонкости работы с транзакциями и параллелизмом,
— новые возможности JSON и работы с данными,
— расширенные методы мониторинга и отладки,
— и многое другое, что реально сэкономит время и ресурсы вашего проекта.
🔗 Подробнее в статье
🐸 Библиотека джависта #буст
PostgreSQL давно перестал быть просто популярной СУБД — сегодня это мощный, гибкий и инновационный инструмент, способный решать самые сложные задачи в масштабируемых приложениях.
Если вы серьезно занимаетесь бэкендом и хотите держать руку на пульсе самых важных особенностей и тонкостей PostgreSQL, то игнорировать эти нюансы нельзя:
— как правильно оптимизировать запросы и работу с индексами,
— тонкости работы с транзакциями и параллелизмом,
— новые возможности JSON и работы с данными,
— расширенные методы мониторинга и отладки,
— и многое другое, что реально сэкономит время и ресурсы вашего проекта.
Please open Telegram to view this post
VIEW IN TELEGRAM