溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

spring-native的介紹及應(yīng)用

發(fā)布時(shí)間:2021-06-23 14:36:40 來源:億速云 閱讀:2745 作者:chen 欄目:編程語言

本篇內(nèi)容主要講解“spring-native的介紹及應(yīng)用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“spring-native的介紹及應(yīng)用”吧!

<謹(jǐn)供參考>

  • 官方介紹

Spring Native提供了使用GraalVM 本機(jī)圖像編譯器將Spring應(yīng)用程序編譯為本機(jī)可執(zhí)行文件的支持。
與Java虛擬機(jī)相比,本機(jī)映像可以為許多類型的工作負(fù)載提供更便宜,更可持續(xù)的托管。這些包括微服務(wù),功能工作負(fù)載,非常適合容器和Kubernetes
使用本機(jī)映像具有關(guān)鍵優(yōu)勢(shì),例如即時(shí)啟動(dòng),即時(shí)峰值性能和減少的內(nèi)存消耗。
GraalVM本機(jī)項(xiàng)目希望隨著時(shí)間的推移會(huì)改善一些缺點(diǎn)和折衷方案。構(gòu)建本機(jī)映像是一個(gè)繁重的過程,比常規(guī)應(yīng)用程序要慢。預(yù)熱后,本機(jī)映像具有較少的運(yùn)行時(shí)優(yōu)化。最后,它比具有某些不同行為的JVM還不成熟。
常規(guī)JVM和此本機(jī)映像平臺(tái)之間的主要區(qū)別是:
	- 在構(gòu)建時(shí)將未使用的零件刪除。
	- 反射,資源和動(dòng)態(tài)代理需要配置。
	- 類路徑在構(gòu)建時(shí)是固定的。
	- 沒有類延遲加載:可執(zhí)行文件中附帶的所有內(nèi)容都將在啟動(dòng)時(shí)加載到內(nèi)存中。
	- 一些代碼將在構(gòu)建時(shí)運(yùn)行。
	- 圍繞Java應(yīng)用程序的某些方面存在一些局限性,這些局限性未得到完全支持。

簡(jiǎn)單來說,就是更快.更短,更小

  • 更快的啟動(dòng)速度

  • 更短的響應(yīng)時(shí)間

  • 更小的內(nèi)存消耗

十分適用于目前互聯(lián)網(wǎng)環(huán)境的快捷開發(fā)和微服務(wù)架構(gòu)的項(xiàng)目

而Spring Native的基礎(chǔ)則是Graalvm,一個(gè)由oracle開發(fā)維護(hù)的多語言編譯/運(yùn)行時(shí)平臺(tái). 它的官方說法是高性能JDK發(fā)行版,目前已支持到7種語言,包括不僅限于java.ruby.node等 基于graalvm開發(fā)的java框架還有一個(gè)國(guó)內(nèi)目前還不算太火的Quarkus,在一些油管up的測(cè)評(píng)視頻中,證明quarkus(1.13)要比spring native(0.7x)更快更小,我也寫了quarkus快一年了,即使拋棄graalvm本身,也確實(shí)比springboot要更快,更短

我用的是0.92,僅支持springboot2.4.5 還有,機(jī)器的內(nèi)存最好備到8個(gè)G,因?yàn)槲覝y(cè)試時(shí)候memory in use一度飆升到5個(gè)多G,這可能也是graalvm為了更快產(chǎn)生的代價(jià)把

  • 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編譯過程中會(huì)有些許問題,這個(gè)參數(shù)僅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>
  • 測(cè)試Controller

/**
 * 小五
 */
[@RestController](https://my.oschina.net/u/4486326)
public class TestController {

    @GetMapping("/")
    public String test() {
        return "TestController";
    }
}

linux環(huán)境下安裝各種環(huán)境(windows需要安裝各種c的運(yùn)行庫,安完還是缺...linux和mac要好很多)

  • graalvm

使用SDKMan安裝適當(dāng)?shù)腟DK和GraalVM插件,SDKMan是Java SDK管理工具,可讓輕松安裝和配置GraalVM所需的依賴項(xiàng)(截至當(dāng)日,支持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提供了兩種構(gòu)建方式

  1. 將Spring Native應(yīng)用程序構(gòu)建到Docker映像中

運(yùn)行以下命令以構(gòu)建Docker映像文件,并將編譯后的代碼包裝在構(gòu)建包中。
mvn spring-boot:build-image
使用Docker運(yùn)行映像:
docker run -p 8080:8080 docker.io/xxx
  1. 將Spring Native應(yīng)用程序構(gòu)建到可執(zhí)行文件中

運(yùn)行以下命令編譯Spring Boot應(yīng)用程序的本機(jī)二進(jìn)制可執(zhí)行文件:
mvn clean -Pnative-image package
通過運(yùn)行以下命令來執(zhí)行本機(jī)應(yīng)用程序:
target/spring-native-example
  • 這里我用是第二種方式

spring-native的介紹及應(yīng)用

速度可以說是相當(dāng)快了
接下來給他做成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

spring-native的介紹及應(yīng)用

再貼兩張youtube上某up做的對(duì)比圖

spring-native的介紹及應(yīng)用

項(xiàng)目?jī)H加了一個(gè)webflux
前者是native的,后者是非native的,
可以看到size是有明顯縮小的

spring-native的介紹及應(yīng)用

上圖的啟動(dòng)時(shí)間是3秒
下圖可以看到0.1秒多,spring native官方介紹過,正常的一般啟動(dòng)都不會(huì)超過100毫秒,可以看出啟動(dòng)時(shí)間上的差距是巨大的
右面是兩者的cpu消耗,io占用等信息,也能看出兩者有著明顯的差距

到此,相信大家對(duì)“spring-native的介紹及應(yīng)用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI