本篇内容主要讲解“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的介绍及应用”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。