使用Spring Native毫秒级启动SpringBoot项目,并且大量减少占用的内存

本文介绍SpringNative0.12.1版本,通过GraalVM将SpringBoot2.7.4应用程序编译为原生可执行文件的方法。两种构建方式分别为使用SpringBootBuildpacks生成轻量级容器和使用GraalVM原生镜像Maven插件生成可执行文件。通过实例展示了启动速度和内存占用的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Native是什么

  近几年“原生”一词一直泛滥在云计算、边缘计算等领域中,而原生宠幸的语言也一直都是Golang,Rust等脱离Sandbox运行的开发语言。Java得益于上世纪流行的一次编译,到处执行的理念,流行至今,但也因为这个原因,导致Java程序脱离不了JVM运行环境,使得不那么受原生程序的青睐。在云原生泛滥的今天,臃肿的JVM使Java应用程序对比其他语言显得无比的庞大,各路大神也想了很多方式让Java变的更“原生”。
  Spring Native 为使用GraalVM 原生映像编译器将 Spring 应用程序编译为原生可执行文件提供 beta 支持,以提供通常设计为打包在轻量级容器中的原生部署选项。实际上,目标是在这个新平台上支持几乎未修改的 Spring Boot 应用程序。

配置环境

OS:Windows10 21H2
IDE:IntelliJ IDEA 2022.1.3
JDK:graalvm-ce-java11-22.2.0
Maven:3.5.4
Docker Desktop for Windows: 4.12.0
Spring Boot:2.7.4
Spring Native:0.12.1

使用 Spring Native 的应用程序应该使用 Java 11 或 Java 17 编译。
构建 Spring Boot 原生应用程序有两种主要方法:

  1. 使用Spring Boot Buildpacks 支持生成包含本机可执行文件的轻量级容器。
  2. 使用GraalVM 原生镜像 Maven 插件支持生成原生可执行文件。

  方法1就是在SpringBoot2.3后,可以使用spring-boot-maven-plugin插件来构建docker镜像,使用mvn spring-boot:build-image命令结合Docker的API来实现Spring Boot 原生应用程序的构建,成功执行后会直接生成一个docker镜像,然后run这个镜像就可以了,不用我们再写Dockerfile了,相关的参数配置都在pom.xml中配置(该插件的configuration标签下,和fabric8或spotify的docker-maven-plugin很相似)。

  方法2不需要安装docker,但要安装Visual Studio,然后执行mvn -Pnative package命令后会生成一个可执行文件(.exe),运行即可。

主要区别如下

  1 环境依赖不同
    方法1需要安装Docker
    方法2需要安装Visual Studio(需要用到部分单个组件:2个MSVC,1个Windows 10 SDK)
  2 执行的maven命令不同
    方法1是mvn spring-boot:build-image
    方法2是mvn -Pnative package
  因为每个微服务使用Docker部署而不是exe文件,所以方法1正好符合我的需求,所以后文使用Spring Boot Buildpacks的方式构建Spring Boot原生应用程序。

安装Graal VM(graalvm-ce-java11-windows-amd64)

  官方下载地址:Graal VM
在这里插入图片描述
在这里插入图片描述

配置环境变量

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
  检验是否安装成功
在这里插入图片描述

安装native-image

  打开新的cmd,输入以下命令,等待安装

gu install native-image

安装 Docker Desktop for Windows

  具体步骤略,按照官方文档操作即可:https://docs.docker.com/desktop/windows/install/

创建Springboot项目

在这里插入图片描述
在这里插入图片描述

  完整的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.7.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>spring-native</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>spring-native</name>
	<description>spring-native</description>
	<properties>
		<java.version>11</java.version>
		<repackage.classifier/>
		<spring-native.version>0.12.1</spring-native.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</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>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
					<classifier>${repackage.classifier}</classifier>
					<image>
						<builder>paketobuildpacks/builder:tiny</builder>
						<env>
							<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
							<BPE_DELIM_JAVA_TOOL_OPTIONS xml:space="preserve"> </BPE_DELIM_JAVA_TOOL_OPTIONS>
							<BPE_APPEND_JAVA_TOOL_OPTIONS>-Xms128m</BPE_APPEND_JAVA_TOOL_OPTIONS>
							<BPE_APPEND_JAVA_TOOL_OPTIONS>-Xmx128m</BPE_APPEND_JAVA_TOOL_OPTIONS>
							<BPE_APPEND_JAVA_TOOL_OPTIONS>-Xss256k</BPE_APPEND_JAVA_TOOL_OPTIONS>
							<BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:ParallelGCThreads=2</BPE_APPEND_JAVA_TOOL_OPTIONS>
							<BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:+PrintGCDetails</BPE_APPEND_JAVA_TOOL_OPTIONS>
						</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>
	<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>

  本文介绍的是Spring Native0.12.1版本,其对应的Spring Boot版本必须是2.7.4,以上只是一个最基本的配置案例,实际开发中还需要在spring-boot-maven-plugin插件的configuration标签下配置其他许许多多的参数。
  例如docker远程的地址和证书的路径、jvm调优参数、配置文件指定、docker镜像名端口仓库地址等等,最好的方法就是看spring-boot-maven-plugin的官方文档,这里以配置jvm参数为例
在这里插入图片描述
  配置官方文档
  为了测试我这里配置Springboot项目端口为8888,并且添加了一个获取当前日期的API。
在这里插入图片描述
在这里插入图片描述

执行maven命令

mvn clean
mvn '-Dmaven.test.skip=true' spring-boot:build-image

  下载完相关依赖后,电脑就会开始构建编译项目,查看任务管理器可以发现在构建和编译过程中CPU利用率很高,内存使用量也很高,根据电脑配置和网络状态不同使用的构建时间也不相同。
  构建成功如下图:
在这里插入图片描述

创建并运行容器

  查看所有镜像docker images
在这里插入图片描述
  spring-native就是构建的镜像
  创建并运行容器

docker run -id -p 8888:8888 --name=native-app spring-native:0.0.1-SNAPSHOT 59178df9f49b

  在Docker Desktop查看日志,发现应用成功启动,启动仅耗时31ms,果然印证了Spring Native启动是毫秒级别这句话。
在这里插入图片描述
  在Docker Desktop查看占用内存,仅46M左右。
在这里插入图片描述
  成功调用接口
在这里插入图片描述
  不使用Spring Native启动应用,使用java -jar来启动项目
在这里插入图片描述
在这里插入图片描述

  启动耗时1.5秒,占用内存高达238M。
  最后附上Spring Native官方文件:Spring Native

<think>好的,我现在需要回答用户关于Spring Boot 3的优势和特性的问题。用户之前已经提供了一些引用内容,虽然部分引用看起来不太相关,但其中引用[2]和[3]提到了Spring Boot的核心特性,比如自动配置、简化配置、监控等。我需要结合这些信息,同时补充Spring Boot 3的新特性。 首先,用户明确想了解的是Spring Boot 3的优点和好处,所以需要区分Spring Boot的一般优势和Spring Boot 3的新增特性。根据已有的知识,Spring Boot 3基于Spring Framework 6,支持Java 17,并引入了对GraalVM原生镜像的支持,这些都是重要的更新点。此外,可能还有性能优化、依赖升级、更好的云原生支持等。 接下来,我需要结构化回答,可能分为几个部分,比如核心优势、新增特性、开发效率提升、未来趋势等。确保每个部分都有具体的点,并且引用相关的引用内容,比如自动配置来自引用[2],Actuator监控来自引用[3]。 还要注意用户提到的引用[1]中提到了Spring Boot 3.0是企业应用开发的基石,所以可能需要强调其在企业级应用中的优势,比如微服务支持、云原生集成等。 需要检查是否有遗漏的重要特性,比如响应式编程的支持是否在Spring Boot 3中有增强,或者新的安全特性。同时,考虑用户可能的后续问题,比如如何迁移到Spring Boot 3,或者具体某个特性的使用方式,因此在相关问题中可以生成相关问题。 最后,确保使用正确的中文表达,遵循用户给出的格式要求,比如行内公式用$...$,独立公式用$$...$$,不过这个问题可能不涉及数学公式,但需要留意。同时,按照用户要求,引用标识要自然添加在引用段落末尾,比如[^1], [^2], [^3]。</think>### Spring Boot 3 开发优势与核心特性 Spring Boot 3 是 Spring 生态的重要升级版本,基于 Spring Framework 6 构建,全面支持 Java 17 和 Jakarta EE 9+。以下是其核心优势与特性: --- #### **一、核心优势** 1. **简化企业级开发** Spring Boot 3 延续了“约定优于配置”的理念,通过自动配置(Auto Configuration)减少开发者手动配置的负担[^2]。例如,内嵌 Tomcat 服务器和默认数据库配置可快速启动 Web 应用。 2. **高效云原生支持** 全面拥抱云原生技术,支持 Kubernetes、Docker 和 Serverless 架构,与 Spring Cloud 深度集成,简化微服务开发[^1]。 3. **性能优化与资源节约** 引入 GraalVM 原生镜像支持(Native Image),显著减少应用启动时间和内存占用。例如,原生镜像启动时间可缩短至毫秒级,适用于 FaaS 场景。 4. **现代化技术栈适配** 默认支持 Java 17 和 Jakarta EE 9+,提供对响应式编程(如 Spring WebFlux)和函数式编程的增强支持[^3]。 --- #### **二、新增关键特性** 1. **GraalVM 原生镜像支持** Spring Boot 3 通过 Spring Native 项目,将应用编译为原生可执行文件,性能提升显著: $$ T_{\text{启动}} \approx 0.1 \text{秒} \quad (传统 JAR 启动约 2-5 秒) $$ 2. **增强的监控能力** Actuator 模块新增健康检查、性能指标和追踪端点,支持 Prometheus 和 Grafana 集成,例如通过 `/actuator/metrics` 实时监控内存使用[^3]。 3. **声明式 HTTP 客户端** 使用 `@HttpExchange` 注解简化 REST 客户端开发,替代传统的 RestTemplate: ```java @HttpExchange("/api") public interface UserClient { @GetExchange("/users") List<User> getAllUsers(); } ``` 4. **改进的安全特性** 集成 Spring Security 6.0,支持 OAuth2 2.0 和 OpenID Connect 1.0,提供更简洁的配置方式。 --- #### **三、开发效率提升** - **依赖管理简化** 通过 `spring-boot-starter-parent` 统一管理依赖版本,避免兼容性问题。 - **快速构建 REST API** 结合 Spring Data JPA 和 Spring MVC,10 分钟内可搭建具备 CRUD 功能的 API。 - **热部署支持** 开发模式下,使用 DevTools 实现代码热更新,节省调试时间[^2]。 --- #### **四、未来趋势适配** Spring Boot 3 是 Java 生态向云原生和现代化转型的关键工具,适用于: - 微服务架构 - Serverless 应用 - 高并发响应式系统 - 资源敏感的边缘计算场景 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随遇而安ing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值