SpringBoot3之支持GraalVM介绍

devtools/2024/11/17 22:40:21/

 Spring Boot 3 对 GraalVM 原生镜像的支持是一个重要的更新,它标志着 Spring Boot 在追求更高性能和更小占用空间方面迈出了重要的一步。GraalVM 是一种高性能的运行时环境,它支持多种语言,并且可以生成原生镜像,这使得基于 JVM 的应用程序(如 Spring Boot 应用)可以在启动时间和内存消耗方面得到显著的改进。

目录

一、背景介绍

1、版本要求

2、集成方式

3、构建流程

4、性能优势

5、使用场景

二、GraalVM介绍

1、什么是GraalVM

2、出现背景

3、主要特性

1)多语言并行

2)高性能编译器

3)原生镜像

4)共享数据结构

5)高效的垃圾回收机制

4、使用场景

1)微服务架构

2)云原生应用

3)多语言应用 

5、安装与使用

三、代码示例

1、环境准备

1)GraalVM:

2)Maven 或 Gradle:

3)Native Image 工具:

2、创建 Spring Boot 项目

3、配置 Maven

4、构建原生镜像

5、运行原生镜像

6、注意事项

1)反射支持:

2)依赖兼容性:

3)配置代理:

四、总结


一、背景介绍

1、版本要求

  • Spring Boot 3.x 要求至少使用 Java 17,这是基于 GraalVM 原生镜像支持的最低 Java 版本要求。同时,Spring Boot 3.x 也已经通过了 Java 19 的测试,确保了更好的兼容性和性能。

2、集成方式

  • Spring Boot 3.x 通过与 GraalVM 紧密集成,允许开发者将 Spring 应用程序编译成原生可执行镜像。这一特性取代了之前的 Spring Native 项目,为开发者提供了更加直接和高效的方式来优化 Java 应用程序的性能。

3、构建流程

  • 构建 GraalVM 原生镜像的过程涉及从应用程序的主入口点静态分析应用程序代码。这种提前处理(Ahead-of-Time, AOT)编译方式确保了只有必要的代码被包含在最终的可执行文件中,从而减少了内存占用并提高了启动速度。
  • 在构建过程中,Spring Boot 3.x 会利用 Spring AOT(Ahead-of-Time)技术来生成 GraalVM 所需的额外资源,如反射提示、资源提示、序列化提示等。这些提示文件帮助 GraalVM 更好地理解和处理 Java 应用程序中的动态元素。

4、性能优势

  • GraalVM 原生镜像在启动速度和运行时性能上通常优于传统的 JVM 应用程序。这是因为它们不需要 JVM 的动态编译过程,而是直接执行预编译的本地机器码。
  • 此外,由于原生镜像的内存占用更小,它们更适合在资源受限的环境中运行,如容器化部署和边缘计算场景。

5、使用场景

  • GraalVM 原生镜像非常适合用于需要快速启动和低内存占用的应用程序,如微服务、API 网关、边缘计算应用等。
  • 它们也特别适合与容器化技术(如 Docker)和云原生平台(如 Kubernetes)结合使用,以实现更高效的应用程序部署和管理。

二、GraalVM介绍

1、什么是GraalVM

GraalVM 是一个高性能的虚拟机项目,由 Oracle 开发并维护。它的设计目标是成为跨语言的通用平台,支持多种编程语言,并且提供了先进的编译技术和工具链。GraalVM 支持的语言包括但不限于 Java、JavaScript、Python、Ruby、R 和 LLVM 汇编语言等。

2、出现背景

GraalVM 的出现是为了应对现代应用开发中的一些挑战,如多语言支持、高性能需求以及云原生应用的需求。传统上,不同的编程语言有不同的虚拟机(如 JVM 用于 Java,V8 用于 JavaScript),这导致了不同的生态系统之间缺乏互操作性。GraalVM 致力于创建一个统一的平台,允许不同语言之间的无缝交互。

3、主要特性

1)多语言并行

GraalVM 的特点就是它可以作为多种语言的运行时。通过使用 GraalVM,开发者可以编写混合语言的应用程序,并在一个虚拟机中运行它们。这意味着可以利用各种语言的最佳实践和技术,同时享受单一运行时环境带来的便利。

2)高性能编译器

GraalVM 包含了一个高性能的即时编译器(JIT Compiler),它可以在运行时优化代码执行。此外,GraalVM 还支持提前编译(Ahead-of-Time Compilation, AOT),这允许开发者在部署前将应用程序编译成本地机器代码。AOT 编译可以提高应用程序的启动速度,并减少运行时的内存占用。

3)原生镜像

原生镜像技术是 GraalVM 的一大亮点。通过使用 native-image 工具,开发者可以将应用程序及其依赖项编译成一个单独的二进制文件。这样的二进制文件可以直接在目标平台上运行,而无需 JVM。这不仅提高了启动速度,还减少了内存占用,非常适合容器化和微服务架构。

4)共享数据结构

GraalVM 允许不同语言之间共享数据结构和类型系统。这意味着你可以从 Java 调用 Ruby 函数,或者从 JavaScript 调用 Python 函数,而无需复杂的桥接机制。

5)高效的垃圾回收机制

GraalVM 提供了一种高效的垃圾回收机制,旨在减少暂停时间和提高整体性能。它采用了分代收集算法,并且可以根据应用程序的具体需求进行调整。

4、使用场景

GraalVM 特别适合那些要求高性能、低延迟以及快速启动的应用场景。典型的应用场景包括:

1)微服务架构

由于原生镜像的特性,GraalVM 可以用来构建轻量级的服务,非常适合在 Kubernetes 等容器编排环境中部署。

2)云原生应用

在云环境中,快速启动和小内存足迹对于节省资源非常重要。

3)多语言应用 

如果你的应用程序需要支持多种编程语言,GraalVM 可以提供一个统一的运行时环境。

5、安装与使用

GraalVM 通常需要从官方网站下载相应的版本,然后按照提供的说明进行安装。安装完成后,你可以使用 GraalVM 的命令行工具来构建和运行你的应用程序。

三、代码示例

1、环境准备

1)GraalVM:

可以从 GraalVM 官网 (GraalVM)下载并安装。

2)Maven 或 Gradle:

用于构建项目。

3)Native Image 工具:

GraalVM 自带的工具,用于编译原生镜像。

2、创建 Spring Boot 项目

首先,创建一个新的 Spring Boot 项目。你可以使用 Spring Initializr 快速生成一个基本的项目结构。这里我们创建一个简单的 Web 应用程序:

java">package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}@RestController
class HelloController {@GetMapping("/hello")public String hello() {return "Hello, World!";}
}

3、配置 Maven

为了能够构建原生镜像,你需要在项目的 pom.xml 文件中添加 Spring Boot Maven 插件,并配置 spring-boot-maven-plugin 来支持原生镜像构建。

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>demo</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.0</version><relativePath/> <!-- lookup parent from repository --></parent><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><native>true</native></configuration><executions><execution><goals><goal>native</goal></goals></execution></executions></plugin></plugins></build>
</project>

4、构建原生镜像

一旦你配置好了 Maven 插件,就可以通过执行以下命令来构建原生镜像:

mvn clean package spring-boot:native

这将会触发 Maven 构建过程,并使用 spring-boot-maven-pluginnative 目标来生成原生镜像。构建完成后,你可以在 target 目录下找到生成的原生可执行文件。

5、运行原生镜像

构建完成后,你可以直接运行生成的原生可执行文件:

./target/demo

这将启动你的 Spring Boot 应用,并且你应该能够在浏览器中通过访问 http://localhost:8080/hello 来看到输出的 "Hello, World!"。

6、注意事项

1)反射支持:

由于原生镜像的限制,反射操作在原生模式下可能不会工作。Spring Boot 3.x 已经对此做了改进,但在使用反射的地方,可能需要特别注意。


2)依赖兼容性:

并非所有的库都支持原生镜像构建。确保你使用的库是兼容的,或者使用 --enable-preview 来启用预览特性。


3)配置代理:

如果你的应用程序使用了 AOP 代理,那么需要确保使用正确的代理模式。例如,可以通过 spring.aot.proxy-target 属性来指定。

四、总结

Spring Boot 3 引入了对 GraalVM 原生镜像的支持,显著提升性能和减少占用空间。GraalVM 是高性能多语言运行时,可生成原生镜像,优化 Spring Boot 应用的启动时间和内存消耗。Spring Boot 3 要求 Java 17+,通过 AOT 编译技术减少最终可执行文件大小。GraalVM 原生镜像适合微服务、云原生应用,特别在容器和边缘计算中表现优异。配置 Maven 插件可轻松构建原生镜像,但需注意反射支持、依赖兼容性和代理配置。


http://www.ppmy.cn/devtools/104927.html

相关文章

小程序中使用page-container来做弹窗

<page-container></page-container>&#xff1a;小程序自带弹窗组件&#xff1b; 值描述show是否显示容器组件&#xff1b;overlay是否显示遮罩层&#xff1b;position弹出位置&#xff0c;可选值为 top bottom right center&#xff1b;round是否显示圆角

FactoryBean 实战练习 - 注入自定义 Date

java.util.Date在Spring中被当做简单类型&#xff0c;简单类型在注入的时候可以直接使用value属性或value标签来完成。但是对于Date类型来说&#xff0c;采用value属性或value标签赋值的时候&#xff0c;对日期字符串的格式要求非常严格&#xff0c;必须是这种格式的&#xff1…

Linux创建sysfs属性节点 - DEVICE_ATTR宏、device_create_file()、sysfs_create_group()

目录 简介&#xff1a; 一、DEVICE_ATTR介绍 1、DEVICE_ATTR宏 1.1 参数说明 1.2 调用方法 二、sysfs创建属性文件 1、创建一个sysfs属性文件 1.1 device_create_file()函数 1.2 device_create_file()实例 2、创建多个sysfs属性文件 2.1 sysfs_create_group()函数 2…

pda移动护理终端医用手持机

随着物联网技术的发展&#xff0c;智能设备之间形成了紧密的网络互联。 医疗行业越来越注重智能设备的使用&#xff0c;医用手持机可以采集病人、药品、材料等信息&#xff0c;很大程度地改善了医院患者的管理&#xff0c;进一步提升医护人员的工作效率。 医护人员通过使用pda移…

易语言系列——日志系统

想给项目软件写一个日志系统,各个论坛找了半天,没找到合适的,自己写了个。 主要实现以下内容: 1.单线程和多线程日志写入 2.高速IO,保证大数据量下日志写入不卡顿 3.日志直接写入txt文件中,软件运行过程中可以打开和复制 4.自动删除过期的日志文件 5.每日的日志以时…

如何开Stand Up Meeting

最近在做公司的第一个SAP Rise项目&#xff0c;每周要和德国、波兰的用户和德国、奥地利、印度、中国的SAP顾问开2次半小时的Stand Up Meeting&#xff0c;参会人数有75人之多。 对于这样的会议&#xff0c;作为组织者要在第一次开会的时候就宣布开会的原则&#xff0c;只关注…

在Ubuntu24.04上安装多主多从的高可用Kubernetes节点

前言 因为镜像拉取失败&#xff0c;所以好多小伙伴说calico网络插件安装失败。之前写过CentOS7上安装多主节点的Kubernets集群&#xff0c;而CentOS7又停止维护了。所以借着在Ubuntu上安装多主的Kubernetes集群的机会&#xff0c;使用国内镜像安装calico网络插件。 视频教程地…

320mm*160mmP1.86超微小间距LED显示屏COB与GOB的工艺区别

随着科技的飞速发展&#xff0c;320mm*160mm P1.86超微小间距LED显示屏在COB与GOB技术之间的选择&#xff0c;不仅体现了对画质与性能的极致追求&#xff0c;更彰显了技术创新的无限可能。相较于GOB工艺&#xff0c;COB技术凭借其直接将LED芯片封装于PCB板上的独特优势&#xf…