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.