温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

spring-native的介绍及应用

发布时间:2021-06-23 14:36:40 来源:亿速云 阅读:2762 作者:chen 栏目:编程语言

本篇内容主要讲解“spring-native的介绍及应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring-native的介绍及应用”吧!

<谨供参考>

  • 官方介绍

Spring Native提供了使用GraalVM 本机图像编译器将Spring应用程序编译为本机可执行文件的支持。
与Java虚拟机相比,本机映像可以为许多类型的工作负载提供更便宜,更可持续的托管。这些包括微服务,功能工作负载,非常适合容器和Kubernetes
使用本机映像具有关键优势,例如即时启动,即时峰值性能和减少的内存消耗。
GraalVM本机项目希望随着时间的推移会改善一些缺点和折衷方案。构建本机映像是一个繁重的过程,比常规应用程序要慢。预热后,本机映像具有较少的运行时优化。最后,它比具有某些不同行为的JVM还不成熟。
常规JVM和此本机映像平台之间的主要区别是:
	- 在构建时将未使用的零件删除。
	- 反射,资源和动态代理需要配置。
	- 类路径在构建时是固定的。
	- 没有类延迟加载:可执行文件中附带的所有内容都将在启动时加载到内存中。
	- 一些代码将在构建时运行。
	- 围绕Java应用程序的某些方面存在一些局限性,这些局限性未得到完全支持。

简单来说,就是更快.更短,更小

  • 更快的启动速度

  • 更短的响应时间

  • 更小的内存消耗

十分适用于目前互联网环境的快捷开发和微服务架构的项目

而Spring Native的基础则是Graalvm,一个由oracle开发维护的多语言编译/运行时平台. 它的官方说法是高性能JDK发行版,目前已支持到7种语言,包括不仅限于java.ruby.node等 基于graalvm开发的java框架还有一个国内目前还不算太火的Quarkus,在一些油管up的测评视频中,证明quarkus(1.13)要比spring native(0.7x)更快更小,我也写了quarkus快一年了,即使抛弃graalvm本身,也确实比springboot要更快,更短

我用的是0.92,仅支持springboot2.4.5 还有,机器的内存最好备到8个G,因为我测试时候memory in use一度飙升到5个多G,这可能也是graalvm为了更快产生的代价把

  • pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.4.5</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>org.xiaowu</groupId>
	<artifactId>behappy-springboot</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>behappy-springboot</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
		<spring-native.version>0.9.2</spring-native.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-webflux</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.experimental</groupId>
			<artifactId>spring-native</artifactId>
			<version>${spring-native.version}</version>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>io.projectreactor</groupId>
			<artifactId>reactor-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<classifier>exec</classifier>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
					<image>
						<builder>paketobuildpacks/builder:tiny</builder>
						<env>
							<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
						</env>
					</image>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.springframework.experimental</groupId>
				<artifactId>spring-aot-maven-plugin</artifactId>
				<version>${spring-native.version}</version>
				<executions>
					<execution>
						<id>test-generate</id>
						<goals>
							<goal>test-generate</goal>
						</goals>
					</execution>
					<execution>
						<id>generate</id>
						<goals>
							<goal>generate</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
	<profiles>
		<profile>
			<id>native-image</id>
			<build>
				<plugins>
					<plugin>
						<groupId>org.graalvm.nativeimage</groupId>
						<artifactId>native-image-maven-plugin</artifactId>
						<version>21.0.0.2</version>
						<configuration>
							<!-- The native image build needs to know the entry point to your application -->
							<mainClass>org.xiaowu.behappy.BehappySpringbootApplication</mainClass>
							<!--https://blog.csdn.net/u013794093/article/details/100094871?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.baidujs&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.baidujs-->
							<buildArgs>
								<!--https://blog.csdn.net/thomasyuang/article/details/84318184-->
								<arg>--static</arg><!--解决standard_init_linux.go:178: exec user process caused "no such file or directory"-->
								<!--<arg>libc=musl</arg>gcc编译过程中会有些许问题,这个参数仅jdk11支持-->
							</buildArgs>
						</configuration>
						<executions>
							<execution>
								<goals>
									<goal>native-image</goal>
								</goals>
								<phase>package</phase>
							</execution>
						</executions>
					</plugin>
				</plugins>
			</build>
		</profile>
	</profiles>
	<repositories>
		<repository>
			<id>spring-releases</id>
			<name>Spring Releases</name>
			<url>https://repo.spring.io/release</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>
	<pluginRepositories>
		<pluginRepository>
			<id>spring-releases</id>
			<name>Spring Releases</name>
			<url>https://repo.spring.io/release</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</pluginRepository>
	</pluginRepositories>
</project>
  • 测试Controller

/**
 * 小五
 */
[@RestController](https://my.oschina.net/u/4486326)
public class TestController {

    @GetMapping("/")
    public String test() {
        return "TestController";
    }
}

linux环境下安装各种环境(windows需要安装各种c的运行库,安完还是缺...linux和mac要好很多)

  • graalvm

使用SDKMan安装适当的SDK和GraalVM插件,SDKMan是Java SDK管理工具,可让轻松安装和配置GraalVM所需的依赖项(截至当日,支持8和11)
curl -s "https://get.sdkman.io" | bash
sdk install java 21.0.0.r8-grl
sdk use java 21.0.0.r8-grl
gu install native-image
  • gcc,unzip,zip,glibc-static,zlib

yum install -y glibc-static zlib zlib-devel zip unzip
sudo yum group install "Development Tools"
该命令安装了一堆新的软件包,包括gcc,g++和make。
gcc --version

然后spring native提供了两种构建方式

  1. 将Spring Native应用程序构建到Docker映像中

运行以下命令以构建Docker映像文件,并将编译后的代码包装在构建包中。
mvn spring-boot:build-image
使用Docker运行映像:
docker run -p 8080:8080 docker.io/xxx
  1. 将Spring Native应用程序构建到可执行文件中

运行以下命令编译Spring Boot应用程序的本机二进制可执行文件:
mvn clean -Pnative-image package
通过运行以下命令来执行本机应用程序:
target/spring-native-example
  • 这里我用是第二种方式

spring-native的介绍及应用

速度可以说是相当快了
接下来给他做成docker容器再看下
FROM scratch
COPY target/org.xiaowu.behappy.behappyspringbootapplication /app
ENTRYPOINT ["/app"]

docker build -f Dockerfile -t behappy:1.0 .
docker run -p 8080:8080 --name springnative -d behappy:1.0

spring-native的介绍及应用

再贴两张youtube上某up做的对比图

spring-native的介绍及应用

项目仅加了一个webflux
前者是native的,后者是非native的,
可以看到size是有明显缩小的

spring-native的介绍及应用

上图的启动时间是3秒
下图可以看到0.1秒多,spring native官方介绍过,正常的一般启动都不会超过100毫秒,可以看出启动时间上的差距是巨大的
右面是两者的cpu消耗,io占用等信息,也能看出两者有着明显的差距

到此,相信大家对“spring-native的介绍及应用”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI