本篇内容主要讲解“spring-native的介绍及应用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring-native的介绍及应用”吧!
<谨供参考>
官方介绍
Spring Native提供了使用GraalVM 本机图像编译器将Spring应用程序编译为本机可执行文件的支持。
与Java虚拟机相比,本机映像可以为许多类型的工作负载提供更便宜,更可持续的托管。这些包括微服务,功能工作负载,非常适合容器和Kubernetes
使用本机映像具有关键优势,例如即时启动,即时峰值性能和减少的内存消耗。
GraalVM本机项目希望随着时间的推移会改善一些缺点和折衷方案。构建本机映像是一个繁重的过程,比常规应用程序要慢。预热后,本机映像具有较少的运行时优化。最后,它比具有某些不同行为的JVM还不成熟。
常规JVM和此本机映像平台之间的主要区别是:
- 在构建时将未使用的零件删除。
- 反射,资源和动态代理需要配置。
- 类路径在构建时是固定的。
- 没有类延迟加载:可执行文件中附带的所有内容都将在启动时加载到内存中。
- 一些代码将在构建时运行。
- 围绕Java应用程序的某些方面存在一些局限性,这些局限性未得到完全支持。
简单来说,就是更快.更短,更小
更快的启动速度
更短的响应时间
更小的内存消耗
十分适用于目前互联网环境的快捷开发和微服务架构的项目
而Spring Native的基础则是Graalvm,一个由oracle开发维护的多语言编译/运行时平台. 它的官方说法是高性能JDK发行版
,目前已支持到7种语言,包括不仅限于java.ruby.node等 基于graalvm开发的java框架还有一个国内目前还不算太火的Quarkus,在一些油管up的测评视频中,证明quarkus(1.13)要比spring native(0.7x)更快更小,我也写了quarkus快一年了,即使抛弃graalvm本身,也确实比springboot要更快,更短
我用的是0.92,仅支持springboot2.4.5 还有,机器的内存最好备到8个G,因为我测试时候memory in use一度飙升到5个多G,这可能也是graalvm为了更快产生的代价把
pom
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.xiaowu</groupId>
<artifactId>behappy-springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>behappy-springboot</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-native.version>0.9.2</spring-native.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-native</artifactId>
<version>${spring-native.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
<image>
<builder>paketobuildpacks/builder:tiny</builder>
<env>
<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
</env>
</image>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.experimental</groupId>
<artifactId>spring-aot-maven-plugin</artifactId>
<version>${spring-native.version}</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-image</id>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.nativeimage</groupId>
<artifactId>native-image-maven-plugin</artifactId>
<version>21.0.0.2</version>
<configuration>
<!-- The native image build needs to know the entry point to your application -->
<mainClass>org.xiaowu.behappy.BehappySpringbootApplication</mainClass>
<!--https://blog.csdn.net/u013794093/article/details/100094871?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.baidujs&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.baidujs-->
<buildArgs>
<!--https://blog.csdn.net/thomasyuang/article/details/84318184-->
<arg>--static</arg><!--解决standard_init_linux.go:178: exec user process caused "no such file or directory"-->
<!--<arg>libc=musl</arg>gcc编译过程中会有些许问题,这个参数仅jdk11支持-->
</buildArgs>
</configuration>
<executions>
<execution>
<goals>
<goal>native-image</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<repositories>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/release</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/release</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
测试Controller
/**
* 小五
*/
[@RestController](https://my.oschina.net/u/4486326)
public class TestController {
@GetMapping("/")
public String test() {
return "TestController";
}
}
linux环境下安装各种环境(windows需要安装各种c的运行库,安完还是缺...linux和mac要好很多)
graalvm
使用SDKMan安装适当的SDK和GraalVM插件,SDKMan是Java SDK管理工具,可让轻松安装和配置GraalVM所需的依赖项(截至当日,支持8和11)
curl -s "https://get.sdkman.io" | bash
sdk install java 21.0.0.r8-grl
sdk use java 21.0.0.r8-grl
gu install native-image
gcc,unzip,zip,glibc-static,zlib
yum install -y glibc-static zlib zlib-devel zip unzip
sudo yum group install "Development Tools"
该命令安装了一堆新的软件包,包括gcc,g++和make。
gcc --version
然后spring native提供了两种构建方式
将Spring Native应用程序构建到Docker映像中
运行以下命令以构建Docker映像文件,并将编译后的代码包装在构建包中。 mvn spring-boot:build-image 使用Docker运行映像: docker run -p 8080:8080 docker.io/xxx
将Spring Native应用程序构建到可执行文件中
运行以下命令编译Spring Boot应用程序的本机二进制可执行文件:
mvn clean -Pnative-image package
通过运行以下命令来执行本机应用程序:
target/spring-native-example
这里我用是第二种方式
速度可以说是相当快了 接下来给他做成docker容器再看下
FROM scratch
COPY target/org.xiaowu.behappy.behappyspringbootapplication /app
ENTRYPOINT ["/app"]
docker build -f Dockerfile -t behappy:1.0 .
docker run -p 8080:8080 --name springnative -d behappy:1.0
再贴两张youtube上某up做的对比图
项目仅加了一个webflux
前者是native的,后者是非native的,
可以看到size是有明显缩小的
上图的启动时间是3秒
下图可以看到0.1秒多,spring native官方介绍过,正常的一般启动都不会超过100毫秒,可以看出启动时间上的差距是巨大的
右面是两者的cpu消耗,io占用等信息,也能看出两者有着明显的差距
到此,相信大家对“spring-native的介绍及应用”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/wangxiaowu/blog/5050377