Теперь доступна бета-версия Spring Native, предлагающая новый способ развертывания приложений Spring. Spring Native позволяет компилировать приложения Spring в собственные образы с помощью компилятора собственных образов GraalVM.
Какое в этом преимущество? Мгновенный запуск, мгновенная пиковая производительность и снижение потребления памяти, поскольку собственные приложения Spring развертываются как автономный исполняемый файл, а также образ докера, без установки JVM.
В чем недостаток? Дело в том, что процесс сборки GraalVM, который пытается создать максимально оптимальное изображение, выбрасывает много вещей. Это могут быть зависимости, ресурсы или части вашего кода.
Способ смягчить это-передать GraalVM кучу конфигурационных файлов, которые заставят его включить дополнительный материал в изображение.Чтобы автоматизировать этот процесс, вы аннотируете свой код подсказками, чтобы направить плагин Spring AOT на создание этих файлов конфигурации.
Однако пакет Spring Native включает в себя конфигурацию spring-native, которая в истинном духе Spring Boot обрабатывает ее за вас. Он содержит подсказки по настройке для классов Spring, поэтому он заботится о фреймворке без лишних слов. Некоторые драйверы уже были аннотированы, например, драйвер MySQL поддерживает Spring Native с подсказками, которые позволяют создавать правильные записи в файлах собственных образов, reflect-config.json, resource-config.json и native-image.properties
@NativeHint(
триггер = Driver.class,
options = «—включить-все-службы безопасности»,
типы = @TypeHint(типы = {
FailoverConnectionUrl.class,
FailoverDnsSrvConnectionUrl.class,
// …
}), ресурсы = {
@ResourceHint(patterns = «com/mysql/cj/TlsSettings.properties»),
@ResourceHint(patterns = «com.mysql.cj.LocalizedErrorMessages»,
isBundle = true)
})
открытый класс MySqlHints реализует NativeConfiguration {}
Плагин Spring AOT build доступен для bot Maven и Gradle и вызывается перед запуском приложения и тестов, и потенциально может потребовать дополнительной настройки IDE. Источники сгенерированных файлов доступны и могут быть проверены, если в этом есть необходимость.
Эта необходимость возникает в следующих ситуациях, когда требуется конкретизация дополнительной собственной конфигурации:
Когда сериализация на основе отражения используется в программном API, таком как WebClient с Джексоном
При попытке использовать функцию или библиотеку, которые еще не поддерживаются Spring Native
Когда вы хотите указать собственную конфигурацию, связанную с вашим собственным приложением.
В этих обстоятельствах вы можете аннотировать классы, уже аннотированные с помощью @Configuration или @SpringBootApplication с помощью @NativeHint, или в достаточно простых случаях напрямую использовать @TypeHint (@NativeHint-это контейнер для многих видов конфигурации, включая @typehint).
Это означает, что в большинстве случаев ваше приложение Spring boot, включая JPA и Spring Security, будет компилироваться в native просто отлично, за исключением случаев, когда у вас есть какие-то причудливые зависимости, которые вам нужно будет включить самостоятельно, подсказывая или настраивая сгенерированные файлы конфигурации.
Помимо JPA и Spring Security , Spring Native также работает с Spring Cloud, так что вы можете скомпилировать функцию Spring Cloud в образ, а затем развернуть ее как в Google Cloud Run или как AWS Lambda!
Хотя в бета-версии Spring Native все еще является экспериментальным, что означает, что вы должны использовать его экономно, а не в производственном коде. Все еще загружаю новое приложение на start.spring.io включает в себя опцию сборки для нативного уже. И на дорожной карте есть много того, чего можно с нетерпением ждать.