3年前 (2021-06-06)  Serverless |   抢沙发  470 
文章评分 0 次,平均分 0.0

Spring Native项目支持使用GraalVM将Spring应用程序打包为原生镜像。

与JVM可执行文件相比,原生镜像具有更快的启动时间(<100ms)和更低的内存消耗。但是,构建原生镜像比基于JVM的映像需要更多的时间。

该项目仍处于测试阶段,但已经支持大多数Spring组合模块,包括Spring Framework, Spring Boot, Spring Security, 和 Spring Cloud。

它的特性使它非常适合使用Spring Cloud功能构建无服务器serverless应用程序,并将其部署到Azure Functions、AWS Lambda或Knative等平台。

本文将指导您构建一个Spring Boot应用程序,该应用程序使用Spring native编译为本机可执行文件。您可以在GitHub上找到源代码:https://github.com/ThomasVitale/spring-tutorials/tree/master/spring-native-graalvm

使用Spring Native引导应用程序

当从spring initializer引导项目时(https://start.spring.io/),可以将Spring Native添加到应用程序中。

Spring Native:GraalVM native images入门

生成的项目将包含对SpringNative项目和Spring AOT插件的依赖,Spring AOT插件用于将应用程序源代码编译为本机可执行文件,同时提高兼容性和占用空间。

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)及其嵌入式云本地Buildpacks支持,从应用程序构建本机映像。JVM和GraalVM映像之间的选择由bootBuildImage任务中的BP_NATIVE_IMAGE属性定义,该属性在使用Spring Initialzr时预先配置。

用Spring WebFlux定义REST端点

让我们用Spring WebFlux定义一个REST端点,以便测试应用程序。

在Initializer生成的SpringNativeGraalvmApplication类中,可以使用路由器函数或@RestController注释类添加REST端点。我们还是用前一种方法吧。

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<ServerResponse> routes() {
		return route()
				.GET("/", request -> ok().body(Mono.just("Spring Native and Beyond!"), String.class))
				.build();
	}
}

然后,在Initializer生成的SpringNativeGraalVmaApplicationTests类中,可以为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引擎正在运行,然后执行以下命令。请注意,这将需要几分钟,很大程度上取决于你的笔记本电脑的CPU和内存特性。

$ ./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的应用程序通常在不到100ms的时间内启动,这取决于您机器的可用资源。

Spring Native:GraalVM native images入门

再次调用REST端点,以确保应用程序作为本机映像运行时仍能正常工作。

$ curl http://localhost:8080
Spring Native and Beyond!

结论

在本文中,我介绍了如何快速引导Spring Boot应用程序,并使用Spring native和GraalVM将其编译为本机可执行文件。

原文地址:https://www.thomasvitale.com/spring-native-graalvm-getting-started/

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1989.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册