【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.rhkb.cn/news/268565.html

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

相关文章

大模型之SORA技术学习

文章目录 sora的技术原理文字生成视频过程sora的技术优势量大质优的视频预训练库算力多&#xff0c;采样步骤多&#xff0c;更精细。GPT解释力更强&#xff0c;提示词(Prompt&#xff09;表现更好 使用场景参考 Sora改变AI认知方式&#xff0c;开启走向【世界模拟器】的史诗级的…

Redis在中国火爆,为何MongoDB更受欢迎国外?

一、概念 Redis Redis&#xff08;Remote Dictionary Server&#xff09;是一个使用ANSI C编写的开源、支持网络、基于内存、分布式、可选持久性的键值对存储数据库。Redis是由Salvatore Sanfilippo于2009年启动开发的&#xff0c;首个版本于同年5月发布。 MongoDB MongoDB…

亿道信息发布两款升级款全加固笔记本电脑

2022年5月19日&#xff0c;加固手持终端。加固平板电脑、加固笔记本电脑专业设计商和制造商&#xff0c;以及加固型移动计算机软硬件整体定制解决方案提供商亿道信息&#xff0c;宣布对其两款广受欢迎的加固笔记本电脑产品EM-X14U和EM-X15U进行重大升级。新发布的两款升级款全加…

One Line of Code to Say Goodbye to Confusing Python Error Messages

该图片由15548337在Pixabay上发布 告别令人困惑的 Python 错误消息 灵活的错误消息增强库 — PrettyError 编程是一项活动&#xff0c;我们可能会用 20% 的时间将想法写成代码&#xff0c;然后用 80% 的时间清除错误并修复错误。错误消息绝对是我们每天都会看到的。但是&…

浅谈XSS简单漏洞xss-labs-master(初级)

一、环境以及xss漏洞简介 网上很多gethub自己下就行 XSS简介&#xff1a; 当用户访问被XSS注入的网页&#xff0c;XSS代码就会被提取出来。用户浏览器就会解析这段XSS代码&#xff0c;也就是说用户被攻击了。 用户最简单的动作就是使用浏览器上网&#xff0c;并且浏览器中有J…

案例介绍:汽车售后服务网络构建与信息抽取技术应用(开源)

一、引言 在当今竞争激烈的汽车行业中&#xff0c;售后服务的质量已成为品牌成功的关键因素之一。作为一位经验丰富的项目经理&#xff0c;我曾参与构建一个全面的汽车售后服务网络&#xff0c;旨在为客户提供无缝的维修、保养和配件更换服务。这个项目的核心目标是通过高效的…

自动化测试介绍、selenium用法(自动化测试框架+爬虫可用)

文章目录 一、自动化测试1、什么是自动化测试&#xff1f;2、手工测试 vs 自动化测试3、自动化测试常见误区4、自动化测试的优劣5、自动化测试分层6、什么项目适合自动化测试 二、Selenuim1、小例子2、用法3、页面操作获取输入内容模拟点击清空文本元素拖拽frame切换窗口切换/标…

统信UOS及麒麟KYLINOS操作系统上如何切换键盘布局

原文链接&#xff1a;如何切换键盘布局 | 统信UOS | 麒麟KYLINOS Hello&#xff0c;大家好啊&#xff0c;最近有朋友在群里提到他的键盘输入“Y”会显示“Z”&#xff0c;输入“Z”会显示“Y”。这个问题听起来可能有些奇怪&#xff0c;但其实并不罕见。出现这种情况的原因&…

SpringMVC总结

SpringMVC SpringMVC是隶属于Spring框架的一部分&#xff0c;主要是用来进行Web开发&#xff0c;是对Servlet进行了封装。 对于SpringMVC我们主要学习如下内容: SpringMVC简介 请求与响应 REST风格 SSM整合(注解版) 拦截器 SpringMVC是处理Web层/表现层的框架&#xff…

langchain学习笔记(九)

RunnableBranch: Dynamically route logic based on input | &#x1f99c;️&#x1f517; Langchain 基于输入的动态路由逻辑&#xff0c;通过上一步的输出选择下一步操作&#xff0c;允许创建非确定性链。路由保证路由间的结构和连贯。 有以下两种方法执行路由 1、通过Ru…

AI算法项目优化流程

算法优化的调试流程可以根据具体情况有所不同&#xff0c;但通常包括以下关键步骤&#xff0c;希望对大家有所帮助。通过以下流程&#xff0c;可以有效地识别和解决算法优化过程中的问题&#xff0c;提升算法性能和稳定性。北京木奇移动技术有限公司&#xff0c;专业的软件外包…

制作耳机壳的UV树脂和塑料材质相比优势有哪些?

制作耳机壳的UV树脂相比塑料材质有以下优势&#xff1a; 高强度与耐磨性&#xff1a;UV树脂具有高强度和耐磨性&#xff0c;能够更好地保护耳机内部零件&#xff0c;延长耳机使用寿命。相比之下&#xff0c;塑料材质可能较易磨损或刮伤。耐高温&#xff1a;UV树脂具有较好的耐…

排序——归并排序

归并排序和快排一样&#xff0c; 都是一种利用二叉树分治思想实现的排序。同时归并排序也和快排一样有递归归并排序和非递归归并排序两种。 本节主要复习归并排序&#xff0c; 并且两种实现方式都会复习到。 递归归并 要实现递归归并排序的代码。 我们首先需要理解递归归并排序…

PyTorch-神经网络

神经网络&#xff0c;这也是深度学习的基石&#xff0c;所谓的深度学习&#xff0c;也可以理解为很深层的神经网络。说起这里&#xff0c;有一个小段子&#xff0c;神经网络曾经被打入了冷宫&#xff0c;因为SVM派的崛起&#xff0c;SVM不了解的同学可以去google一下&#xff0…

stm32触发硬件错误位置定位

1.背景 1. 项目中&#xff0c;调试过程或者测试中都会出现程序跑飞问题&#xff0c;这个时候问题特别难查找。 2. 触发硬件错误往往是因为内存错误。这种问题特别难查找&#xff0c;尤其是产品到了测试阶段&#xff0c;而这个异常复现又比较难的情况下&#xff0c;简直头疼。…

(css)element-ui表格行图片点击放大且可调整preview-src-list大图预览样式

(css)element-ui表格行图片点击放大且可调整preview-src-list大图预览样式 效果&#xff1a; 常规写法&#xff1a; <el-table-column prop"display" label"展示效果" align"center"><template slot-scope"scope"><e…

IEEE Transactions on Industrial Electronics工业电子TIE修改稿注意事项及提交须知

一、背景 兔年末投了一篇TIE&#xff0c;手稿初次提交的注意事项也整理成了博客IEEE Transactions on Industrial Electronics工业电子TIE论文投稿须知&#xff0c;获得了许多点赞和收藏。最近也收到了审稿结果&#xff0c;给的意见是大修major revision&#xff0c;总之只要不…

国内chatgpt写作软件,chatgpt国内使用

随着人工智能技术的不断发展&#xff0c;国内涌现出了一些基于ChatGPT模型的写作软件&#xff0c;这些软件不仅能够实现智能化的文章写作&#xff0c;还支持批量生成各种类型的文章。本文将深入探讨国内ChatGPT写作软件&#xff0c;以及它们在批量文章创作方面的应用与优势。 C…

C#使用iText7给PDF文档添加书签

上一篇文章将SqlSugar官网文档中每个链接对应的网页生成独立PDF文档再合并为单个PDF文档&#xff0c;但是没有书签&#xff0c;八百多页的内容查找和跳转都不方便&#xff0c;本文学习和使用iText7给PDF文档添加多级书签。   添加多级书签分为两大步骤&#xff1a;1&#xff…

选项 打光 试题总结

试题1 被测物体100100mm&#xff0c;精度要求被测物体 &#xff0c;精度要求0.1mm&#xff0c;相机距被测物体在200&#xff5e;320mm之间&#xff0c;要求选择合适的相机和镜头&#xff1f; 分析如下&#xff1a; 通常我们用的相机靶面是4:3 的所以我们要用短边来计算视场&am…