Java Digest #VI: Spring Boot III.II, AWS Lambdas на Java XXI, Amazon Q, RabbitMQ III.XIII

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

🙋 Алоха, друзі!

Скажіть, а чи любите ви весну так, як любимо її ми? Так? Ну тоді цей випуск для вас! Адже про Spring буде дуже багато новин.

Окрім цього, тут ви знайдете новини про останні події у світі Java за листопад, які наша редакція сумлінно підготувала для вас.

І не поспішайте дивуватись римським цифрам, наприкінці дайджесту все стане трохи ясніше (або ні) 😉📜🔍

Попередні дайджести можна прочитати тут.

Але пам’ятайте, що випуск цього дайджесту є можливим винятково завдяки ЗСУ, і читати ви його зараз можете теж завдяки їм.

Тому швидесенько перед прочитанням пішли міняти долари та кидати гривні на допомогу нашим Захисникам.

Хоча основним мотивом цього дайджесту і є довгоочікуваний випуск нових версій Spring і Spring Boot, у світі Java теж було багато всякого.

Після завершення ревʼю, JEP CDLX: Vector API (VII інкубатор), був переведений зі статусу Proposed to Target до Trageted" для JDK XXII. Цей JEP, під егідою проєкту Панама, містить удосконалення у відповідь на відгуки з попередніх шести (!) етапів інкубації.

JEP CDLIX: String Templates(II Preview) теж був промоутнутий до статусу Proposed to Targeted для JDK XXII.

String Templates — популярна тема в OpenJDK mailing list. Тож вважаємо за доцільне присвятити кілька речень треду, що стосується питання про синтаксис шаблонів рядків у Java, зокрема, чому для вбудованих виразів потрібні як префікс шаблону (наприклад, <processor>.), так і зворотна коса риска (\).

Брайан Гоетц пояснює, що це рішення було обумовлене кількома факторами, зокрема потребою в уніфікації та полегшенні міграції для наявного коду Java. Програми Java часто містять рядкові літерали зі знаками долара, які могли б конфліктувати з виразами шаблонів, якщо їх не обробити обережно. Механізм екранування зворотною косою рискою вже встановлено в Java, що робить його логічним вибором для розширення шаблонів виразів. Такий підхід забезпечує безперебійне використання наявних рядків з новими функціями, знижує лінгвістичну складність та ризик помилок. Використання зворотних косих рисок, а не винахід нового механізму, відповідає чинній практиці та мінімізує криву навчання для розробників Java.

Gavin Bierman опублікував на широкий загал Java спільноти драфт специфікації для JEP CDLXIII — Implicit Classes and Instance Main Methods (II Preview) і тепер ця фіча очікує свого ревʼю.

В LVIII випуску Inside Java Nicolai Parlog розповідає про Java on GPU:

José Paumard у XXI випуску JEP Cafe розказує, як можна оптимізувати ваші equals завдяки pattern matching.

Billy Korando у своєму Sip of Java показує переваги Pattern matching для Switch.

А також, і це не навчальна тривога, підтримка емоджі в Java XXI була суттєво покращена❗

Цей день настав! Ми купили дочекалися повноцінного релізу Spring Framework VI.I та Spring Boot III.II. З цього приводу ми хочемо поділитися найцікавішими змінами, що ввійшли в релізні версії, а їх справді чимало! Тож готуймо пиво, каву та смаколики й поринемо в останні новини та зміни.

Нещодавно вийшла Java XXI, яка принесла численні нововведення. Однак, на нашу думку, найбільш захопливим є впровадження віртуальних потоків. Команда Spring уже досить довго розглядала можливість використання віртуальних потоків. Основна мета полягала в тому, аби реалізувати віртуальні потоки без повного переписування API, щоб спростити перехід для всіх зацікавлених розробників. І що ми можемо сказати? Їм це вдалося.

Щоб використовувати віртуальні потоки у своїх проєктах, вам потрібно зробити дві речі:

  • Ваш проєкт повинен використовувати Java XXI.
  • Вам потрібно додати глобальне налаштування spring.threads.virtual.enabled і встановити для нього значення true.

Коли ввімкнено віртуальні потоки, Tomcat і Jetty використовуватимуть їх для обробки запитів. Це означає, що код вашої програми, який обробляє вебзапити, наприклад, метод у контролері, буде виконуватися у віртуальному потоці. Крім того, віртуальні потоки також вплинули на інші компоненти Spring. Ось деякі з них:

  • Використання віртуальних потоків автоматично застосовується до TaskExecutor і TaskScheduler, впливаючи і на Spring MVC, і на Spring WebFlux.
  • Віртуальні потоки автоматично використовуються для RabbitMQ listeners.
  • Kafka Listeners також використовують віртуальні потоки.
  • ClusterCommandExecutor із Spring Data Redis за замовчуванням використовуватиме віртуальні потоки.
  • Spring для Apache Pulsar використовує віртуальні потоки для ConcurrentPulsarListenerContainerFactory та DefaultPulsarReaderContainerFactory.

Важливо відзначити, що віртуальні потоки не є універсальним рішенням для всіх проєктів. Тому редакція рекомендує перед використанням провести емпіричні дослідження. Чекаємо на ваші враження та думки щодо використання віртуальних потоків у ваших Spring Boot проєктах.

Інше важливе нововведення — початкова підтримка JVM Checkpoint Restore (Project CRaC).

Розгляньмо це нововведення більш детально. Що ж таке Project CRaC? Як ви можете знати, програми на Java потребують деякого часу для ініціалізації, перш ніж вони зможуть обробляти запити. Ця проблема відома як холодний старт, і з появою безсерверних технологій (таких як AWS Lambda) її вирішення вийшло на перший план.

Останніми роками з’явилися різні ініціативи, які працюють над цією проблемою. Сюди можна віднести: нативні образи GraalVM, AppCDS та Project CRaC. Всі вони по-різному розвʼязують цю проблему, але наразі нас цікавить тільки Project CRaC.

Абревіатура CRaC розшифровується як Coordinated Restore at Checkpoint. Це проєкт OpenJDK, розроблений Azule Systems для прискорення часу запуску JVM шляхом захоплення / заморожування її робочого стану, де виконується вся важка робота (завантаження класів, JIT-компіляція, оптимізація коду тощо) і серіалізація її стану на диск (Checkpoint), щоб пізніше відновити його з цього стану (Restore). Водночас програма має такий же стан, як і на момент створення контрольної точки.

Щоб скористатися цим нововведенням, необхідні:

  • JVM з увімкненою контрольною точкою / відновленням (наразі лише для Linux). Наразі це Azul та Liberica.
  • Наявність бібліотеки org.crac:crac (підтримуються версії I.IV і вище) у шляху до класів.
  • Зазначення необхідних параметрів командного рядка Java, як-от -XX:CRaCCheckpointTo=PATH або -XX:CRaCRestoreFrom=PATH.

На малюнку нижче ви можете побачити час до першої операції без та з використанням CRaC. Результати взяті з цього репозиторію.

Якщо вас зацікавила ця функціональність, ось репозиторій з демонстраційним проєктом.

Слід зазначити, що файли, створені CRaC, містять представлення активної JVM у пам’яті, яке може містити секрети та інші конфіденційні дані. Рекомендується використовувати цю функцію з урахуванням того, що будь-яке значення, яке «бачить» JVM, наприклад, конфігурації, що надходять із середовища, буде збережено в цих файлах. З цього приводу важливо детально оцінити наслідки для безпеки того, як і де генеруються та зберігаються ці файли.

Якщо говорити про інновації, то не можна обійти увагою нові RestClient та JdbcClient. Якщо ви мали досвід роботи з Spring WebFlux, ви знайдете багато подібностей у нових клієнтах із WebClient і DatabaseClient.

RestClient може бути хорошою заміною для RestTemplate, оскільки він має зручний DSL. Більш детально про новий клієнт можна прочитати в документації.

Своєю чергою, JdbcClient є сучасною альтернативою JdbcTemplate зі зручним інтерфейсом, подібним до DatabaseClient R2DBC.

Також додано можливість перезавантажувати SSL бандли на льоту. Наразі підтримуються Tomcat і Netty. Увімкнути автоматичне перезавантаження досить просто. Необхідно додати додаткову конфігурацію spring.ssl.bundle.pem.mybundle.reload-on-update та встановити значення true.

Під капотом спостерігач файлів аналізує файли та перезавантажує їх, якщо вони змінилися. За допомогою конфігурації spring.ssl.bundle.watch.file.quiet-period можна налаштувати період спокою для спостерігача за файлами. Більш детально тут.

Була додана підтримка Apache Pulsar. Новий стартер додає автоматичні налаштування для ключових компонентів, таких як PulsarClient, PulsarTemplate та @PulsarListener, які використовуються як відправниками, так і отримувачами повідомлень. Він також додає підтримку різних методів автентифікації та TLS. Детально можна почитати тут.

Також є багато змін повʼязаних з Micrometer, деталі можна знайти в реліз ноутах.

Це далеко не всі нововведення, які були додані, тож з іншими ви можете ознайомитися тут і тут.

А якщо ви віддаєте перевагу відео, Josh Long зробив чудовий огляд усіх основних змін:

Але це ще не все, що сталося за листопад. Було також випущено ряд обслуговуючих релізів, а саме:

Spring Session III.II отримав GA. Додано SessionIdGenerator, щоб дозволити генерацію власного ідентифікатора сеансу, і додано безпечну десеріалізацію сеансів Redis.

Spring Security VI.II також отримав GA. Із цікавого: в новій версії cors() вмикається автоматично, якщо присутній компонент CorsConfigurationSource.

GA версія вийшла і для Spring Data MMXXIII.I. У цій версії була додана підтримка віртуальних потоків та CRaC. Також були випущені обслуговуючі релізи Spring Data MMXXIII.N.VI, MMXXII.N.XII та MMXXI.II.XVIII. Починаючи з цього випуску, гілки MMXXI.II.x і MMXXII.N.x більше не підтримуються.

Spring Modulith отримав дві версії I.I GA та I.N.III. Найцікавіші зміни в I.I:

  • Підтримка екстерналізації подій для AMQP, Kafka, JMS, AWS SNS і SQS.
  • Підтримка актуаторів у нативних образах.
  • Neo4j реалізація репозиторію публікацій подій.
  • API для обробки завершених і незавершених публікацій подій.
  • Нова документація на основі Antora.

Spring Vault III.I додав підтримку Spring Framework VI.I, нову документацію на базі Antora, JWT автентифікацію та інші покращення.

Реліз Spring Tools IV.XX.I привносить декілька покращень повʼязаних з Spring Boot, Eclipse, VS Code та Theia. Ознайомитися з деталями можна тут.

Spring Shell випустив одразу чотири версії. Більше інформації по II.I.XIV, III.N.IX, III.I.V та III.II.N-MIII можна знайти тут.

Spring Authorization Server I.II випустив GA версію.

Spring for GraphQL I.II.IV вже доступний до використання. Ця версія містить кілька виправлень помилок, деякі незначні покращення та оновлення документації.

Spring for Apache Kafka та Spring for RabbitMQ отримали версії III.I.

Spring Cloud MMXXIII.N.N-RCI (aka Leyton) використовує Spring Boot III.II.N-RCI як основу. Усі важливі зміни можуть бути знайдені в Spring Cloud Stream проєкті.

Spring Batch отримав три версії V.I GA, V.N.IV and IV.III.X. У V.I були оновлені залежності, додано підтримку віртуальних потоків, покращення керування пам’яттю в JpaItemWriter, нову документацію на основі Antora та багато іншого.

Spring Integration VI.II також отримав GA версію. У ній ми отримали ряд покращень, зокрема, документація була переміщена на Antora, додана підтримка віртуальних потоків, а також була додана підтримка CRaC.

  • AWS Lambda тепер підтримує Java XXI!
  • А ще в AWS Lambda з’являється III нових конфігурації для зручнішого логування: можна поставити формат логів в JSON, змінити log level, а також налаштувати яку CloudWatch лог-групу будуть використовувати функції. Ці нововведення мають спростити перегляд і пошук логів в CloudWatch, але є деякі вимоги і обмеження щодо логерів і runtime, які можна використовувати в функціях. Детальніше за посиланням.
  • З’явилася нова версія III.N.III для spring-cloud-aws з різними покращеннями та виправленнями для SQS, SIII, SNS та інших AWS сервісів. Деталі за посиланням.
  • AWS зробив доступною zero-etl міграцію з AWS Aurora Mysql в AWS Redshift. Замість того, щоб самим писати etl-міграції, тепер можна довірити це AWS, який обіцяє за лічені секунди переносити нові дані в Redshift, та ще й безоплатно. Прочитати про це більше і подивитися практичний приклад можна у цьому блог-пості.
  • Інтеграція Amazon DynamoDB zero-ETL з Amazon OpenSearch Service, яка тепер загальнодоступна, дозволяє автоматично реплікувати та трансформувати дані DynamoDB для пошуку без потреби у власному коді чи інфраструктурі. Ця інтеграція значно знижує оперативні зусилля та витрати, пов’язані з підтримкою архітектури даних та синхронізацією даних, а також оновленням коду при частих змінах у застосунках.
  • Amazon представила Amazon Q Code Transformation, новий інструмент, що використовує генеративний ШІ для спрощення процесу модернізації та оновлення коду Java-застоснуків (поки так, далі в планах технорлогія-яку-не-можна-називати). Цей інноваційний асистент, Amazon Q, спеціально розроблений для професійного використання та пропонує варіанти налаштування для відповідності різним бізнес-потребам.
  • Amazon оголосила про preview Amazon Aurora Limitless Database, передового рішення для баз даних, здатного автоматизувати горизонтальне масштабування для обробки мільйонів транзакцій запису за секунду та управління петабайтами даних у одній базі даних Aurora.
  • Нова версія Akka XXII.X містить Akka Edge — набір інструментів для розробки систем, що охоплюють хмарні середовища разом з Edge локаціями. Найбільш важливою частиною Akka Edge є Projections over gRPC — механізм асинхронної комунікації між сервісами. Дізнатися більше можна на Akka Edge блогах.
  • Microsoft for Java Developers випустили коротке відео про розгортання native image на Azure Spring Apps і про те, скільки ресурсів і часу витраченого на ініціалізацію, можна так зберегти.
  • Bing Search від Microsoft буде використовувати ресурси Oracle Cloud Infrastructure (OCI) для Bing Conversational Search. ШІ моделі для Bing потребують більше ресурсів, ніж, здається, є в Microsoft, тож Oracle i Microsoft вкотре поглиблюють співпрацю. Окрім самої наявності GPU ресурсів, які необхідні для Bing, ще однією з переваг Oracle є RDMA — Remote Direct Memory Access для надшвидкої мережевої комунікації. Цей спільний крок для Oracle i Microsoft слідує за декількома попередніми подібними новинами, наприклад, Oracle Interconnect і Oracle Database@Azure.
  • Починаючи з AWS SDK версії II.XXI.XIX, AWS query protocol буде замінений на AWS JSON protocol. Старий протокол використовував XML для серіалізації HTTP викликів. Ця заміна має знизити навантаження на SQS клієнтах і зменшити час на мережеву комунікацію з серверами SQS.
  • AWS виклали технічні деталі про вдосконалене масштабування AWS Lambda функцій, які читають дані з AWS MSK. Ці вдосконалення мали б бути найбільш помітні на різко зростаючих об’ємах даних.
  • У блогах Microsoft з’явилася стаття з переліком покращень для Azure Spring Apps зроблених в III кварталі MMXXIII, а ще є стаття про інтеграцію Spring Cloud Gateway з Microsoft Entra ID (в минулому Azure Active Directory) через Oauth II.N.
  • Azure повідомляє про плани на розширення підтримки TLS I.III в Web Apps, Functions і Logic Apps на кінець MMXXIII — початок MMXXIV років, а ще про early access на новий вид хостингу для Azure Functions під назвою Flex Consumption.
  • DynamoDB може виконувати ACID транзакції з операціями на одній і більше табличках в одному регіоні. Як це виходить в AWS, не погіршуючи швидкодію не транзакційних операцій? Один з Senior Principal Engineer в AWS вирішив відповісти на це запитання у статті.
  • Хоч це вже і не зовсім новина, але все ж, ось порівняння між AWS, Azure, GCP, IBM i Oracle у ціні за вихідний трафік (тобто з хмари в інтернет) у MMXXIII році. Якщо вам цікаві такі порівняння і дослідження, то ви можете побачити ще багато цікавих матеріалів і проєктів компанії Cloud-mercato, наприклад, порівняння більше XX хмарних сховищ даних активних в Європі.

  • RabbitMQ III.XIII очікується вже до кінця цього року (команда VMware взагалі говорила про листопад), а що в ньому буде цікавого можна глянути в цьому відео (спойлер: підтримка MQTT5, classic ques, Khepri як нова внутрішня DB та stream filtering):

  • JHipster випустив у світ версію IIX свого продукту.
  • Micronaut випустив версію IV.II свого фреймворку.
  • Цікава і корисна стаття від Hibernate-експерта Vlad Mihalcea про партиціонування таблиць.
  • Gunnar Morling невтомно продовжує поширювати CDC в маси. Цього разу вашій увазі його стаття про те, чи не порушує CDC інкапсуляцію?
  • Стаття Thomas Vitale обговорює Software Bill of Materials (SBOMs) для додатків Java, підкреслюючи їхню роль у визначенні компонентів програмного забезпечення для сприяння скануванню на вразливості, перевірці ліцензій та аналізу ризиків у безпеці ланцюга постачань.
  • Недавній реліз Apache Kafka III.VI приніс нам нові можливості у вигляді багаторівневого зберігання (a.k.a tiered storage). Якщо вам цікаво дізнатися більше про цю нову фічу — читайте матеріал Mickael Maison.
  • А якщо вам цікаво знати про реальні приклади застосування Java та LLM, то Вам сюди.

🔗Чи впорається ChatGPT із роллю інтервʼюера?

І ще трохи відео з нещодавнього Devoxx Belgium:

🔗 Quantum Computing in Java: an exceptionential opportunity By Johan Vos

🔗 Quantum computers Vs modern cryptography By Kristof Verslype

🔗 Building and Deploying Java Client Desktop Applications With JDK 21 and Beyond By Kevin Rushforth

🔗 Beyond Logs: Real Time Anomaly Detection without Migraines By Fawaz Ghali

🔗 SIMD Parallel Programming with the Vector API By José Paumard

🔗 Semantic Kernel: AI orchestration for intelligent apps By Bruno Borges, John Oliver

Як часто наші любі читачі думають про Римську імперію? Якщо ви думаєте, що редакція трохи цейво (так, ви абсолютно праві) та чому всі цифри в цьому випуску римські, то ось відео з таймкодом для вас:

І нам дуже прикро, що натрапили на цей діамант так пізно.

Ми йдемо на коротку (або не дуже) перерву! Очікуйте новий випуск вже в лютому MMXXIV.

Проте, любі наші читачі, ми хочемо ставати щоразу кращими для вас. Наприклад, нещодавно почали публікувати наші дайджести англійською в LinkedIn.

Тож за час перерви сподіваємось отримати від вас багато коментарів про те, які розділи дайджесту є вашими улюбленими, чого не вистачає та що вам було б цікаво побачити у нових випусках.

Над дайджестом працювала команда Avenga:

👍ПодобаєтьсяСподобалось10
До обраногоВ обраному3
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
GA версія вийшла і для Spring Data MMXXIII.I

Автор народився та виріс у Римській імперії?
Якщо навіть так, будьте ласкаві випустити окрему версію дайджесту для сучасників, хоч би для мешканців України.

Дуже дякуємо за коментар

JEP CDLXIII — Implicit Classes and Instance Main Methods (II Preview)

о ні, тільки на імпісіти в Java. В Scala це єдина фіча, яка дозволяє зробити код абсолютно нечитабельним.

Це стосується тільки классів де є ентріпойнт main()

Коли ввімкнено віртуальні потоки, Tomcat і Jetty використовуватимуть їх для обробки запитів.

От і все, звершилося!
Реактивщину можно викидать на смітник.

Підписатись на коментарі