Рубрики
Без рубрики

Spring Native: Начало работы с собственными образами Graal VM

Проект Spring Native обеспечивает поддержку упаковки приложений Spring в виде собственных изображений с использованием G… С тегами java, docker, cloud, spring.

Проект 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
    RouterFunction routes() {
        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”