Java CRaC 上的Spring Boot3


除了GraalVM之外,在最近的Geecon会议上讨论最多的另一项技术是一个名为Java on CRaC的项目。
这个项目带来了两个功能,CRaC上的Java基本上在Oracle GraalVM上运行(目前)。

  • 超快的应用程序启动。甚至比GraalVM的本地镜像还要快
  • 快照应用的想法允许你立即启动到应用程序的状态,无需数据预热,只是砰的一声!应用程序在启动时就已经加载了所有的东西!

先决条件:
1、Linux machine (in my case):

INFRA [root@payment01 ~]# cat /etc/os-release 
NAME="Red Hat Enterprise Linux"
VERSION=
"8.6 (Ootpa)"

2、Java on CRaC installed as JDK:

INFRA [root@payment01 ~]# java -version
openjdk version "17-crac" 2021-09-14
OpenJDK Runtime Environment (build 17-crac+3-15)
OpenJDK 64-Bit Server VM (build 17-crac+3-15, mixed mode, sharing)

3、maven:

INFRA [root@payment01 ~]# mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /root/apache-maven-3.6.3
Java version: 17-crac, vendor: N/A, runtime: /root/openjdk-17-crac+3_linux-x64
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "4.18.0-372.32.1.el8_6.x86_64", arch: "amd64", family: "unix"

在CRaC上使用Java和Spring Boot的重要提示
要及时对你的应用程序进行CRaC检查点,你必须:

  • 关闭你的应用程序打开的所有套接字。
  • 关闭你的应用所打开的所有文件

第一个问题解决是使用嵌入式tomcat监听CRaC检查点生命周期:
<dependency>
    <groupId>io.github.crac.org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
    <version>8.5.75</version>
</dependency>

官方CRaC spring-boot example 示例中的8.5.78版本不能用于最后的Spring Boot 2.x , 请确保有9.0.58版本。我在含有CRaC的JDK 17上成功测试了Spring Boot 2.6.3。但更高版本的boot应该也可以工作。

CRaC和LINUX平台问题
我在提到的RED_HAT linux上运行Java CRaC的经验最好。在Oracle LINUX上运行CRaC是非常痛苦的。
总之,在这两种情况下,我不得不采用以下的解决方法来创建应用程序检查点。

MVC app for testing

@RestController
public class TestController {

    IDataService dataService;

    public TestController(IDataService dataService) {
        this.dataService = dataService;
    }

    @GetMapping("/addData/{data}")
    public String addData(@PathVariable(
"data") String data) {
        dataService.addData(data);

        return data+
" added.";
    }

    @GetMapping(
"/getData")
    public String getData() {
        return dataService.getData();
    }
}

IDataService在内存中保存数据。


总结
CRaC上的Java击败Oracle GraaVM的地方

  • 与GraalVM相比,应用程序的启动速度甚至更快
  • 基于反射的框架对应用程序的快照来说不是问题。GraalVM在这一点上很纠结
  • GraalVM不允许你像CRaC那样及时从状态中启动应用程序。

Oracle GraaVM在CRaC上击败Java的地方

  • 1000倍好的文档!
  • GraalVM的本地镜像比基于CRaC的应用程序少消耗5倍的内存。当内存是你的首要任务时,请选择GraalVM。

源码案例点击标题