home.social

#spring_boot — Public Fediverse posts

Live and recent posts from across the Fediverse tagged #spring_boot, aggregated by home.social.

fetched live
  1. Как я ускорил работу с топом-пользователей с 36 минут до 20 секунд, используя Redis Sorted Set

    Всем привет, меня зовут Михаил, я работаю Java/Kotlin разработчиком в ОТП Банке. Все мы знаем про Redis. Часто используем его для in-memory кэша. В основном это ключ и значение. Но что, если можно пойти дальше и, как в том фильме, раскрыть все возможности Redis на 100%? Сегодня я хочу поговорить о Sorted Set в Redis. Что это за зверь и как его использовать. Буду показывать на примере таблицы лидеров. Это можно использовать для разных задач, но я выбрал именно эту. Будем замерять время, ресурсы при нагрузках - все, как мы любим. Присаживайтесь, будет интересно! Узнать, что это за покемон

    habr.com/ru/articles/1071718/

    #java #redis #highload #высоконагруженные_системы #оптимизация #оптимизация_кода #оптимизация_запросов #highload_systems #spring #spring_boot

  2. Как мы заменили 30-минутный polling на IMAP IDLE и построили маленькую распределённую систему

    Когда-то наш почтовый загрузчик был обычным методом с @Scheduled . Раз в 30 минут он подключался к ящикам, искал новые вложения и запускал их обработку. Решение было простым, понятным и долгое время вполне рабочим. Через несколько итераций вокруг того же загрузчика уже существовали IMAP IDLE listener'ы, PostgreSQL leases, heartbeat экземпляров приложения, перебалансировка почтовых ящиков между pod'ами, UID checkpoints, постоянная идемпотентность и отдельная обработка FolderClosedException . В какой-то момент мы даже попробовали держать несколько IMAP-соединений к одному ящику, но затем сознательно удалили эту часть архитектуры. Это история не о том, как мы «заменили polling на push» одной настройкой. Она о том, как безобидный интеграционный адаптер постепенно превратился в маленькую распределённую систему. И о границе параллелизма, которую мы сначала провели не там. Получить письмо

    habr.com/ru/articles/1065768/

    #Java #Spring_Boot #IMAP_IDLE #distributed_systems #PostgreSQL_leases #idempotency #backpressure #virtual_threads #concurrency #atleastonce_delivery

  3. [Перевод] Отслеживание запуска приложения в Spring

    Почему Spring-приложение запускается медленно, и на каком именно этапе оно тупит? В новом переводе от команды Spring АйО разбираемся, как заглянуть внутрь процесса создания контекста и отследить инициализацию бинов.

    habr.com/ru/companies/spring_a

    #java #kotlin #spring #spring_boot #spring_framework

  4. Вам не нужны микросервисы

    Какое‑то время назад, проработав 3 года на позиции Java Middle+‑ разработчика на крупном монолитном легаси‑проекте (естественно, модульном), я столкнулся с тем, что не имел практики в создании приложений на микросервисной архитектуре. При этом я понимал, что работа с микросервисами — это работа с актуальным стеком технологий в мире Java. И если ты не работаешь с микросервисами, то ты вроде как не имеешь необходимой квалификации для большинства вакансий на рынке труда. По крайней мере, если судить по самим вакансиям. Поэтому я решил, что мне нужен какой‑то достаточно крупный проект, который бы дал мне основные практические навыки работы с микросервисами. Это должен был быть проект, выходящий за рамки пет‑проекта с животными или чего‑то подобного. При этом, отработав на Java более трех лет, я уже хотел сделать что‑то свое, разработать архитектуру с самого начала. Думаю, это нормальное желание для мидл‑программиста, который хочет развиваться в своей сфере.

    habr.com/ru/articles/1066918/

    #Spring_Modulith #модульный_монолит #микросервисы #архитектура_приложений #Java #Spring_Boot #гексагональная_архитектура #перевод_PDF

  5. Я продал одно место на концерт 20 раз. Разбираемся, как правильно защититься от race condition в Spring Boot

    Однажды я решил проверить на практике байку, которую слышал на десятке собеседований: “у нас на проде было такое-то место продано дважды, потому что…” . Оказалось, воспроизвести это не просто легко — это воспроизводится настолько надёжно и настолько наглядно, что грех было не довести дело до конца: взять систему бронирования мест, специально сломать её, замерить, насколько плохо, а потом последовательно починить тремя разными способами — и честно сравнить, что каждый из них стоит по производительности. Спойлер: один из результатов оказался прямо противоположным тому, что я ожидал увидеть.

    habr.com/ru/articles/1063642/

    #java #hibernate #spring_data_jpa #redis #optimistic_locking #pessimistic_locking #race_condition #spring_boot

  6. Spring Security: работа с JWT токенами

    Всем привет! Данная статья посвящена регистрации и аутентификации с помощью JWT что помогает нам избавиться от тяжёлых сессий и куки и быть более крутыми и современными разработчиками

    habr.com/ru/articles/1059086/

    #java #spring_boot #spring_security #security #безопасность_вебприложений #spring_data_jpa

  7. Свой AI-прокси на Java: как я пытался подключится к Gemini

    Для разработки одного из моих проектов: документа BDoc (Book Document альтернатива устаревшим закрытым бинарным форматами такими как IDML, INDD или Scribus SLA) потребовалась нейросеть, которая может держать контекст очень долго. На данный момент для это цели идеально подходит Gemini, так как контекстное окно у Gemini в 1 миллион токенов. Но есть одна загвоздка, компания Google заблокировала некоторые регионы. То есть запросы от этих регионов не будут доходить до google. Рассмотрев все за и против, было принято решение написать небольшую программу на java - ai-proxy. То есть прокси для нейросетей.

    habr.com/ru/articles/1058206/

    #java #spring_boot #spring_webflux #reverse_proxy #gemini_api #openai_api #anthropic_api #docker #webclient #обход_блокировок

  8. От стримов к вебсокетам: как я боролся с буферизацией и наконец победил

    Привет. Меня зовут Николай Пискунов, я руководитель направления Big Data и эксперт курса Cloud DevSecOps по безопасной разработке от Академии вАЙТИ

    habr.com/ru/companies/beeline_

    #spring_ai #spring_boot #java #websocket #stomp #serversent_events #sse #ollama #llm #typescript

  9. Сквозные идентификаторы в логировании

    У нас есть процессы на бекенде, растянутые во времени. Для разбора инцидентов, сбоев и прочего мы прокидываем сквозные идентификаторы в логи. Мы можем увидеть логи конкретного процесса просто отфильтровав их по нужному значению поля такого идентификатора в логах. Таким образом мы видим все запросы, сообщения в кафку, информационные сообщения, если они случились в рамках нужного нам процесса, даже если он (процесс) был растянут во времени на несколько недель. Это решение я упаковал open-source библиотеку, которой может воспользоваться каждый из вас после прочтения статьи.

    habr.com/ru/companies/otpbank/

    #logging #spring_boot

  10. Prepared Statement и Java: как не облажаться на собеседовании

    На PreparedStatement обычно заканчивается вводный курс по JDBC / PostgreSQL. Все довольно просто, пока не задумываешься: а работает ли оно как надо в моем крутом инновационном приложении? Дальше интереснее: как PostgreSQL выбирает custom или generic plan? кто именно кэширует statements? как с этим дружат ORM и внешние пулы? По закону подлости все выясняется на собеседовании, в контексте “начальных банальных вопросов по БД”. Разберемся в подробностях и закроем эту тему

    habr.com/ru/articles/1052404/

    #postgresql #jdbc #prepared_statements #pgbouncer #spring_boot #orm

  11. [Перевод] Spring Batch научился работать с MongoDB

    Spring Batch - проект в рамках экосистемы Spring Framework, который, как правило не получает должного внимания. Тем не менее, это хорошее решение для Enterprise Batch Processing. Долгое время Spring Batch требовал SQL-базу для хранения общего состояния, шагов перехода, статусов выполнения и время запусков. Даже если проект жил на MongoDB, рядом часто приходилось держать Postgres или MySQL только ради метаданных. В Spring Boot 4.1 стало проще: появился spring-boot-starter-batch-data-mongodb. Теперь Spring Batch научился работать с MongoDB. В статье Josh Long рассказывает про новинки в рамках Spring Batch, в том числе и новую интеграцию с MongoDB, а также работу с GraalVM

    habr.com/ru/companies/spring_a

    #java #kotlin #spring #spring_boot #spring_framework #mongodb

  12. Как создать AI‑агента на Java: связка Spring AI + MCP

    В статье разбираем: как за пятнадцать минут превратить обычный метод с @McpTool в инструмент для модели, где проходит граница ответственности (решение принимает LLM — действует ваш код) и почему до прода доезжают единицы.

    habr.com/ru/companies/otus/art

    #Java #Spring_AI #MCP #AIагенты #Spring_Boot #LLM #backendразработка #JVM #транзакции #продакшен

  13. Уязвимость пришла из зависимости, которую вы не добавляли: ловим дыры в Spring до прода в GitLab

    В статье разбираем на боевом примере (Spring Boot 4.1, Java 21, GitLab 19.1), как поймать уязвимую зависимость в merge request — до прода, не уронив пайплайн. Подключаем SBOM‑сканер нового поколения, включаем reachability, чтобы отсеять весь шум, и ставим security‑гейт, который реагирует, только на уязвимости, которые несет в себе конкретный MR.

    habr.com/ru/companies/otus/art

    #безопасность_зависимостей #транзитивные_зависимости #GitLab_CI #Dependency_Scanning #Spring_Boot #Maven #SBOM #уязвимости_CVE #supply_chain_security

  14. Два месяца спустя. Что я понял, пока пытался сделать E2EE-мессенджер

    Два месяца назад я опубликовал статью про свой pet-проект — E2EE-мессенджер. Честно говоря, я не ожидал, что она вызовет такой интерес. Прилетели комментарии, замечания, вопросы и довольно полезная критика. Где-то меня поправили по делу. Где-то заставили пересмотреть решения, которые мне самому на тот момент казались нормальными. И, что самое приятное, часть вещей, которые тогда были только в roadmap, за это время удалось реализовать. Первая часть: habr.com/ru/articles/1030854/ Проект: github.com/vaazhen/chaos-e2ee- Вообще, за эти два месяца я понял одну простую вещь. Написать чат оказалось не так сложно. Написать E2EE-мессенджер — уже сложнее. А вот понять, почему Signal делали столько лет, оказалось совсем другой историей. Сначала кажется: ну есть же документация, есть X3DH, есть Double Ratchet, есть WebCrypto, есть статьи, есть спецификации. Осталось просто аккуратно всё собрать. Примерно в этот момент где-то вдалеке начинает смеяться инженер из Signal. Сразу оговорюсь: chaos messenger — это не замена Signal и не “готовый безопасный мессенджер”, а open-source pet-проект, на котором я разбираюсь, как E2EE-системы устроены изнутри.

    habr.com/ru/articles/1051406/

    #E2EE #endtoend_encryption #Double_Ratchet #X3DH #WebCrypto #Spring_Boot #React #Electron #PostgreSQL #Redis

  15. Skill of the week: Spring Data JDBC — качество Opus на модели за копейки

    Ранее в рубрике Skill of the Week мы уже разбирали Skill для Spring Data JPA . И, что предсказуемо, в комментариях нашлись те, кто увидел в нём лишнее доказательство простого тезиса: «вот видите, JPA не нужна, она слишком сложная». Аргумент понятный — у AI Agent-а с JPA действительно регулярно случаются «пожары»: ошибки в настройке связей между сущностями, странности с конфигурацией базовых типов, путаница с контекстом персистентности и разными состояниями сущности. Что характерно, ровно на этих же местах спотыкаются и живые разработчики — так что претензия скорее к технологии, чем к модели. Раз JPA такая сложная — почему бы не взять что-нибудь попроще? Чистый JDBC многим кажется слишком низкоуровневым, и взгляд естественным образом падает на Spring Data JDBC: те же репозитории и сущности, но без прокси, lazy loading и кэша первого уровня. Технология проще — значит, и никакой Skill тут не нужен, верно? А вот и нет. Умение AI «пользоваться» той или иной технологией зависит не столько от её когнитивной сложности, сколько от того, сколько кода с её использованием модель видела на этапе обучения. Spring Data JDBC объективно проще JPA, но кода с ней в открытом доступе на порядки меньше. Парадокс, но именно для технологий «с малым количеством кода» Skill даёт наибольший эффект: он закрывает ровно тот пробел, который модели нечем заполнить самостоятельно. В сегодняшнем эпизоде еженедельной рубрики Skill of the Week разберёмся, как, используя Spring Data JDBC Skill, научить своего агента важным навыкам при работе со Spring Data JDBC.

    habr.com/ru/companies/haulmont

    #spring_data_jdbc #spring #spring_boot #java #kotlin #jdbc #ddd #aiагенты #llm #claudecode

  16. Как сделать MCP-сервер из Spring-сервиса за один вечер. И что потом не даст спать спокойно

    AI‑агенту не нужен прямой доступ к базе, чтобы отвечать на вопросы оператора или вызывать действия в системе. Достаточно дать ему набор управляемых инструментов через MCP. В статье разбираем, как это выглядит в Spring Boot, где заканчивается простая демка и почему перед продакшеном придётся думать не о магии LLM, а о правах, логах, таймаутах и человеке в контуре. Разобрать MCP

    habr.com/ru/companies/otus/art

    #MCP #Spring_AI #Java #Spring_Boot #AIагенты #LLMинтеграции #микросервисы #безопасность_LLM #prompt_injection #архитектура_ИИприложений

  17. T2M Bridge, часть 2: как я написал Java‑библиотеку для Telegram Bot API вместе с Codex — уже примерно 50/50

    Это вторая статья из цикла о разработке T2M Bridge - бота для кросспостинга между Telegram-каналами и MAX-каналами.

    habr.com/ru/articles/1049572/

    #springboot #spring_boot #telegrambot #telegram

  18. Skill of the Week: Spring Data JPA. Никто не знает JPA, даже AI

    Знание и умение разрабатывать на Spring Data JPA — это обязательный навык для разработчика, если он хочет заниматься разработкой приложений на Spring. Этого мы ожидаем и от AI-агента. Удовлетворяют ли наши AI-агента этому условию? Во многом зависит от того, насколько продвинутую модель вы используете. Значит ли это, что Opus 4.8 не совершает ошибок? Совсем нет. Более того, иногда удивляешься, почему еще вчера он настроил связь правильно, а уже сегодня сделал ту же работу, но добавил CascadeType.ALL . В сегодняшнем эпизоде еженедельной рубрики Skill of the Week разберёмся, как, используя Spring Data JPA Skill , научить своего агента важным навыкам при работе со Spring Data JPA.

    habr.com/ru/companies/haulmont

    #aiагенты #jpa #spring_data_jpa #java #spring #spring_boot #hibernate #skills

  19. Spring Boot 4, Flyway и Postgres: как не стрелять по ногам

    Разберемся, как на самом деле устроена интеграция Flyway в Spring Boot 4: что изменилось с появлением отдельного starter’а, как Boot прокидывает настройки и почему в связке с PostgreSQL одна неочевидная опция может намертво зависнуть миграцию

    habr.com/ru/articles/1047382/

    #flyway #миграции #postgresql #spring_boot #транзакции

  20. Дело о молчаливой JVM: мониторинг Spring Boot с Prometheus и Grafana. Production-нуар

    Она умерла в воскресенье вечером, и никто не услышал ни звука. Детективная история о том, как поставить прослушку на собственное приложение: Prometheus, Grafana, Micrometer, алерты, SLO. Все улики в комплекте, демо-проект прилагается. Совпадения с вашим продакшеном не случайны. Открыть дело

    habr.com/ru/articles/1046239/

    #spring_boot #prometheus #grafana #micrometer #мониторинг #метрики #slo #alertmanager #jvm #promql

  21. Эволюция клиента для Ollama: от PostgreSQL к MongoDB

    Привет. Меня зовут Николай Пискунов, я руководитель направления Big Data и эксперт курса Cloud DevSecOps по безопасной разработке от Академии вАЙТИ

    habr.com/ru/companies/beeline_

    #java #spring_boot #postgresql #ollama #llm #artificial_intelligence #react #typescript #code_review #code_review_ai

  22. Black-box тесты на Java: функциональные тесты за секунды и в параллель и почему я остался на своих

    Я наткнулся на подход к функциональным тестам, который меня по-настоящему удивил. Тесты в нём вообще не знают, что внутри Spring: стучатся в реально поднятый сервис по HTTP, как обычный клиент, гоняются параллельно и проходят за секунды. Я разбирал это на код-ревью и сначала прифигел, а потом не стал переходить на него сам, но кое-что забрал себе. В статье сравниваю оба подхода, разбираюсь где какой уместен, и показываю три вещи, которые подсмотрел и притащил в свой Spring Сравнить подходы

    habr.com/ru/articles/1044626/

    #функциональные_тесты #интеграционные_тесты #blackbox_тесты #Spring_Boot #Testcontainers #JaCoCo #flakyтесты #покрытие_кода #Java #тестирование

  23. [Перевод] Проблема фантомной записи: почему ваша реализация идемпотентности незаметно теряет данные

    В проде бывает так, что одна и та же операция часто повторяется : клиент не дождался ответа и ретраит, балансер порвал соединение, очередь переиграла сообщение. Вспоминаем про идемпотентность - это правило «повтор не должен создавать новый платёж/заказ». Чтобы отличать повтор от новой операции, используют idempotency key (ключ идемпотентности) . Это обычная уникальная строка-идентификатор, которую клиент или апстрим отправляет вместе с запросом (часто в заголовке Idempotency-Key ). Сервис сохраняет этот ключ у себя и связывает с результатом операции. Далее приходит запрос с тем же ключом - сервис не выполняет бизнес-действие второй раз, а дедуплицирует на основе ключа идемпотентности. Но так ли всё просто? Многолетний опыт анализа инцидентов показал, что на практике большое количество систем всё же регулярно допускают дублирования, хотя делали всё по методичке. В новом переводе от команды Spring АйО рассмотрим не самые очевидные ошибки и то, о чём стоит подумать, при реализации идемпотентного API.

    habr.com/ru/companies/spring_a

    #java #kotlin #spring #spring_boot #spring_framework #springboot #spring_data

  24. HikariCP в проде: пять настроек, которые часто крутят неправильно

    В проде connection pool редко падает громко — чаще он тихо превращает сервис в очередь ожидания: запросы висят, база задыхается, Kubernetes начинает перезапускать поды, а в логах всплывает знакомое Connection is not available . В этой статье разбираем пять настроек HikariCP, которые чаще всего крутят «на глаз»: размер пула, minimumIdle, maxLifetime, keepaliveTime и connectionTimeout. Покажем, почему «поставить побольше» почти всегда плохая идея, как таймауты инфраструктуры ломают соединения и какие метрики стоит вывести в Grafana, чтобы увидеть проблему до инцидента.

    habr.com/ru/companies/otus/art

    #HikariCP #JDBC #Spring_Boot #connection_pool #Postgres #пул_соединений #таймауты #production #настройка_сервиса #мониторинг

  25. Axelix. Cпецназ для Вашей Spring Boot экосистемы

    Привет, Хабр! Меня зовут Михаил Поливаха. Я думаю, что в Хабе Spring АйО меня уже относительно знают. В рамках Spring АйО мы довольно часто занимаемся подбором технического материала и его ревью. Сам же я довольно регулярно выступаю на конференциях, контрибьючу в Open Source и т.д. Также, часто наши материалы крутятся вокруг Java разработки и конечно же Spring-а. И данной пост, хоть и будет с одной стороны сильно связан с Java и Spring Framework, но, тем не менее, не похож на остальные. На днях произошло довольно знаковое событие. Мы с небольшой командой примерно год писали инструмент, который призван существенно упростить весь процесс отладки, тестирования и мониторинга Spring Boot приложений в production. И вот этот проект наконец-то получил первый Milestone Релиз. Проект называется Axelix .

    habr.com/ru/companies/spring_a

    #spring #spring_boot #axelix #opensource #spring_framework

  26. Шёл за утечкой памяти, нашёл утечку диска: SXSSFWorkbook без dispose() в Apache POI

    Меня зовут Игорь Симаков, работаю engineering manager’ом и руковожу командами разработки На одном из наших сервисов, который работает с XLSX-файлами, прилетел production-алерт на высокое потребление памяти. Стандартный P3, обычно решается рестартом. Пошёл смотреть поды и нашёл проблему, к памяти отношения не имеющую, но представляющую больший риск, чем сам алерт. Об этом и расскажу ниже: чем «утечка диска» отличается от «утечки памяти», как мы наткнулись на грабли в Apache POI и как закрыли их на уровне архитектуры

    habr.com/ru/articles/1039862/

    #apache_poi #утечка_памяти #kubernetes #java #rss #archunit #spring_boot #производительность

  27. C# мне нравится больше Java. Но в банковском enterprise мне всё равно понадобилась Java

    C# я до сих пор считаю одним из самых удобных языков для backend разработки. В нём много вещей к которым быстро привыкаешь: свойства, LINQ, async/await, generics без type erasure, хороший tooling и понятная модель разработки. Но банковский enterprise редко выбирает стек только по удобству языка. На практике важны не только синтаксис и экосистема, но и инфраструктура, сопровождение, безопасность, регламенты, legacy, найм, CI/CD, требования к платформам и долгосрочная стратегия организации. Так я оказался в ситуации где C# мне субъективно нравится больше, но Java объективно стала полезнее в конкретном банковском контуре. Эта статья не про холивар C# vs Java. Это попытка спокойно разобрать почему backend разработчику в enterprise иногда приходится расширять стек, даже если текущий язык его полностью устраивает. Почему в банке выбирают стек не только по

    habr.com/ru/articles/1038626/

    #C# #Java #backend #enterprise #банки #Spring_Boot #NET #микросервисы #импортозамещение #карьера

  28. Как настроить observability в Spring Boot 3

    Микросервис работает, но иногда тормозит — и вы не знаете, где копать. Логи чистые, метрики в норме, а пользователи жалуются. Знакомо? В статье разбираем, как настроить полноценную observability в Spring Boot 3 за 7 шагов: метрики (Prometheus), трейсинг (Zipkin), логи (Loki) и единый дашборд в Grafana. Без магии, с кодом и проверками.

    habr.com/ru/companies/otus/art

    #java #Spring_Boot_3 #observability #микросервисы #метрики #трейсинг #Grafana #prometheus #Spring_Boot #Zipkin

  29. [Перевод] Соль и перец в безопасности паролей

    Безопасность данных сегодня стала главным приоритетом для любого веб-ресурса. Базовым стандартом защиты учетных записей является хеширование паролей. Этот процесс превращает конфиденциальные символы в необратимый код. Без него утечка базы данных мгновенно скомпрометирует пользователей. Однако обычного хеширования недостаточно из-за угрозы быстрых хакерских атак. Для защиты разработчики применяют «соль» (salt) — случайные данные, добавляемые к паролю. Минус соли в том, что она хранится рядом с хешем и не спасает от мощного перебора. Тогда на помощь приходит «перец» (pepper), скрытый в коде сервера. Его главная проблема — высокий риск потерять доступ ко всем аккаунтам при компрометации самого секретного ключа. Эта статья поможет вам разобраться в эволюции методов криптографической защиты. Вы узнаете, как правильно комбинировать эти инструменты для надежной аутентификации.

    habr.com/ru/companies/spring_a

    #java #kotlin #hash #cryptography #spring #spring_boot #spring_framework #spring_security #security #password

  30. Сможете ли вы спроектировать Maven‑монорепозиторий для 5 микросервисов?

    В этой статье мы разберём реальную задачу на проектирование Maven Multi‑Module: от циклических зависимостей и неправильного использования spring‑boot‑maven‑plugin до смешения ролей агрегатора и родителя. Затем соберём эталонную структуру по лучшим практикам Spring Cloud и Netflix, добавим CI/CD‑диаграмму и научимся запускать сервис локально без Eureka и RabbitMQ. Найти ошибки

    habr.com/ru/companies/otus/art

    #Maven #монорепозиторий #микросервисы #Spring_Boot #multimodule #dependencyManagement #Maven_Wrapper #архитектура_сборки #Java