一、Spring Native 是什么?
Spring Native 可以通过 GraalVM 将 Spring 应用程序编译成原生镜像,提供了一种新的方式来部署 Spring 应用。Spring Native 支持 Java 和 Kotlin。
这个项目的目标是寻找 Spring JVM 的替代方案,提供一个能将应用程序打包,并运行在轻量级容器的方案。期望能够在 Spring Native 中支持所有的 Spring 应用程序(几乎不用修改代码)。
二、GraalVM是什么?
GraalVM 是 Oracle 发布的下世代 Java 虚拟机,2019.05 才发布了第一个 release 版本,分别有社区版和企业版。
GraalVM有着远大的目标:
- 更进一步提升JVM上运行的程序的性能;
- 通过预编译(ahead-of-time)编译Java程序为原生可执行程序;
- 多种编程语言混编在一个程序中(polyglot);
- 类似于LLVM,GraalVM也提供了方便的机制方便开发新的编程语言;
官方网站在: https://www.graalvm.org/
三、为什么GraalVM的原生编译非常适合微服务和 Serverless?
当可以把Java程序也编译为原生的可执行程序后 (目前GraalVM已经支持编译为Windows, MacOS, Linux上的原生程序),最主要的两个变化:
- 启动时间变短了,之前启动一个有“依赖注入”的Java程序,可能启动时间要2秒以上。如果Java程序是要长期运行的,那启动时间稍慢一点是没问题的,但是对于 Serverless 应用,这就变为冷启动(cold start)了,影响比较大。
- 程序运行的内存需求变小了,之前启动一个Java程序,控制得好的话(heap设置得比较小),也要100M以上的内存,但是编译为原生程序后,只需要4M内存就可以了。 这样同样的一台机器就可以启动非常多的进程,适合简单的微服务。
四、Spring Native Beta来了
Spring 团队日前发布了 Spring Native Beta 版。通过 Spring Native,Spring 应用将有机会以 GraalVM 原生镜像的方式运行。为了更好地支持原生运行,Spring Native 提供了 Maven 和 Gradle 插件,并且提供了优化原生配置的注解。
最近,Spring 发布了 Spring Native 的 beta 版本,该功能已经在 http://start.spring.io 上可用了。
添加 Spring Native 依赖后将会使用所需的依赖和插件自动配置 Maven 或 Gradle 项目,以便于支持原生。应用代码本身没有变化。
Spring Native Beta 链接:
https://github.com/spring-projects-experimental/spring-native
这些原生的 Spring 应用可以作为一个独立的可执行文件进行部署(不需要安装 JVM),并且还能提供有趣的特征,包括几乎瞬时的启动(一般会小于 100 毫秒)、瞬时的峰值性能以及更低的资源消耗,其代价是比 JVM 更长的构建时间和更少的运行时优化。
通过简单的 mvn spring-boot:build-image 或 gradle bootBuildImage 命令,就能生成一个优化的容器镜像,它包含了一个最小的操作系统层和一个小的原生可执行文件,该文件只包含了必需的东西即 JDK、Spring 以及应用中所使用的依赖。
文章评论