Spring FuをGraalVMで動かす。起動速度に驚いた。


Serverlessプラットフォームが注目される中、その潮流にJava勢も乗っかりたいので起動速度が速いと注目のGraalVMを試してみた。

モチベーション

GraalVMコトハジメ

GraalVM周辺を理解する。

https://www.graalvm.org/

GraalVMとは

GraalVMとGraal

AOTコンパイラ

GraalVMのメリット

GraalVMのデメリット

GraalVMでSpring Fuを動かす

native-imageのコマンド
1
2
3
4
5
6
 native-image -H:Name=app \
  --delay-class-initialization-to-runtime=io.netty.handler.codec.http.HttpObjectEncoder,org.springframework.core.io.VfsUtils \
  -H:ReflectionConfigurationFiles=graal-app.json \
  -Dio.netty.noUnsafe=true \
  -H:+ReportUnsupportedElementsAtRuntime \
  -Dfile.encoding=UTF-8 -cp ".:$(echo spring-fu-on-graalvm/BOOT-INF/lib/*.jar | tr ' ' ':')":spring-fu-on-graalvm/BOOT-INF/classes me.soushin.app.ApplicationKt

-H:ReflectionConfigurationFiles=graal-app.jsonがポイントである。 このjsonに次のようにbean化するクラスを定義する。

1
2
3
4
  {
    "name": "me.soushin.app.EchoHandler",
    "allDeclaredConstructors": true
  }

こうすることでSpringの世界で bean<EchoHandler>()を読んでも動的クラス読み込みが成功する。

起動にかかった時間を確認する

1
2
04:15:42.131 [main] INFO org.springframework.boot.SpringApplication 
  - Started application in 0.012 seconds (JVM running for 0.012)

0.012!! 爆速。

Spring Fuを動かしているレポジトリを公開しているのでソースとともに確認してほしい。

gRPCサーバは動くのか

こちらのレポジトリで試したがnative imageの生成時にエラーを確認した。

oracle/graalにissueを送ったので継続してgRPCサーバを動かすことにチャレンジしていきたい。

まとめ