[Перевод] Выход Micronaut 4! Что нового?

8016d55884aa1baf15bd9780a86b6bb7.png

14 июля вышла новая версия Java фреймворка Micronaut. С последнего мажорного обновления прошло почти два года (оно было 18.08.2021), и за это время произошло немало событий как в мире Java-разработки, так и в самом фреймворке. Постараюсь рассказать, что же нового появилось в Micronaut.

Версия языка по умолчанию

Micronaut framework 4 теперь по умолчанию будет использовать Apache Groovy 4, Kotlin 1.8 и Java 17.

Kotlin

При использовании Kotlin, теперь можно собирать приложение Micronaut с помощью KSP (Kotlin Symbol Processing). Поскольку KSP на данный момент поддерживается только Gradle, Kapt всё ещё доступен для Gradle и Maven.

Также Micronaut Kotlin теперь использует Ktor 2.

GraalVM

Micronaut framework 4 поддерживает последий релиз GraalVM и перешел на runtime-инициализацию GraalVM, чтобы обеспечить согласованность в поведении между JIT и нативными приложениями.

Дополнительно, необходимая метадата для GraalVM теперь находится в GraalVM Reachability Metadata Repository, и оба плагина Micronaut для Gradle и Maven используют её по умолчанию.

Micronaut Foundation заявляет, что продолжит работать над интеграцией с GraalVM для достижения наилучшего опыта его использования. Например, добавлены нативные JUnit5 тесты во всю инфраструктура Micronaut.

Gradle 8

Для сборки приложения Micronaut framework 4 теперь использует Gradle не ниже 8-й версии.

Язык выражений (Expression Language)

Micronaut framework 4 представляет язык выражений, который позволяет использовать выражения в аннотациях. Язык выражений Micronaut спроектирован так, что он безопасен по умолчанию. Невозможно скомпилировать выражение в рантайме из ненадёжного пользовательского ввода. Все выражения проверяются во время компиляции, проводится проверка типов. Также они не используют рефлексию, так что они доступны к использованию с GraalVM.

Например, теперь можно использовать выражения с Micronaut Security в аннотации @Secured.

@Secured("#{ user?.attributes?.get('email') = 'sherlock@micronaut.example' }")

Виртуальные потоки (Loom)

Micronaut framework 4 может определять поддержку виртуальных потоков (которые доступны с Java 19 в качестве preview feature), и использовать их для executor’ов с именем BLOCKING. Если версия Java не поддерживает виртуальные потоки, фреймворк будет присваивать алиас IO.

Вы можете заранее заменить @ExecutesOn(IO) на @Executes(BLOCKING).

Улучшения HTTP

Переписан HTTP слой

HTTP слой был переписан, чтобы улучшить производительность и уменьшить применение реактивного стека, если он в целом не используется (например, с виртуальными потоками).

Экспериментальная поддержка HTTP/3 и io_uring

Micronaut framework 4 добавил экспериментальную поддержку HTTP/3 и экспериментальную поддержку для io_uring через инкубатор проектов Netty.

Фильтры, основанные на аннотациях

Добавлены фильтры, основанные на аннотациях. Обычно нужно было писать серверные и клиентские фильтры. Теперь же можно создать фильтр, не написав ни одной строчки реактивного кода. При использовании с Виртуальными Потоками (Virtual Threads) фреймворк оптимизирует производительность, убирая неважные участки кода с реактивным стеком.

@ServerFilter("/hello/**")

Java HTTP Client

Предложена новая имплементация Micronaut HTTP Client. Можно продолжать использовать клиент, основанный на Netty, или же использовать более лёгкую версию клиента, основанную на Java HTTP Client.

Генерация Клиента/Сервера из OpenAPI

Gradle и Maven плагины поддерживают генерацию кода для HTTP клиента или сервера из переданного файла спецификаций OpenAPI.

YAML Configuration

Убрана транзитивная зависимость SnakeYAML.

JSON Serialisation

Убрана транзитивная зависимость Micronaut Jackson Databind. Теперь это ответственность разработчика выбрать, что использовать — Micronaut Serialization или Micronaut Jackson databind.

Jakarta Transition

Окончен переход на Jakarta. Список изменений:

  • javax.validation = jakarta.validation

  • javax.mail = jakarta.validation

  • javax.transaction.Transactional = jakarta.transaction.Transactional

  • javax.persistence = jakarta.persistence

Валидации и аннотации в типизированных аргументах

Micronaut Validation был перемещён в новый репозиторий, и теперь включает в себя поддержку Bean Validation 3.

Была расширена метадата аннотаций времени компиляции (compilation time annotation metadata), что позволило добавить поддержку аннотаций на обобщённые (generic) типы. Например:

List<@NotBlank String> names

Дополнительное дробление на модули

Встроенные ранее модули Validation, Retry, Service Discovery, HTTP Session и WebSocket теперь представлены обособленно, что позволяет отказаться от неиспользуемых модулей.

Также, был переписан компилятор, что позволило вычленить типы только для компиляции в отдельный модуль (core-processor), который больше не находится в classpath пользователя или рантайм. Это позволило избавиться от некоторых переупакованных версий ASM и Caffeine.

Облачные environment больше не определяются по умолчанию

Чтобы избежать потери в производительности при определении облачных environment каждый раз, когда запускается приложение или его тесты, данная функциональность теперь по умолчанию будет отключена. Если приложение зависит от этих переменных, следует обратиться к документации по Cloud Configuration. Либо же установить явно переменные Micronaut для продакшен-окружения.

Mapped injection

Теперь можно инжектить java.util.Map бинов, где ключ — это имя бина. Имя бина определяется по qualifier или, если такового нет, используется имя класса.

Произвольная вложенность свойств конфигурации

Теперь можно произвольно вкладывать и комбинировать @ConfigurationProperties и @EachProperty аннотации, что позволяет добиться большей гибкости при настройке.

Улучшение сообщений с ошибками

Для отсутствующей конфигурации

Если бин не создался по причине отсутствующей конфигурации, будет выведено сообщение, какой именно конфигурации не хватает (например, если бин использует @EachProperty).

Для отсутствующих бинов

Когда бин, аннотированный @EachProperty или @Bean, не найден из-за отсутствующей конфигурации, выбрасывается ошибка, в которой указывается префикс конфигурации, необходимый для устранения проблемы.

Отслеживание отключенных бинов

Теперь бины, которые были отключены через Bean Requirements, отслеживаются, и возникает соответствующая ошибка, если бин был отключен.

Отключенные бины видны через Beans Endpoint, что помогает понять состояние конфигурации приложения. Это даёт возможность лучше понять, какие бины активны и доступны в приложении, а какие были отключены и не используются.

Micronaut Data

Добавлена поддержка для Hibernate 6, Hibernate Reactive 2, и Oracle JSON-Relational Duality Views.

Каждая среда совместима с HTTP Server TCK

Micronaut framework поддерживает множество различных среды исполнения:

  • Netty

  • Servlet (Jetty, Undertow и Tomcat)

  • Serverless (AWS Lambda, Google Cloud Http Functions и Azure HTTP functions)

В MIcronaut framework 4 каждая среда теперь совместима с тестами на соответствие HTTP серверу (HTTP server Test Compability Kit).

Micronaut MQTT

Добавлена имплементация, основанная на HiveMQ MQTT Client

Object Storage

В Object Storage добавлено Local Storage для упрощения локальной разработки и тестирования.

GraphQL

Модуль GraphQL теперь поддерживает современный graphql-ws протокол для подписки через Web-сокеты

Micronaut Discovery Client

Добавлена поддержка client basic authentication для Spring Cloud.

Micronaut Control Panel

Добавлен новый модуль — Micronaut Control Panel, который предоставляет графический веб интерфейс для контроля и управления состояниями Micronaut приложений. Удобно использовать в при разработке.

Micronaut AWS Lambda

Сделана масштабная переделка интеграции с AWS Lambda.

В этом релизе Micronaut AWS предлагает встроенные обработчики Lambda для Amazon API Gateway payloads v1 и v2 и обработчик для Application Load Balancer. Интеграция с Lambda больше не зависит от библиотеки AWS Serverless Java container.

Более того, micronaut-function-aws предоставляет реализацию com.amazonaws.services.lambda.runtime.CustomPojoSerializer, которая загружается через SPI (Service Provider Interface). Это позволяет избежать дополнительных накладных расходов на функцию Micronaut при использовании библиотеки сериализации внутри функции Lambda.

Кроме того, новый модуль io.micronaut.aws:micronaut-aws-lambda-events-serde позволяет использовать Micronaut Serialization с событиями AWS Lambda Java. Это даёт возможность использовать мощные средства сериализации Micronaut для обработки событий в Lambda функциях, что улучшает производительность и обеспечивает более гибкий и удобный способ работы с данными в Lambda среде.

Обновление зависимостей

  • Micronaut ElasticSearch обновлён до ElasticSearch 8.8.

  • Micronaut Flyway обновлён до Flyway 9.

  • Micronaut Hibernate Validator обновлён до Hibernate Validator 8.

  • Micronaut Kafka обновлён до Kafka 3.

  • Micronaut Neo4J обновлён до Neo4j 5.

  • Micronaut RabbitMQ обновлён до AMQP Java Client 5.

  • Micronaut Micrometer обновлён до io.dropwizard.metrics: metrics-core версии 4.2.19 и micrometer версии 1.11.1.

  • Micronaut Liquibase обновлён до Liquibase 4.22.0.

  • Micronaut SQL обновлён до PostgreSQL версии 42.6.0, MariaDB Java Client версии 3.1.4, Hibernate версии 6.2.6.final, Hibernate Reactive версии 2.0.2.Final, Jasync версии 2.2.0 и Vertx версии 4.4.4.

  • Micronaut Azure обновлён до Azure SDK версии 1.2.4, Azure Cosmos DB версии 4.46.0 и Azure Functions Java Library версии 3.0.0.

  • Micronaut AWS обновлён до Alexa SDK версии 2.71.0, AWS SDK v1 версии 1.21.505, AWS SDK v2 версии 2.20.100, AWS Lambda Events версии 3.11.2, AWS Lambda Serialization версии 1.1.2 и AWS Lambda SDK версии 1.2.2.

  • Micronaut GCP обновлён до Google Cloud Core версии 2.18.1, Google Cloud PubSub версии 1.123.17, Google Secret Manager версии 2.18.0, Google Cloud Events Types версии 0.3.0, Google Auth Library OAuth2 HTTP версии 1.17.0, Google Functions Frameworks API версии 1.0.4 и Google Function Invoker версии 1.2.1.

Как видно, команда разработки Micronaut продолжает совершенствовать свой продукт. Обновления выходят регулярно, в прошлую пятницу уже появился минорный апдейт. Список компаний, которые используют данный фреймворк также растет, значит, в этом есть необходимость.

Кому интересно, вот здесь я писал про то, как устроена аутентификация в Micronaut.

© Habrahabr.ru