代码编织梦想

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 原生应用程序有两种主要方法:

  1. 使用Spring Boot Buildpacks 支持生成包含本机可执行文件的轻量级容器。
  2. 使用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(graalvm-ce-java11-windows-amd64)

  官方下载地址:Graal VM
在这里插入图片描述
在这里插入图片描述

配置环境变量

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
  检验是否安装成功
在这里插入图片描述

安装native-image

  打开新的cmd,输入以下命令,等待安装

gu install native-image

安装 Docker Desktop for Windows

  具体步骤略,按照官方文档操作即可:https://docs.docker.com/desktop/windows/install/

创建Springboot项目

在这里插入图片描述
在这里插入图片描述

  完整的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.7.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>spring-native</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>spring-native</name>
	<description>spring-native</description>
	<properties>
		<java.version>11</java.version>
		<repackage.classifier/>
		<spring-native.version>0.12.1</spring-native.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</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>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
					<classifier>${repackage.classifier}</classifier>
					<image>
						<builder>paketobuildpacks/builder:tiny</builder>
						<env>
							<BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
							<BPE_DELIM_JAVA_TOOL_OPTIONS xml:space="preserve"> </BPE_DELIM_JAVA_TOOL_OPTIONS>
							<BPE_APPEND_JAVA_TOOL_OPTIONS>-Xms128m</BPE_APPEND_JAVA_TOOL_OPTIONS>
							<BPE_APPEND_JAVA_TOOL_OPTIONS>-Xmx128m</BPE_APPEND_JAVA_TOOL_OPTIONS>
							<BPE_APPEND_JAVA_TOOL_OPTIONS>-Xss256k</BPE_APPEND_JAVA_TOOL_OPTIONS>
							<BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:ParallelGCThreads=2</BPE_APPEND_JAVA_TOOL_OPTIONS>
							<BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:+PrintGCDetails</BPE_APPEND_JAVA_TOOL_OPTIONS>
						</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>
	<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>

  本文介绍的是Spring Native0.12.1版本,其对应的Spring Boot版本必须是2.7.4,以上只是一个最基本的配置案例,实际开发中还需要在spring-boot-maven-plugin插件的configuration标签下配置其他许许多多的参数。
  例如docker远程的地址和证书的路径、jvm调优参数、配置文件指定、docker镜像名端口仓库地址等等,最好的方法就是看spring-boot-maven-plugin的官方文档,这里以配置jvm参数为例
在这里插入图片描述
  配置官方文档
  为了测试我这里配置Springboot项目端口为8888,并且添加了一个获取当前日期的API。
在这里插入图片描述
在这里插入图片描述

执行maven命令

mvn clean
mvn '-Dmaven.test.skip=true' spring-boot:build-image

  下载完相关依赖后,电脑就会开始构建编译项目,查看任务管理器可以发现在构建和编译过程中CPU利用率很高,内存使用量也很高,根据电脑配置和网络状态不同使用的构建时间也不相同。
  构建成功如下图:
在这里插入图片描述

创建并运行容器

  查看所有镜像docker images
在这里插入图片描述
  spring-native就是构建的镜像
  创建并运行容器

docker run -id -p 8888:8888 --name=native-app spring-native:0.0.1-SNAPSHOT 59178df9f49b

  在Docker Desktop查看日志,发现应用成功启动,启动仅耗时31ms,果然印证了Spring Native启动是毫秒级别这句话。
在这里插入图片描述
  在Docker Desktop查看占用内存,仅46M左右。
在这里插入图片描述
  成功调用接口
在这里插入图片描述
  不使用Spring Native启动应用,使用java -jar来启动项目
在这里插入图片描述
在这里插入图片描述

  启动耗时1.5秒,占用内存高达238M。
  最后附上Spring Native官方文件:Spring Native

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35156196/article/details/127208514

springboot(十九):使用spring boot actuator监控应用_xxc1605629895的博客-爱代码爱编程_actuator/env

本文转自: 纯洁的微笑-ityouknow 微服务的特点决定了功能模块的部署是分布式的,大部分功能模块都是运行在不同的机器上,彼此通过服务调用进行交互,前后台的业务流会经过很多个微服务的处理和传递

使用tomcat启动SpringBoot项目-爱代码爱编程

springboot默认内嵌tomcat服务器,也默认使用main函数启动整个项目。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifact

springboot项目部署在服务器上-爱代码爱编程

springboot项目部署在服务器上及各种异常处理 0、搭建前说明 springboot+tomacat+mysqltomacat8.5 centos7 mysql5.7 JDK1.8 我tomcat安装位置 project/tomcat tomcat下四个个文件夹的内容需要关注logs 启动项目后项目的启动信息存储在Catalin

Spring Native Beta来了,原生更香!-爱代码爱编程

点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复“大礼包”有惊喜礼包! 每日英文 The moment you think about giving up,think of the reason why you held on so long.  每当你想放弃的时候,想一想是什么支撑着你一路坚持。 每日掏心话 即使生命柔弱

SpringBoot 项目启动内存占用过高-爱代码爱编程

一、问题描述 在使用SpringBoot 开发过程中,发现不管是本地还是测试环境只要一启动,动不动就占用1G内存,然而本地和测试环境的访问量却并没有多少,导致资源浪费; 二、解决方案(亲测可用) 2.1、启动命令示例(具体配置可根实际情况调整) nohup java -jar -XX:MetaspaceSize=128m -XX:MaxMetasp

【Springboot】内存占用过高解决-爱代码爱编程

一直以来,springboot启动后,明明什么都没有,却要占最少2个G。 经过调查,可以调整jvm参数 经过了一番调查,发现了就是加两个参数 Java –jar $jar_file –Xms512m –Xmx1024m 加完了,发现没有什么卵用,然后好多都是这么写的,根本不好使,直到一个大佬的出现 # 正确的Java命令: java [ option

使用Knative部署基于Spring Native的微服务-爱代码爱编程

在本文中,您将学习如何运行Spring Boot微服务,这些服务在Knative上相互通信。我还向您展示了如何使用GraalVM准备Spring Boot应用程序的本机映像。然后我们将使用Skaffold和jibmaven插件在Kubernetes上运行它。 在Knative上,您可以运行任何类型的应用程序,而不仅仅是函数。在本文中,当我编写“微服务”时

Spring Native 0.11.1入门体验-爱代码爱编程

文章目录 前言Spring Native是什么实战1 安装Graal VM(graalvm-ce-java11-windows-amd64)2 配置环境变量3 安装native-image4 安装 Desktop for Windows5 配置pom.xml6 执行maven命令7 创建并运行容器 前言 最近用Spring Alibaba做了

使用Spring Boot和GraalVM在Knative上构建微服务-爱代码爱编程

在本文中,您将学习如何在 Knative 上运行相互通信的 Spring Boot 微服务 。我还将向您展示如何使用 GraalVM 准备 Spring Boot 应用程序的本机映像。然后我们将使用 Skaffold 和 Jib Maven 插件在 Kubernetes 上运行它。 在 Knative 上,您可以运行任何类型的应用程序——不仅仅是一个函数

Spring Native Beta来了,原生更香-爱代码爱编程

Spring 团队日前发布了 Spring Native Beta 版。通过 Spring Native,Spring 应用将有机会与 GraalVM 原生镜像的方式运行。为了更好地支持原生运行,Spring Native 提供了 Maven 和 Gradle 插件,并且提供了优化原生配置的注解。 最近,Spring 发布了 Spring Native

借助 spring boot 和 graalvm 实现原生 java_javamonsterr的博客-爱代码爱编程

Java 在主导着企业级应用。但是在云中,采用 Java 的成本要比其竞争者更高。使用 GraalVM 进行原生编译降低了在云中 Java 的成本:它所创建的应用启动更快,使用的内存也更少。 原生编译为 Java 用户带来了很多的问题:原生 Java 会如何改变开发方式?我们在什么情况下该转向原生 Java?在什么情况下又该避免转向原生 Java?要使用

别再用 system.currenttimemillis 统计耗时了,太 low,试试 spring boot 源码在用的 stopwatch吧,够优雅_沉默王二的博客-爱代码爱编程

大家好,我是二哥呀! 昨天,一位球友问我能不能给他解释一下 @SpringBootApplication 注解是什么意思,还有 Spring Boot 的运行原理,于是我就带着他扒拉了一下这个注解的源码,还有 Spring

springcloud的简单使用_醉眼望云烟的博客-爱代码爱编程

目录 微服务是什么微服务的优缺点优点缺点 SpringCloud是什么 案例父工程构建API公共模块和公共EntityAPI模块pom文件实体类 部门微服务提供者模块pom文件yml

这样做优化,实现 0.059s 启动一个springboot项目!_肥肥技术宅的博客-爱代码爱编程

前言 最近自己用Spring Cloud Alibaba做了一个微服务架构的项目,部署的时候遇到了难题:内存不够。目前该项目有7个微服务,因为我只有一台阿里云的服务器(2C 4G),所以我只能把所有的微服务部署在一台服务器上,部署方式是使用docker制作springboot的fat jar镜像,每个微服务在不加任何JVM调优参数的情况下所占内存约500