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 原生应用程序有两种主要方法:
-
使用Spring Boot Buildpacks 支持生成包含本机可执行文件的轻量级容器。
-
使用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
官方下载地址:
https://www.graalvm.org/downloads/