强大的Spring Native,启动一个 SpringBoot 项目只需0.07 秒

Spring Boot 3.2实战:GraalVM打包Native镜像的8个避坑要点 Spring Boot 3.2 提供了对 GraalVM Native 镜像的更好支持,但要充分发挥其优势,避免常见的坑至关重要。确保使用合适的 GraalVM 版本;避免使用动态代理和反射,确保所有类和方法在构建时声明;配置 Spring Boot 的原生构建支持,使用 Spring Native 插件;将静态资源和配置文件打包到构建过程中;处理 Java 反射和第三方框架的兼容性问题;使用 GraalVM 的日志和调试工具进行故障排除; 阅读详情

先抛一个问题,大家在自己电脑上启动一个 Spring Boot 项目需要花费多久?

根据项目大小和机器环境,花费几秒到几十秒的人应该都有。

Spring 官方推出了一项技术可以将项目的启动时间缩短到 79 毫秒,79 毫秒大概是个什么概念?就是你还没反应过来项目已经启动好了,太牛了。

这项技术被 spring 官方命名为Spring Native,翻译成中文叫Spring 云原生,应该有少部分人听说过这个概念,我先带大家入门扫盲。

我是谁?

Spring Native 是 Spring 推出微服务体系 Spring Cloud 之后的又一大举动,从名字可以猜出,Spring Native 是一门面向云原生的技术。如果你还对这个概念不太理解,可以多看一点东西,比如 Oracle 的 GraalVM 等。

Spring Native 为使用 GraalVM 原生镜像编译器编译 Spring 应用为本地可执行文件提供支持。与 Java 虚拟机相比,原生镜像可以在许多场景下降低工作负载,包括微服务,函数式服务,非常适合容器和 Kubernetes。使用原生镜像有明显优势,如快速启动,提高峰值性能以及降低内存消耗。

我有多强?

上面提到了原生镜像,简单来说原生镜像是一种将 Java 代码提前编译为独立可执行文件(称为本机映像)的技术。可执行文件包括应用程序类,以及其依赖项的类,运行时库类以及 JDK 中的静态链接本机代码。

小芝士,GraalVM 官网对原生镜像的解释: 原生镜像提供了一种构建和运行具有不同于常规 JVM 部署特性的 Spring Boot 应用程序的方法: 输出是一个本机可执行文件,其中包含您的应用程序以及 JDK 的子集以及运行它所需的依赖项。 在实践中,可执行文件可能会以高度优化的容器映像(FROM scratch支持 Docker 镜像)的形式提供,并且减少了表面攻击,非常适合 Kubernetes。 启动时间几乎是即时的,并且可以立即获得峰值性能,从而支持从零缩放(无服务器)应用程序,包括常规的 Spring Boot Web 应用程序。 减少了内存消耗,这非常适合拆分为多个微服务的系统。

这些原生的 Spring 应用可以作为一个独立的可执行文件(原生镜像)进行部署(不需要安装 JVM),性能非常强:

  • 几乎瞬时的启动(一般会小于 100 毫秒)

  • 瞬时的峰值性能以及更低的资源消耗

当然牛逼的背后肯定要稍微付出一点代价:比 JVM 更长的构建时间和更少的运行时优化。

上手

既然 Spring Native 性能这么强悍,是不是得动手试一试了。

下面我会拿传统的 springboot 项目和基于 Spring Native 的项目进行比较演示。

环境信息

  • 电脑:MacBook pro 13 寸 2017

  • 操作系统:macOS Big Sur 11.2

  • IDE:IntelliJ IDEA 2021.2.2 (Ultimate Edition)

  • Open JDK:11.0.12

  • maven:3.6.3

  • Docker desktop:4.0.1

初始化项目

进入 spring 初始化页面:

https://start.spring.io/

第一步:填写必要项目信息

这里我选择 maven 构建,spring boot 版本选择 2.5.8,jdk 版本选择 11

​

第二步:添加必要依赖

添加两个依赖:

  • spring native

  • spring web

​

​

第三步:生成项目骨架代码

点击下载可以获得一个压缩包

​

注意:以上步骤也可以直接在 IDEA 里通过 start.spring.io 进行新建,这里不再赘述。

运行项目

导入测试项目后可以在根目录下面看到一个帮助文档:

​

通过阅读帮助文档得知有两种方式启动 spring native 项目:

  • 第一种:借助 maven 插件将项目构建为 docker 镜像,然后启动镜像;

  • 第二种:借助本地构建工具将项目打包为一个可执行的文件,然后直接启动即可。

我电脑上已经装了 docker 工具,这里我演示一下第一种方式。

第一步:生成 docker 镜像文件

$ ./mvnw spring-boot:build-image

这个过程可能有点漫长,也可能会失败,大家做好心理准备。

第二步:启动镜像文件

$ docker run --rm spring-native-demo:0.0.1-SNAPSHOT

执行完命令之后,项目瞬间就跑起来了。

性能测试对比

场景一:使用 Spring Native

官方宣称 79 毫秒就可以启动,原谅我的电脑太渣了,最好的一次花费了 143 毫秒,也就是一瞬间的事情,确实牛叉。

​

场景二:普通启动

没有对比就没有伤害,普通启动花费了 2.091 秒

​

结论

在我的破电脑上测试,Spring Native 的启动速度大致是普通启动的 15 倍。

Spring Native 牛逼!牛逼!牛逼!(破音)

FAQ

在测试过程中踩了不少坑,这里做一个汇总。

问题一:maven 依赖下载失败,网络差         

可以配置 maven 镜像仓库

<mirror>

<id>aliyunmaven</id>

<mirrorOf>*</mirrorOf>

<name>central</name>

<url>https://maven.aliyun.com/repository/central</url>

</mirror>

问题二:镜像构建失败,提示内存不足

​

解决方法:增大 Docker 的内存配置

​原文:体验79毫秒启动一个项目

SpringNative:把Spring项目编译成原生程序 Spring 发布了 Spring Native 的 beta 版本,该功能已经在 start.spring.io 上可用了。 Spring Native 是什么 Spring Native 可以通过 GraalVM 将 Spring 应用程序编译成原生镜像,提供了一种新的方式来部署 Spring 应用。Spring Native 支持 Java 和 Kotlin。 这个项目的目标是寻找 Spring JVM 的替代方案,提供一个能将应用程序打包,并运行在轻量级容器的方案。期望能够在 Spring N 阅读详情

相关推荐

SpringBoot3.0新特性:1、spring.factories文件废弃,自动配置包位置变化 2、Spring Native 快速体验 3、jakata api迁移 3、三方库的支持

SpringBoot3.0新特性:1、spring.factories文件废弃,自动配置包位置变化 2、Spring Native 快速体验 3、jakata api迁移 3、三方库的支持

世上哪有什么岁月静好,不过是有人替你负重前行 1万+

Spring Native 0.11.1 入门体验(Spring Boot 2)

近几年“原生”一词一直泛滥在云计算、边缘计算等领域中,而原生宠幸的语言也一直都是 Golang,Rust 等脱离 Sandbox 运行的开发语言。Java 得益于上世纪流行的一次编译,到处执行的理念,流行至今,但也因为这个原因,导致 Java 程序脱离不了 JVM 运行环境,使得不那么受原生程序的青睐。在云原生泛滥的今天,臃肿的 JVM 使 Java 应用程序对比其他语言显得无比的庞大,各路大神也想了很多方式让 Java 变的更“原生”。

Hi there 6337

Spring Boot 整合Spring Native:GraalVM原生镜像

启动慢:比如一个简单的Spring Boot应用,启动可能需要2-5秒(微服务集群里这会被放大成“启动风暴”);内存占用高:JVM本身需要几百MB内存,加上应用代码,一个“空壳”服务可能就占用1GB以上(云服务器按内存收费,这很烧钱)。Spring Native + GraalVM原生镜像,覆盖从原理到实战的全流程。用“送快递”的故事引出核心概念;解释GraalVM、Spring Native、原生镜像的关系(附流程图);手把手教你整合Spring Boot与Spring Native;

Java大师兄的博客 1362

Springboot 3.0之Spring Native初体验

Spring Boot 3.0初体验

一名java小白的求知之路的博客 1万+

Spring Boot 3 Native Image实战:整合MyBatis-Plus与Spring Security的完整指南

本文详细介绍了如何将Spring Boot 3 Native Image与MyBatis-Plus和Spring Security进行整合的完整实战指南。文章深入剖析了Native Image带来的毫秒级启动与内存优化优势,并重点解决了整合MyBatis-Plus时遇到的Lambda表达式捕获等核心挑战,同时提供了Spring Security的配置要点与常见问题(如日志乱码)的解决方案,帮助开发者构建高效、云原生的Java应用。

cake8的博客 816

使用 GraalVM Native Image 将 Spring Boot 应用编译为跨平台原生镜像:完整指南

本文介绍了如何利用GraalVM将Spring Boot 3应用编译为原生可执行文件,实现毫秒级启动、低内存占用和小体积部署。主要内容包括:GraalVM Native Image技术原理及优势;环境配置指南(安装GraalVM和Native Image工具);创建Spring Boot 3项目并添加Native支持;通过Maven插件实现单平台和跨平台编译;以及使用Docker构建多平台原生镜像的最佳实践。该方案适用于微服务、Serverless等需要快速启动的云原生场景,相比传统JVM应用可显著提升性能

2503_92145588的博客 1854

SpringBoot Jar包加密实战:使用classfinal保护Java代码安全

在Java应用开发中,代码保护是保障知识产权和交付安全的重要环节。其核心原理在于对编译后的字节码文件进行处理,防止通过反编译工具轻易获取源代码。字节码加密技术通过自定义类加载器,在运行时动态解密,能有效提升静态分析的门槛,为商业软件和SaaS产品提供基础的安全保障。这一技术尤其适用于需要交付给客户或部署在公有云环境的SpringBoot应用,防止核心业务逻辑和敏感配置泄露。本文以热门的开源工具classfinal为例,结合Maven插件集成与自定义类加载机制,详细解析如何为SpringBoot Fat Ja

weixin_30580341的博客 401

Trae完整项目实战:Spring Boot+MySQL开发流配置指南

Trae并非传统IDE,而是一个可编程的开发会话引擎,其核心在于任务驱动、技能模块(Skills)协同与结构化上下文(Context)编排。理解Runtime Core调度机制、Skill进程隔离特性及Task+Context定义范式,是实现Java工程闭环的关键。本文聚焦Spring Boot完整项目落地,涵盖maven-skill环境适配、springboot-skill启动流程、mysql-mcp-skill数据库集成等真实场景,解决‘系统未知错误’、parent POM解析失败、IPC socket

444

XUpdateService 开源项目教程

XUpdateService 开源项目教程 项目介绍 XUpdateService 是一个用于应用版本更新的后端服务开源项目。它提供了一套完整的API接口,帮助开发者轻松实现应用的版本检查、更新提示以及强制更新等功能。该项目基于Spring Boot开发,具有良好的扩展性和易用性。 项目快速启动 环境准备 Java 8 或更高版本 Maven Git 克隆项目 git clone https:...

gitblog_00430的博客 768

SpringBoot启动卡住无日志?三步定位线程阻塞点与解决方案

在Java应用开发中,线程阻塞是常见的性能与稳定性问题,尤其在SpringBoot这类复杂框架的启动阶段。其原理通常是某个线程在等待资源(如锁、I/O、网络连接)时被挂起,导致整个应用流程停滞。理解线程状态(RUNNABLE、WAITING、BLOCKED)和线程转储分析技术,对于诊断生产环境中的“静默”故障具有重要价值。通过jstack等工具获取线程快照,可以精准定位到数据库连接池、配置中心客户端或自定义初始化代码中的阻塞点,这是后端工程师必备的线上调试技能。本文以SpringBoot启动卡住的典型场景为

weixin_34252090的博客 412

SpringBoot应用启动卡死无日志?系统化排查与解决方案

在Java应用开发中,应用启动失败是常见的运维挑战,尤其当进程卡住且无任何异常日志输出时,问题定位尤为困难。这类问题通常涉及JVM线程管理、资源等待及框架生命周期等底层原理。从技术价值看,掌握系统化诊断方法能显著提升线上问题恢复速度与系统可用性。在实际应用场景中,无论是单体应用还是微服务架构,启动卡死可能源于Bean初始化死锁、外部资源连接超时、依赖冲突或容器环境不匹配。本文聚焦SpringBoot框架,针对【线程转储】分析和【外部资源连接】超时两大高频热词,提供从环境检查到代码层级的全链路排查指南,帮助开

weixin_30755393的博客 340

GraalVM详细安装及打包springboot、java、javafx使用教程(打包springboot2篇)

在当前多元化开发环境下,Java作为一种广泛应用的编程语言,其应用部署效率与灵活性的重要性日益凸显。Spring Boot框架以其简洁的配置和强大的功能深受开发者喜爱,而JavaFX则为开发者提供了构建丰富桌面客户端应用的能力。然而,将Spring Boot后端服务与JavaFX前端界面整合并实现高效部署,对许多开发者来说是一项挑战。GraalVM的出现,恰好解决了这一难题。

不曾留得桃花影 1697

SpringBoot项目部署实战:JAR与WAR包部署原理、对比与生产环境最佳实践

Java Web应用部署是后端开发的核心环节,其本质是将应用程序从开发环境迁移到服务器环境,确保服务稳定运行。从技术原理上看,部署方式主要分为独立应用模型和容器依赖模型,这直接影响了应用的可移植性、资源管理和运维流程。在工程实践中,SpringBoot框架通过内嵌Servlet容器技术,实现了JAR包的一键式独立部署,大幅简化了传统Java EE应用的部署复杂度。对于需要融入现有企业级中间件体系或共享容器资源的场景,WAR包部署仍具价值。本文聚焦于SpringBoot项目的两种主流部署方式,深入解析JAR包

weixin_33725126的博客 384

Spring Boot 3.3 新特性介绍

它可以缩短启动时间并减少 Spring Boot 应用程序的内存消耗。类数据共享 (CDS)是一项 JVM 功能,CDS全称为即类数据共享。其主要作用是在多个 JVM之间实现类文件的共享,从而显著减少应用程序启动时 JVM 进行类加载所耗费的时间,同时有效降低内存的占用。我们可以将类数据共享(CDS)视为 Spring Boot 3.3 中最重要的新功能,与CRaC类似,CDS都是JVM提供的功能,但是其减少启动时间和内存占用的机制不同。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 4578

Linux部署SpringBoot项目:从能跑到稳跑的生产级实践

SpringBoot应用部署本质上是Java服务在Linux生产环境中的生命周期管理问题。其核心原理涉及JVM进程管控、系统服务化封装、网络流量调度与安全隔离。技术价值在于实现服务高可用、配置可审计、故障可自愈,支撑微服务架构落地与云原生演进。典型应用场景包括单体应用上线、企业私有化交付、信创环境适配(如麒麟/统信+ARM64)及CI/CD流水线集成。本文聚焦systemd守护、外置配置治理、防火墙与SELinux协同、Nginx反向代理等关键环节,系统拆解Linux下SpringBoot项目从本地jar包

417

【微服务】SpringBoot 4.0 新特性整合项目实战应用详解

SpringBoot 4.0 新特性整合项目实战应用详解

congge 4589

Self-hosted LiveSync 自托管同步插件实战指南:CouchDB 与对象存储部署、Setup URI 快速配置与状态栏监控全解析

Self-hosted LiveSync 是一个由社区开发的开源 Obsidian 同步插件,可在 Obsidian 支持的所有平台上使用,以 CouchDB 或对象存储(如 MinIO、S3、R2 等)作为同步服务器,实现笔记库(Vault)的高效、私有化同步。本文以 [README_es.md](https://link.gitcode.com/i/d269cac8c59408bd38719f

gitblog_00192的博客 499

QMT vs Ptrade:量化交易新手如何根据需求选择券商系统(附实战案例)

本文对比了QMT和Ptrade两大券商量化交易系统的核心差异,帮助量化交易新手根据需求选择合适的平台。QMT适合技术面策略开发,执行效率高;Ptrade则提供全面的财务数据和复杂策略支持。通过实战案例,展示了如何结合两平台优势实现高效量化交易。

weixin_42683394的博客 528

Spring Boot 4、JDK 25 与 GraalVM:Java 云原生进化,能否撼动 Go 的地位?

SpringBoot 4.0、JDK25与GraalVM NativeImage的组合正在重塑Java的云原生竞争力。通过将应用编译为本地可执行文件,该技术栈实现了三大突破:启动时间从秒级降至毫秒级,内存占用显著降低,同时保留Java成熟的生态优势。相比Go语言,Java在复杂企业级场景仍具优势,而Native编译缩小了其在云原生领域的性能差距。这一变革使Java能兼顾传统企业开发与云原生需求,适用于Kubernetes、Serverless等现代部署模式,但也需权衡编译时长和动态特性支持等限制。该

Demon_Hao的博客 338

VC中基于TWAIN协议控制扫描仪-----初级版

PS:本人是C++小白一枚,在研究此功能时不知走了多少弯路

a1101000099的专栏 8789

意图识别和纠错问题

可想而知,错误的意图识别会带来多大的负面影响。基于词典,就是对用户query内容和词典内容进行比对,比较常见的方式是序列标注问题里用的最大逆向匹配,通过这种方式找到词典里的实体词,匹配触发了自然就有意图了,而在词典匹配的时候,不是使用链表之类的来构造匹配结构,而是使用搜索树的结构,这种匹配的复杂度最低,速度也快,两者结合,其速度甚至比很多模型要快得多(基本上1ms以内就能完成),fasttext速度非常快,但是textcnn之类的其实就已经达到ms级别以上,bert甚至在10ms级别。

TURING.DT 4574
上一篇: 如何避免Java踩坑教训,教你这三种
下一篇: 13000多字给大家分享解析一下java反射机制
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值