您好,登錄后才能下訂單哦!
本篇內容主要講解“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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。