Проект Spring Native обеспечивает поддержку упаковки приложений Spring в виде собственных образов с использованием Graal VM.
По сравнению с исполняемыми файлами JVM собственные образы имеют более быстрое время запуска (< 100 мс) и меньшее потребление памяти. Однако создание собственного образа требует больше времени, чем создание образа на основе JVM.
Проект все еще находится в стадии бета-тестирования, но уже поддерживает большинство модулей Spring portfolio, включая Spring Framework, Spring Boot, Spring Security и Spring Cloud.
Его функции делают его подходящим для создания бессерверных приложений с функцией Spring Cloud и развертывания их на таких платформах, как Azure Functions, AWS Lambda или Knative.
В этой статье вы узнаете о создании загрузочного приложения Spring, скомпилированного в собственный исполняемый файл с помощью Spring Native. Вы можете найти исходный код на GitHub.
Загрузка приложения с помощью Spring Native
Вы можете добавить Spring Native в свое приложение при загрузке проекта из Spring Initializr .
Созданный проект будет содержать зависимость от собственного проекта Spring и плагина Spring AT, используемого для компиляции исходного кода вашего приложения в собственный исполняемый файл, улучшая при этом совместимость и занимаемую площадь.
Файл build.gradle
выглядит следующим образом.
plugins { id 'org.springframework.boot' version '2.4.3' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'org.springframework.experimental.aot' version '0.9.0' } group = 'com.thomasvitale' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' repositories { maven { url 'https://repo.spring.io/release' } mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-webflux' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.projectreactor:reactor-test' } test { useJUnitPlatform() } bootBuildImage { builder = 'paketobuildpacks/builder:tiny' environment = ['BP_NATIVE_IMAGE': 'true'] }
Вы можете создать собственный образ из своего приложения, используя знакомый плагин Spring Boot (Gradle или Maven) и его встроенную поддержку облачных встроенных пакетов сборки. Выбор между образами виртуальной машины JVM и Graal определяется свойством BP_NATIVE_IMAGE
в задаче boot Build Image
, которое предварительно настраивается при использовании Spring Initialzr.
Определение конечной точки REST с помощью Spring Web Flux
Давайте определим конечную точку REST с помощью Spring Web Flux, чтобы мы могли протестировать приложение.
В Spring Native Graal vm Application
классе, сгенерированном инициализацией, вы можете добавить конечную точку REST с помощью функции маршрутизатора или @RestController
– аннотированный класс. Давайте остановимся на первом варианте.
package com.thomasvitale.demo; import reactor.core.publisher.Mono; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.ServerResponse; import static org.springframework.web.reactive.function.server.RouterFunctions.route; import static org.springframework.web.reactive.function.server.ServerResponse.ok; @SpringBootApplication public class SpringNativeGraalvmApplication { public static void main(String[] args) { SpringApplication.run(SpringNativeGraalvmApplication.class, args); } @Bean RouterFunctionroutes() { return route() .GET("/", request -> ok().body(Mono.just("Spring Native and Beyond!"), String.class)) .build(); } }
Затем в классе Spring Native Graal vm Application Tests
, сгенерированном инициализатором, вы можете добавить интеграционный тест для конечной точки REST.
package com.thomasvitale.demo; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.reactive.server.WebTestClient; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @AutoConfigureWebTestClient class SpringNativeGraalvmApplicationTests { @Autowired private WebTestClient webClient; @Test void whenGetBooksThenReturn() { webClient .get().uri("/") .exchange() .expectStatus().is2xxSuccessful() .expectBody(String.class).isEqualTo("Spring Native and Beyond!"); } }
Запуск приложения как исполняемого файла JAR
Встроенная зависимость Spring в вашем проекте оптимизирует время запуска приложения и потребление памяти благодаря плагину Spring AOT, даже при запуске его как исполняемого файла JAR. Давайте попробуем это сделать.
Сначала откройте окно терминала, перейдите в корневую папку вашего проекта и выполните следующую команду.
$ ./gradlew bootRun
Приложение запустится быстрее, чем его соответствующая версия без Spring AOT. Давайте попробуем вызвать конечную точку REST.
$ curl http://localhost:8080 Spring Native and Beyond!
Запуск приложения в качестве собственного образа
Теперь давайте попробуем создать и запустить собственный образ, используя Spring Native с GraalVM.
Создание собственного образа очень просто с помощью плагина Spring Boot. Убедитесь, что ваш движок Docker запущен, а затем выполните следующую команду. Имейте в виду, что это займет несколько минут, что во многом зависит от характеристик процессора и памяти вашего ноутбука.
$ ./gradlew bootBuildImage
Результатом будет изображение spring-native-graalvm:0.0.1-SNAPSHOT
, которое вы можете запустить с помощью Docker.
$ docker run --name spring-native-graalvm -p 8080:8080 spring-native-graalvm:0.0.1-SNAPSHOT
Приложения с Spring Native обычно запускаются менее чем за 100 мс, в зависимости от доступных ресурсов вашего компьютера.
Еще раз, давайте вызовем конечную точку REST, чтобы убедиться, что приложение все еще работает при запуске в качестве собственного образа.
$ curl http://localhost:8080 Spring Native and Beyond!
Оно делает. Хорошая работа!
Вывод
В этой статье я рассказал о том, как быстро загрузить загрузочное приложение Spring и скомпилировать его в собственный исполняемый файл с помощью Spring Native и GraalVM.
Для получения дополнительной информации о проекте Spring Native и для того, чтобы следовать его дорожной карте, вы можете обратиться к официальной документации .
Если вы заинтересованы в облачной разработке с использованием Spring Boot и Kubernetes, ознакомьтесь с моей книгой Облачная Родная весна в действии .
Вам понравилась эта статья? Подробнее читайте в моем личном блоге: thomasvitale.com . Я пишу о корпоративной Java, Spring, Keycloak и безопасности приложений.
Оригинал: “https://dev.to/thomasvitale/spring-native-getting-started-with-graalvm-native-images-457b”