【Spring云原生】Spring官宣,干掉原生JVM,推出 Spring Native!整体提升性能!Native镜像技术在Spring中的应用

 🎉🎉欢迎光临🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:从入门到入魔》 🚀

本专栏带你从Spring入门到入魔!

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net/

 

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

Spring 发布了 Spring Native 的 beta 版本,并在http://start.spring.io上运行它。

实际上,这意味着自Spring成立以来,除了Spring支持的常规Java虚拟机之外,我们还将添加Beta支持,以使用GraalVM将Spring应用程序编译到本机映像中,从而提供一种部署Spring应用程序的新方法。支持Java和Kotlin。

这些本机Spring应用程序可以部署为独立的可执行文件(无需安装JVM),并提供有趣的特性,包括几乎即时启动(通常<100ms),即时峰值性能和较低的内存消耗,但所需的构建时间和运行时优化次数少于JVM。

目录

原理

应用:

Spring Native的优势包括:

使用Spring Native

生成Native镜像:完成上述配置后,您可以使用以下命令生成Spring应用程序的Native镜像:

生成的Native镜像将位于target目录下。通过将Spring应用程序编译为Native镜像,可以提高应用程序的性能

优化

直接在编译时定义了MyClass类,避免了在运行时使用反射机制来加载类。

部署和交付优化

部署示例:

使用Docker进行部署示例代码:

使用Buildah进行部署示例代码:

与传统JVM调优的比较


  1. 引言
    Spring Native作为Spring框架的扩展,利用Native镜像技术实现了对Spring应用程序的编译优化,从而提升应用性能和启动速度。本文将介绍Spring Native的背景和动机,以及Native镜像技术的概念和原理。

  2. 原理

Native镜像技术是一种将Java应用程序编译成本地可执行文件的技术。它的原理是通过静态编译将整个Java应用程序及其依赖项转换为本地机器代码,从而实现更快的启动时间和较小的内存占用。

Spring Native的主要目标是通过将Spring应用程序编译为本地镜像,提供更快的启动时间、更低的内存消耗和更好的资源利用率。通过消除JVM启动和解释阶段的开销,Spring Native可以显著减少应用程序的启动时间,并减少内存占用。

应用:

Spring Native的优势包括:

  1. 更快的启动时间:通过将应用程序编译为本地镜像,减少了JVM启动和解释的时间,从而实现更快的应用程序启动。

  2. 较低的内存消耗:本地镜像消除了传统Java应用程序所需的JVM内存开销,减少了内存占用,提高了资源利用率。

  3. 更好的资源利用率:由于减少了内存消耗,Spring Native可以在有限的资源环境中更有效地运行,提供更好的可伸缩性和性能。

使用Spring Native

使用Spring Native扩展需要以下步骤:

  1. 安装GraalVM:首先,您需要安装GraalVM。您可以从GraalVM官方网站(https://www.graalvm.org)下载适合您操作系统的GraalVM发行版,并按照官方文档进行安装。

  2. 配置GraalVM:安装完成后,您需要将GraalVM设置为默认的JDK。您可以使用以下命令将GraalVM设置为默认JDK:

$ gu install native-image
$ export PATH=$PATH:/path/to/graalvm/bin

添加Spring Native依赖:在您的Spring项目中,您需要添加Spring Native的依赖。在您的项目的pom.xml文件中,添加以下依赖:

<dependency><groupId>org.springframework.experimental</groupId><artifactId>spring-graalvm-native</artifactId><version>0.10.3</version>
</dependency>

配置Spring Native:您需要配置Spring Native插件以指定要编译为Native镜像的类和功能。您可以在您的项目的pom.xml文件中添加以下配置:

<build><plugins><plugin><groupId>org.springframework.experimental</groupId><artifactId>spring-aot-maven-plugin</artifactId><version>0.10.3</version><executions><execution><goals><goal>generate</goal></goals></execution></executions></plugin></plugins>
</build>

生成Native镜像:完成上述配置后,您可以使用以下命令生成Spring应用程序的Native镜像:

$ mvn spring-aot:generate
$ mvn package -Pnative

生成的Native镜像将位于target目录下。通过将Spring应用程序编译为Native镜像,可以提高应用程序的性能

优化

  • 讨论替换动态特性和反射机制的方法
     

静态配置示例:在传统的使用Spring框架的应用程序中,通常使用XML配置文件或注解来配置Bean。这种静态配置的方式可以避免使用反射机制来实现动态的Bean实例化。

@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl(); // 明确地实例化Bean}
}

在上述示例中,通过在配置类中明确地实例化Bean,避免了使用反射机制。

明确的Bean实例化方式示例:在某些场景下,可以使用明确的实例化方式来代替反射机制。

public class MyFactory {public static MyService createMyService() {return new MyServiceImpl(); // 明确地实例化Bean}
}

在上述示例中,通过使用静态工厂方法来明确地实例化Bean,避免了使用反射机制。

替代动态特性的示例代码如下:

  1. 静态代理示例:静态代理是一种替代动态代理的方式,可以在编译时生成代理类,避免在运行时使用反射机制。
    public interface MyService {void doSomething();
    }public class MyServiceImpl implements MyService {@Overridepublic void doSomething() {// 实现具体的业务逻辑}
    }public class MyServiceProxy implements MyService {private MyService target;public MyServiceProxy(MyService target) {this.target = target;}@Overridepublic void doSomething() {// 在调用目标对象之前或之后,可以添加额外的逻辑// ...target.doSomething();// 在调用目标对象之前或之后,可以添加额外的逻辑// ...}
    }

  2. 编译时生成代码示例:在某些场景下,可以使用编译时生成代码的方式来替代动态加载类。
    public class MyClass {public void doSomething() {// 实现具体的业务逻辑}
    }

    直接在编译时定义了MyClass类,避免了在运行时使用反射机制来加载类。

部署和交付优化

  • Native镜像的部署可以直接使用常见的构建工具包括Docker和Buildah。
  • 使用构建好的Native镜像,可以在目标环境中进行部署和运行。这可以通过使用容器管理平台(如Docker Swarm或Kubernetes)来实现,也可以直接在本地或云环境中运行。

部署示例:

使用Docker进行部署示例代码:

# Dockerfile
FROM scratch
COPY my_app /my_app
CMD ["/my_app"]

上述示例已经有一个名为 my_app 的本地机器代码可执行文件。在构建镜像时,将可执行文件复制到镜像中并设置其作为容器的默认命令。

构建Docker镜像的命令如下(假设 Dockerfile 和可执行文件在同一目录下):

docker build -t my_app_image .

 运行Docker容器的命令如下:

docker run -d my_app_image

这将在后台运行名为 my_app_image 的容器,并执行 my_app 可执行文件。

使用Buildah进行部署示例代码:

# 构建本地镜像
buildah bud -t my_app_image .# 创建容器
container=$(buildah from my_app_image)# 将可执行文件复制到容器中
buildah copy $container my_app /my_app# 设置容器的默认命令
buildah config --cmd ["/my_app"] $container# 保存容器为镜像
buildah commit $container my_app_image# 运行镜像
podman run -d my_app_image

与传统JVM调优的比较

  1. 编译方式:传统JVM调优主要关注在运行时对JVM进行优化,包括调整垃圾回收器、调整堆内存大小、调整线程池参数等。而Spring Native则采用了提前编译的方式,将应用程序及其依赖项编译为本地机器代码,以提高性能和启动时间。

  2. 依赖项处理:在传统JVM调优中,依赖项通常以JAR文件的形式打包,并在运行时通过类加载器进行动态加载。而Spring Native会对依赖项进行静态分析和静态链接,将它们与应用程序一起编译为本地机器代码,减少了依赖项的加载和解析时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/720257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tomcat优化、nginx +tomcat 部署 (三)

在目前流行的互联网架构中&#xff0c;Tomcat在目前的网络编程中是举足轻重的&#xff0c;由于Tomcat的运行依赖于JVM&#xff0c;从虚拟机的角度把Tomcat的调整分为外部环境调优 JVM 和 Tomcat 自身调优两部分 Tomcat 是一个流行的开源 Java 服务器&#xff0c;用于托管 Java …

【Redis】实际应用 - 实战项目

文章目录 1. 项目构思2. 技术选型3. 实施步骤3.1 创建Spring Boot项目3.2 编写控制器3.3 编写Thymeleaf模板3.4 运行项目 4. 项目演示结语 在学习了Redis的基础知识后&#xff0c;为了更好地应用所学知识&#xff0c;我们将使用Java Spring框架构建一个小型实战项目。本篇博客将…

滤波和卷积的区别

本文主要介绍滤波和卷积的区别&#xff0c;以供读者能够理解该技术的定义、原理、应用。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;计算机杂记 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&…

C++函数的默认值参数介绍

C函数的默认值参数介绍 C中&#xff0c;可以为函数的参数设置默认值&#xff0c;这样当在函数调用中若不指定实际参数时&#xff0c;默认参数将传递给形参。默认值参数使得函数调用更加简洁方便&#xff0c;在某些情况下可以减少代码量。默认参数是在C11标准中引入。 C默认参…

java010 - Java面向对象基础

1、类和对象 1.1 什么是对象 万物皆对象&#xff0c;客观存在的事物皆为对象。 1.2 什么是面向对象 1.3 什么是类 类是对现实生活中一类具有共同属性和行为的事物抽象。 特点&#xff1a; 类是对象的数据类型类是具有相同属性和行为的一组对象的集合 1.4 什么是对象的属…

k8s 1.28.x node资源预留

当前NOde的配置 默认位置如下: vim /var/lib/kubelet/config.yaml #再最后添加如下&#xff0c;参加应该大家一看就明白什么意思&#xff0c;不做多解释了 #max-pods: 230 evictionHard:memory.available: 100Minodefs.available: 10%nodefs.inodesFree: 5% kubeReserved:cpu:…

【SpringBoot3】应用程序启动监听

一、监听应用启动的常见场景 应用启动监听在 Spring Boot 和其他框架中扮演着重要的角色。它们的主要作用是在应用启动或关闭时触发特定的操作或任务。 以下是一些常见的应用启动监听场景&#xff1a; 初始化操作&#xff1a;在应用启动时&#xff0c;你可能需要执行一些特定…

多多关键字API php java Python

多多关键字API接口广泛应用于商家进行市场分析、竞品分析、关键词优化等场景。商家可以通过分析关键词数据&#xff0c;了解用户需求&#xff0c;制定针对性的营销策略&#xff0c;提高产品的曝光率和转化率。 多多-item_seach-通过关键字搜索商品列表 公共参数 获取key和秘钥…

分布式和集群的区别?

分布式系统和集群是两种常见的计算机系统架构&#xff0c;它们在设计和功能上有一些区别。 分布式系统&#xff1a; 定义&#xff1a;分布式系统是由多台计算机组成的网络&#xff0c;这些计算机通过网络进行通信和协作&#xff0c;共同完成一个或多个共同目标的系统。这些计算…

rtt的io设备框架面向对象学习-电阻屏LCD设备

目录 1.8080通信的电阻屏LCD设备1.1 构造流程1.2 使用2.i2c和spi通信的电阻屏LCD 电阻屏LCD通信接口有支持I2c、SPI和8080通信接口的。 1.8080通信的电阻屏LCD设备 rtt没有实现的设备驱动框架层&#xff0c;那么是在驱动层直接实现的&#xff0c;以stm32f407-atk-explorer为例…

TCP的Keep-Alive检测机制 和 Nagle算法

TCP的Keep-Alive检测机制&#xff1a; TCP的Keep-Alive是一种用于检测连接是否仍然有效的机制。它通过在一段时间内没有数据传输时发送特殊的Keep-Alive探测报文&#xff0c;来判断连接是否仍然存活。这个机制通常在以下情况下使用&#xff1a; 长时间的空闲连接&#xff1a; …

centos7安装kafka、zookeeper

安装jdk 安装jdk8 安装zookeeper 在指定目录执行下载命令 我是在/newdisk/zookeeper目录下 wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz --no-check-certificate下载好后并解压 tar -zxvf apache-zookeeper-3.5…

前端添加压缩包内文件名称校验

1. tar包内文件名称校验 1. 读取tar包内所有的文件名称 export class TarReader {fileInfo: any[]buffer: string | ArrayBufferconstructor() {this.fileInfo []}readFile(file) {return new Promise(resolve > {const reader new FileReader()reader.onload event &g…

Kruskal算法

Kruskal算法&#xff1a;是求连通网的最小生成树的另一种方法。与Prim算法不同&#xff0c;它的时间复杂度为O&#xff08;eloge&#xff09;&#xff08;e为图中的边数&#xff09;&#xff0c;所以&#xff0c;适合于求边稀疏的网的最小生成树 时间复杂度&#xff1a;主要由…

Debezium发布历史165

原文地址&#xff1a; https://debezium.io/blog/2023/10/05/Debezium-JMX-signaling-and-notifications/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium signaling and notifications - Part 3: JMX …

【Maven】Maven 基础教程(四):搭建 Maven 私服 Nexus

《Maven 基础教程》系列&#xff0c;包含以下 4 篇文章&#xff1a; Maven 基础教程&#xff08;一&#xff09;&#xff1a;基础介绍、开发环境配置Maven 基础教程&#xff08;二&#xff09;&#xff1a;Maven 的使用Maven 基础教程&#xff08;三&#xff09;&#xff1a;b…

我的NPI项目之Android 安全系列 -- Keymaster到底是个什么

最近因为一直在调研独立secure element集成的工作&#xff0c;不巧的是目前使用的高通平台只有NFC-eSE的方案。高通目前也并不支持独立的eSE集成&#xff0c;codebase中并无相对应的代码。举个例子&#xff0c;目前使用的STM的一款eSE&#xff0c;但是这款eSE的开发STM还没有完…

HarmonyOS—HAP唯一性校验逻辑

HAP是应用安装的基本单位&#xff0c;在DevEco Studio工程目录中&#xff0c;一个HAP对应一个Module。应用打包时&#xff0c;每个Module生成一个.hap文件。 应用如果包含多个Module&#xff0c;在应用市场上架时&#xff0c;会将多个.hap文件打包成一个.app文件&#xff08;称…

matlab 提取分割位于多边形区域边缘内部或边缘上的点

[in,on] = inpolygon(xq,yq,xv,yv) xv 和 yv 为定义的多边形区域的,如xv = [1 4 4 1 1 ];yv = [1 1 4 4 1 ];注意最后一个数字与第一个重复,保证多边形闭合; xq 和 yq 为待查询的点in:在多边形内部和边缘的点序号on:仅在多边形边缘的点序号 提取分割方法: matrix=[xq yq…

ios端接口代码语言-身份证号实名认证ios端接口

身份证核验&#xff0c;其背后必须要有权威&#xff0c;真实的身份证信息数据库作为基础&#xff0c;如中安未来翔云OCR云平台&#xff08;www.netocr.com&#xff09;近期上线的身份证核验功能&#xff0c;就是与权威机构合作&#xff0c;拥有权威&#xff0c;真实的身份证信息…