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

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

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镜像技术实现了对Spring应用程序的编译优化,从而提升应用性能和启动速度。本文将介绍Spring Native的背景和动机,以及Native镜像技术的概念和原理。


原理


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发行版,并按照官方文档进行安装。


  1. 配置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 {
    @Bean
    public 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 {
    @Override
    public void doSomething() {
        // 实现具体的业务逻辑
    }
}
 
public class MyServiceProxy implements MyService {
    private MyService target;
 
    public MyServiceProxy(MyService target) {
        this.target = target;
    }
 
    @Override
    public void doSomething() {
        // 在调用目标对象之前或之后,可以添加额外的逻辑
        // ...
        target.doSomething();
        // 在调用目标对象之前或之后,可以添加额外的逻辑
        // ...
    }
}
  1. 编译时生成代码示例:在某些场景下,可以使用编译时生成代码的方式来替代动态加载类。
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调优的比较


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


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


相关文章
|
2月前
|
人工智能 Cloud Native 安全
从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势
本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三)在云栖大会的精彩分享。讲师深入浅出的分享了软件架构演进过程中,网关所扮演的各类角色,AI 应用的流量新特征对软件架构和网关所提出的新诉求,以及基于阿里自身实践所带来的开源贡献和商业能力。
137 13
|
7月前
|
监控 Java 调度
探秘Java虚拟机(JVM)性能调优:技术要点与实战策略
【6月更文挑战第30天】**探索JVM性能调优:**关注堆内存配置(Xms, Xmx, XX:NewRatio, XX:SurvivorRatio),选择适合的垃圾收集器(如Parallel, CMS, G1),利用jstat, jmap等工具诊断,解决Full GC问题,实战中结合MAT分析内存泄露。调优是平衡内存占用、延迟和吞吐量的艺术,借助VisualVM等工具提升系统在高负载下的稳定性与效率。
117 1
|
3月前
|
人工智能 Cloud Native 安全
从云原生到 AI 原生,网关的发展趋势和最佳实践
本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三)在云栖大会的精彩分享。讲师深入浅出的分享了软件架构演进过程中,网关所扮演的各类角色,AI 应用的流量新特征对软件架构和网关所提出的新诉求,以及基于阿里自身实践所带来的开源贡献和商业能力。
333 13
|
6月前
|
缓存 监控 Java
优化Spring Boot应用的数据库访问性能
优化Spring Boot应用的数据库访问性能
|
3月前
|
安全 Java API
🌟探索Java宇宙:深入理解Java技术体系与JVM的奥秘
本文深入探讨了Java技术体系的全貌,从Java语言的概述到其优点,再到Java技术体系的构成,以及JVM的角色。旨在帮助Java开发者全面了解Java生态,提升对Java技术的认知,从而在编程实践中更好地发挥Java的优势。关键词:Java, JVM, 技术体系, 编程语言, 跨平台, 内存管理。
54 2
|
3月前
|
运维 Cloud Native 持续交付
云原生技术解析:从IO出发,以阿里云原生为例
【10月更文挑战第24天】随着互联网技术的不断发展,传统的单体应用架构逐渐暴露出扩展性差、迭代速度慢等问题。为了应对这些挑战,云原生技术应运而生。云原生是一种利用云计算的优势,以更灵活、可扩展和可靠的方式构建和部署应用程序的方法。它强调以容器、微服务、自动化和持续交付为核心,旨在提高开发效率、增强系统的灵活性和可维护性。阿里云作为国内领先的云服务商,在云原生领域有着深厚的积累和实践。
99 0
|
4月前
|
Kubernetes Java 编译器
解锁极致性能:Quarkus如何让JVM应用调优变得前所未有的简单与高效!
Quarkus是一款专为GraalVM和OpenJDK设计的Kubernetes Native Java框架,采用AOT编译技术将Java应用转化为本地代码,大幅提升启动速度与运行效率。它简化了性能调优流程,如自动优化垃圾回收、类加载、内存管理及线程管理等,使开发者无需深入理解JVM细节即可轻松提升应用性能。与传统JVM应用相比,Quarkus显著降低了性能调优的复杂度。
151 2
|
5月前
|
Prometheus 监控 Cloud Native
Spring Boot 性能护航!Prometheus、Grafana、ELK 组合拳,点燃数字化时代应用稳定之火
【8月更文挑战第29天】在现代软件开发中,保证应用性能与稳定至关重要。Spring Boot 作为流行的 Java 框架,结合 Prometheus、Grafana 和 ELK 可显著提升监控与分析能力。Prometheus 负责收集时间序列数据,Grafana 将数据可视化,而 ELK (Elasticsearch、Logstash、Kibana)则管理并分析应用日志。通过具体实例演示了如何在 Spring Boot 应用中集成这些工具:配置 Prometheus 获取度量信息、Grafana 显示结果及 ELK 分析日志,从而帮助开发者快速定位问题,确保应用稳定高效运行。
158 1
|
4月前
|
Kubernetes Cloud Native Java
探索未来编程新纪元:Quarkus带你秒建高性能Kubernetes原生Java应用,云原生时代的技术狂欢!
Quarkus 是专为 Kubernetes 设计的全栈云原生 Java 框架,凭借其轻量级、快速启动及高效执行特性,在 Java 社区脱颖而出。通过编译时优化与原生镜像支持,Quarkus 提升了应用性能,同时保持了 Java 的熟悉度与灵活性。本文将指导你从创建项目、编写 REST 控制器到构建与部署 Kubernetes 原生镜像的全过程,让你快速上手 Quarkus,体验高效开发与部署的乐趣。
107 0
|
5月前
|
算法 Java 应用服务中间件
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略
探索JVM垃圾回收算法:选择适合你应用的最佳GC策略