0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Spring官方再出手,这个工具杀疯了!

CodeSheep 来源:CodeSheep 2023-08-01 16:25 次阅读

大家好,今天这篇文章是一篇技术实战文章。

在文章开始之前,这里先抛一个问题:

大家在自己电脑上启动一个 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 性能这么强悍,是不是得动手试一试了。 下面我会拿传统的 Spring Boot 项目和基于 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 构建,SpringBoot 版本这里选择的是2.5.8,jdk 版本选择 11

257632ce-3007-11ee-9e74-dac502259ad0.png

第二步:添加必要依赖 添加两个依赖:
  • SpringNative
  • Spring Web

25ab1cb4-3007-11ee-9e74-dac502259ad0.png

25de3e14-3007-11ee-9e74-dac502259ad0.png

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

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

25e89aa8-3007-11ee-9e74-dac502259ad0.png

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

运行项目

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

25fa40a0-3007-11ee-9e74-dac502259ad0.png

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

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

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

我电脑上已经装了 Docker 工具,这里我演示一下第一种方式。第一步:生成Docker 镜像文件
$./mvnwspring-boot:build-image
这个过程可能有点漫长,也可能会失败,大家做好心理准备。第二步:启动镜像文件
$dockerrun--rmspring-native-demo:0.0.1-SNAPSHOT
执行完命令之后,项目瞬间就跑起来了。

性能测试对比

场景一:使用 Spring Native

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

2613e8f2-3007-11ee-9e74-dac502259ad0.png

场景二:普通启动

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

263c2eac-3007-11ee-9e74-dac502259ad0.png

小结

在我的破电脑上测试,Spring Native 的启动速度大致是普通启动的 15 倍。FAQ 在测试过程中踩了不少坑,这里做一个汇总。问题一:Maven 依赖下载失败,网络 可以配置 Maven 镜像仓库
<mirror>
<id>aliyunmavenid>
<mirrorOf>*mirrorOf>
<name>centralname>
<url>https://maven.aliyun.com/repository/centralurl>
mirror>
问题二:镜像构建失败,提示内存不足

266a58f4-3007-11ee-9e74-dac502259ad0.jpg

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

2673e13a-3007-11ee-9e74-dac502259ad0.png

好了,以上就是今天的内容分享了,感谢大家的收看,我们下篇见。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编译器
    +关注

    关注

    1

    文章

    1623

    浏览量

    49103
  • spring
    +关注

    关注

    0

    文章

    340

    浏览量

    14334
  • 镜像
    +关注

    关注

    0

    文章

    164

    浏览量

    10705

原文标题:Spring官方再出手,这个工具杀疯了!

文章出处:【微信号:CodeSheep,微信公众号:CodeSheep】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    java spring教程

    java spring教程理解Spring 实现原理掌握Spring IOC,AOP掌握Spring的基础配置和用法熟练使用SSH开发项目Sprin
    发表于 09-11 11:09

    什么是java spring

    什么是java springSpring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成
    发表于 09-11 11:16

    EDAS再升级!全面支持Spring Cloud应用

    ,框架的硬件资源占用却更少,在CPU和Load占用方面少于Spring Cloud约60%。EDAS不仅在阿里内部应用广泛,在各个领域的领航企业中,也成了企业IT架构转型过程中的重要工具。 通过EDAS
    发表于 02-02 15:20

    Spring工作原理

    核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过配置类达到的。Spring目的
    发表于 07-10 07:41

    Spring Boot嵌入式Web容器原理是什么

    Spring Boot嵌入式Web容器原理Spring Boot的目标是构建“非常容易创建、独立、产品级别的基于Spring的应用”。这些应用是“立即可运行的”。在这个过程中,完全没有
    发表于 12-16 07:57

    比特币“疯了,48小时53亿资金灰飞烟灭,7万人爆仓!

    比特币“疯了,48小时53亿资金灰飞烟灭,7万人爆仓!矿机也疯狂,店员:2万台也能卖出去,网友:洗钱神器......,比特币,矿机,交易
    发表于 02-20 14:12 1423次阅读

    Spring认证_什么是Spring GraphQL

    Spring GraphQL 为构建在 GraphQL Java 上的 Spring 应用程序提供支持。两个团队之间的联合联合。我们的共同理念是少固执己见,更专注于全面和广泛的支持。 Spring
    的头像 发表于 08-06 14:30 703次阅读
    <b class='flag-5'>Spring</b>认证_什么是<b class='flag-5'>Spring</b> GraphQL

    Spring认证」什么是Spring GraphQL?

    这个项目建立在 Boot 2.x 上,但它应该与最新的 Boot2.4.x5 相关。 要创建项目,请转到start.spring.io并为要使用的GraphQL传输选择启动器: 启动机 运输 执行
    的头像 发表于 08-10 14:08 810次阅读
    「<b class='flag-5'>Spring</b>认证」什么是<b class='flag-5'>Spring</b> GraphQL?

    spring认证证书有用吗?

    Spring认证(全称:Spring Professional认证)是Spring官方推出的认证体系,旨在测试和验证学生对 Spring
    的头像 发表于 07-12 15:59 2209次阅读

    为什么使用spring-authorization-server?

    官方原因:原先使用Spring Security OAuth,而该项目已经逐渐被淘汰,虽然网上还是有不少该方案,但秉着技术要随时代更新,从而使用spring-authorization-server
    的头像 发表于 01-09 15:27 2164次阅读

    基于spring的SPI扩展机制是如何实现的?

    基本上,你一说是基于 spring 的 SPI 扩展机制,再把spring.factories文件和EnableAutoConfiguration提一下,那么这个问题就答的八九不离十了。
    的头像 发表于 03-07 09:17 1039次阅读

    怎样使用Kiuwan保护Spring Boot应用程序呢?

    Spring Boot 提供了快速轻松地构建基于Spring 的应用程序所需的工具、功能和依赖项。
    的头像 发表于 03-16 09:10 779次阅读

    Spring干掉原生JVM?

    这意味着,除了 Spring 诞生以来就支持的 Java 虚拟机,官方添加了使用 GraalVM 将 Spring 应用编译成原生镜像的 beta 支持,这样的话,就能提供一种新的方式来部署
    的头像 发表于 05-05 09:25 546次阅读
    <b class='flag-5'>Spring</b>干掉原生JVM?

    Spring Boot Actuator快速入门

    一下 Spring Boot Actuator ,学习如何在 Spring Boot 2.x 中使用、配置和扩展这个监控工具Spring
    的头像 发表于 10-09 17:11 630次阅读

    Spring Cloud Gateway网关框架

    Spring Cloud Gateway网关框架 本软件微服务架构中采用Spring Cloud Gateway网关控制框架,Spring Cloud Gateway是Spring C
    的头像 发表于 08-22 09:58 477次阅读
    <b class='flag-5'>Spring</b> Cloud Gateway网关框架