Java CRaC 上的Spring Boot3

banq發表於2022-11-27

除了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。


原始碼案例點選標題

相關文章