GraalVM和Spring Native尝鲜,一步步让Springboot启动飞起来,66ms完成启动

news2024/11/16 19:30:16

简介

GraalVM是高性能的JDK,支持Java/Python/JavaScript等语言。它可以让Java变成二进制文件来执行,让程序在任何地方运行更快。这或许是Java与Go的一场战争?

下载安装GraalVM

安装GraalVM

首先到官网下载,我是直接到GitHub Release Page下载的,请下载对应的系统包,我下载如下:

graalvm-ce-java11-darwin-amd64-22.3.0.tar.gz

下载后解压到某个目录,我的如下:

/Users/larry/Software/graalvm-ce-java11-22.3.0

接着测试对应的程序是否可以正常执行,如java --version。在Mac上会报错如下:

is damaged and can’t be opened.

所以需要执行下面语句:

$ sudo xattr -r -d com.apple.quarantine /Users/larry/Software/graalvm-ce-java11-22.3.0

注意修改对应的目录。

然后就可以执行了:

$ ./java --version
openjdk 11.0.17 2022-10-18
OpenJDK Runtime Environment GraalVM CE 22.3.0 (build 11.0.17+8-jvmci-22.3-b08)
OpenJDK 64-Bit Server VM GraalVM CE 22.3.0 (build 11.0.17+8-jvmci-22.3-b08, mixed mode, sharing)

安装native-image

这个工具用来把Java程序转化为本地二进制包,安装如下:

$ ./gu install native-image
Downloading: Component catalog from www.graalvm.org
Processing Component: Native Image
Downloading: Component native-image: Native Image from github.com
Installing new component: Native Image (org.graalvm.native-image, version 22.3.0)

配置环境

配置环境变量

因为这个GraalVM还不够成熟,我不想一直使用,就通过一个命令来切换,配置如下:

export GraalVM_HOME=/Users/larry/Software/graalvm-ce-java11-22.3.0/Contents/Home
alias switchOnGraalVM='export PATH=$GraalVM_HOME:$PATH'
alias switchOnGraalVMJavaHome='export JAVA_HOME=/Users/larry/Software/graalvm-ce-java11-22.3.0/Contents/Home'

alias switchOffGraalVM='export PATH=`echo $PATH | tr ":" "\n" | grep -v "graalvm" | tr "\n" ":"`'
alias switchOffGraalVMJavaHome='export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_212.jdk/Contents/Home'

配置IDEA

可以在IDEA上配置对应的JDK,这样开发的时候可以使用:

整合Spring Native与Spring Boot

普通Spring Boot程序

新来创建一个普通的Spring Boot Web程序,主要Java代码如下:

@SpringBootApplication
@RestController
@RequestMapping("/")
public class SpringbootNativeGraalVMMain {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootNativeGraalVMMain.class, args);
    }

    @GetMapping("/hi-graalvm")
    public String hi() {
        return "This message is from Spring Boot built/run by GraalVM/Spring Native";
    }
}

启动时长为1.193秒,还不错。我电脑还不错。

整合Spring Native

添加依赖:

<dependency>
  <groupId>org.springframework.experimental</groupId>
  <artifactId>spring-native</artifactId>
  <version>${spring-native.version}</version>
</dependency>

添加插件,这个插件非常重要,不然会有各种错误:

<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.experimental</groupId>
      <artifactId>spring-aot-maven-plugin</artifactId>
      <version>0.11.5</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</id>
    <properties>
      <repackage.classifier>exec</repackage.classifier>
      <native-buildtools.version>0.9.11</native-buildtools.version>
    </properties>
    <dependencies>
      <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <scope>test</scope>
      </dependency>
    </dependencies>
    <build>
      <plugins>
        <plugin>
          <groupId>org.graalvm.buildtools</groupId>
          <artifactId>native-maven-plugin</artifactId>
          <version>${native-buildtools.version}</version>
          <extensions>true</extensions>
          <executions>
            <execution>
              <id>test-native</id>
              <phase>test</phase>
              <goals>
                <goal>test</goal>
              </goals>
            </execution>
            <execution>
              <id>build-native</id>
              <phase>package</phase>
              <goals>
                <goal>build</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

然后通过以下命令来build包,时间会长很多,因为要转化为二进制可执行文件:

$ mvn clean package -Pnative

两分多钟后完成,生成了一个可执行文件,执行如下:

$ target/spring-boot-native-graalvm

结果只花了0.066秒,即66毫秒就可以了,这也太快了吧。

访问接口也是正常的:

用Docker启动

先启动本地的Docker,然后添加依赖如下:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <classifier>${repackage.classifier}</classifier>
    <image>
      <builder>paketobuildpacks/builder:tiny</builder>
      <env>
        <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
      </env>
    </image>
  </configuration>
</plugin>

通过以下命令打出Docker镜像:

mvn spring-boot:build-image

可能会花费很长时间,需要下载一些工具与镜像。

打包成功后,多了镜像:

$ docker images | grep graalvm
spring-boot-native-graalvm                               1.0-SNAPSHOT                                     d2c8d5c52a3c        42 years ago        85.8MB 

启动如下:

$ docker run --rm spring-boot-native-graalvm:1.0-SNAPSHOT -p 8080:8080

启动时间为59ms,更短了。

注意

  • 直接通过native-image命令来将jar包转化为可执行文件,如遇到各种问题,劝大家放弃尝试,这也是Spring Native存在的价值。别问我为什么知道,哈哈~~
  • 要注意切换对应的Java程序和Java Home,不然build包会报错。
  • 看Spring Native的包名是experimental的,离生产应该还有距离,不要轻易在生产上用。

代码

代码请看GitHub: https://github.com/LarryDpk/pkslow-samples


References:

Quick Start Guide

GraalVM Quick Reference

GraalVM Native Image Quick Reference v1

向云原生靠近 | 体验 GraalVM 静态编译字节码,尝试 “超声波 Java” - Quarkus

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

7-2输入/输出系统-I/O方式

文章目录一.程序查询方式二.程序中断方式三.DMA方式1.传送过程2.DMA控制器&#xff08;DMAC&#xff09;的内部结构3.DMA传送方式&#xff08;1&#xff09;停止CPU访问主存&#xff08;2&#xff09;DMA与CPU交替访存&#xff08;3&#xff09;周期挪用/周期窃取4.DMA方式的特…

基于改进粒子群算法的混合储能系统容量优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

css特性(继承、层叠、优先级)

1、继承性 特性: 子元素有默认继承父元素样式的特点(子承父业) 可以继承的常见属性(文字控制属性都可以继承) colorfont-style、 font-weight、 font-size、 font-familytext-indent、text-align、line-height … 注意点: 控制字的都能继承 可以通过调试工具判断样式是否可以…

应用系统基于CAS实现单点登录的解决方案

单点登录 (SingleSign-On&#xff0c;SSO) &#xff0c;是一种帮助用户快捷访问网络中多个站点的安全通信技术。单点登录系统基于一种安全的通信协议&#xff0c;该协议通过多个系统之间的用户身份信息的交换来实现单点登录。使用单点登录系统时&#xff0c;用户只需要登录一次…

JAVA的PDF Viewer:Big Faceless PDF Viewer Crack

PDF Viewer是一个可以显示PDF文档的Swing组件。针对不需要完整 API 的客户&#xff0c;Viewer 可以作为 Applet、应用程序或通过 Java Web Start 安装&#xff0c;或嵌入到 Swing 应用程序中。 产品概览 打印、保存、文本搜索、表单、数字签名和注释是众多可用功能中的一部分 -…

IB 课程的挑战(二)

以下我想换个角度用自身的经历以及多年来教学的经验去分享修读 IB课程的挑战。 &#xff08;一&#xff09;必修文学科2022尽管我于会考中文获得「A」级成绩&#xff0c;但面对IB课程的中国文学 (IB Chinese A Literature)时&#xff0c;却仍感到十分吃力。我之前从未接触过中国…

网络IO模型

1 介绍一提到网络IO&#xff0c;甚至一些网络框架&#xff0c;就无法避免遇到阻塞、非阻塞、同步、异步的概念&#xff0c;要理解这些概念&#xff0c;先要清楚网络IO是什么&#xff0c;以及网络IO如何工作。网络IO本质上也是IO的一种&#xff0c;就是数据的输入输出&#xff0…

护网行动(防守方)linux服务器通用安全加固指南(1)

实验所属系列&#xff1a;Linux服务器搭建/Linux服务安全 Linux 是一个开放式系统&#xff0c;可以在网络上找到许多现成的程序和工具&#xff0c;这既方便了用户&#xff0c;也方便了黑客&#xff0c;因为他们也能很容易地找到程序和工具来潜入 Linux 系统&#xff0c;或者盗…

CnOpenData中国观鸟记录数据

一、数据简介 观鸟&#xff0c;是指在自然环境中利用望远镜等观测记录设备在不影响野生鸟类正常生活的前提下观察鸟类的一种科学性质的户外活动。 鸟类&#xff0c;是生物多样性中最具指示性的类群。由全国各地观鸟爱好者们共同记录的观鸟信息&#xff0c;能够展示中国各地区的…

cesium +vue3 +vite 实现点线面功能

第一步&#xff1a;搭建vue3项目 1、npm在相应文件夹下创建 npm create vitelatest2、选择项目名称 3、选择vue 4、选择是否使用typescript 或者JavaScript 5、记得在终端npm install一下就可以启动项目了 第二步&#xff1a;引入cesiumJS 1、npm引入 npm i cesium vite…

海康Visionmaster-VM2D,VM3D,VM深度学习对电脑配置要求

为确保VM算法平台能正常安装及运行&#xff0c;对PC配置有所要求。 第一&#xff1a;推荐配置&#xff1a; 操作系统&#xff1a;Windows7/10&#xff08;64位中文操作系统&#xff09; CPU&#xff1a;Intel Core i7-6700 3.4GHz 或以上&#xff08;如需使用CPU相关深度学习…

32岁面试字节软件测试岗,想不到居然这么简单......

前段时间有个在小公司干了七八年的朋友离职了&#xff0c;想要拼一拼大厂&#xff0c;于是他选择了字节跳动。面试总共花费了 20 天左右&#xff0c;包含了 4 轮电话面试、1 轮笔试、1 轮主管视频面试、1 轮hr视频面试。 据他了解到的信息&#xff0c;其实去字节面试的人很多&…

爬虫(一)爬虫基本概念

爬虫概念网络爬虫 (网页蜘蛛, 网络机器人)爬虫就是模拟客户端发送网络请求, 接受请求对应的响应, 一种按照一定的规则,自动地抓取互联网信息的程序。理论上来说, 只要是用户通过客户端(浏览器)能够做到事情, 爬虫都能够去做。爬虫: 模拟客户端访问, 抓取数据。反爬: 保护重要数…

3、边界值分析

如何选定边界值 很难提供一份如何进行边界值分析的“详细说明”&#xff0c;因为这种方法需要一定程度的创造性&#xff0c;以及对问题采取一定程度的特殊处理办法。 但是可以提供一些通用指南&#xff1a; 如果输入条件规定了一个输入值范围&#xff0c;那么应针对范围的边…

WY49 数对

【答案解析】&#xff1a; 暴力破解&#xff1a;将 x 和 y 分别遍历 [1, n] &#xff0c;进行判断当 x % y > k 时统计计数 count 即可,但是这样的话当 n 的值非常大 的时候循环次数将非常恐怖&#xff0c;需要循环 n^2 次。 更优解法&#xff1a; 假设输入 n10 , k3 &#…

QT/C++——对话框

一、标准对话框 #include "widget.h" #include <QVBoxLayout> #include <QHBoxLayout>Widget::Widget(QWidget *parent): QWidget(parent) {btcolor new QPushButton("setcolor");bterrm new QPushButton("errmsg");btfile new …

检索业务:构建结果数据与分析

明确返回的结果对象数据 结果对象 Data public class SearchResult {/*** 查到的所商品信息*/private List<SkuEsModel> products;private Integer pageNum;//当前页面private Long total;//总记录数private Integer totalPages;//总页码private List<CatalogVo&g…

linux安装python3.10.9

Linux系统安装python3.10.9Linux系统安装python3.10.9查看系统自带python信息python官网下载安装包解压安装包上传安装包到服务器解压安装包进入解压后的目录安装python使用的依赖安装python使用的依赖完成编译安装python设置软连接设置python软连接设置pip软连接配置环境变量使…

【Linux】线程概念 | 同步

除了线程互斥&#xff0c;我们还有线程同步&#xff0c;来康康吧 文章目录1.为什么需要同步2.生产消费模型2.1 生产者和消费者的关系2.2 以简单代码为例2.3 并发3.条件变量接口3.1 init/destroy3.2 pthread_cond_wait3.3 pthrea_cond_signal/broadcast3.4 代码示例3.4.1 小bug3…

Python数据可视化(三)绘制统计图形大全

3.1 柱状图以 Python 代码的形式讲解柱状图的绘制原理&#xff0c;这里重点讲解 bar()函数的使用方法。代码&#xff1a;import matplotlib as mpl import matplotlib.pyplot as plt mpl.rcParams["font.sans-serif"]["SimHei"] mpl.rcParams["axes.u…