GraalVMのSpring移植チームは最近、最初のメジャーリリースであるSpring NativeBetaをリリースしました。GraalVMの作成者と協力して、コンパイラ自体と春の両方で多くのバグを修正することができました。現在、プロジェクトには公式のサポートと独自のリリースサイクルがあり、それを感じることができます。
JVMからバイナリにコードを移植する際の最も重要な障害は、Javaにのみ固有のチップの使用の問題です。リフレクション、クラスパスの操作、クラスの動的ロードなどです。
ドキュメントによると、通常のJVMとネイティブ実装の主な違いは次のとおりです。
アプリケーション全体の静的分析は、ビルド時に実行されます。
未使用のコンポーネントは、組み立て中に削除されます。
リフレクション、リソース、および動的プロキシは、追加の構成でのみ構成できます。
ビルド時に、すべてのコンポーネントがクラスパスで修正されます。
クラスの遅延読み込みはありません。読み込み時に、実行可能ファイルに含まれるすべてのものがメモリに読み込まれます。たとえば、Class.forName( "myClass")の呼び出しが正しく機能するには、構成ファイルにmyClassが含まれている必要があります。クラスを動的にロードするように要求された構成ファイルにクラスが見つからない場合、ClassNotFoundExceptionがスローされます
一部のコードは、コンポーネントを適切にリンクするためにビルド時に実行されます。たとえば、テスト。
, , , - .
Spring AOT, Graal VM .
Spring AOT native-image.properties
, reflection-config.json
, proxy-config.json
resource-config.json
.
Graal VM , META-INF/native-image
.
, Spring AOT. maven spring-aot-maven-plugin
, gradle - spring-aot-gradle-plugin.
, gradle :
plugins {id 'org.springframework.experimental.aot' version '0.9.0'}
, , .
, , . , .
, WebClient
org.springframework.nativex.hint
, :
@TypeHint(types = Data.class, typeNames = "com.example.webclient.Data$SuperHero")
@SpringBootApplication
public class WebClientApplication {
// ...
}
, Data
, SuperHero
. , .
graavlvm , java.lang.reflect.Proxy
@ProxyHint
.
, , :
@ProxyHint(types = {
org.hibernate.Session.class,
org.springframework.orm.jpa.EntityManagerProxy.class
})
- , @ResourceHint.
, :
@ResourceHint(patterns = "com/mysql/cj/TlsSettings.properties")
/ , @InitializationHint:
@InitializationHint(types = org.h2.util.Bits.class,
initTime = InitializationTime.BUILD)
, @NativeHint
:
@Repeatable(NativeHints.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface NativeHint
, , :
@NativeHint(
trigger = Driver.class,
options = "--enable-all-security-services",
types = @TypeHint(types = {
FailoverConnectionUrl.class,
FailoverDnsSrvConnectionUrl.class,
// ...
}), resources = {
@ResourceHint(patterns = "com/mysql/cj/TlsSettings.properties"),
@ResourceHint(patterns = "com.mysql.cj.LocalizedErrorMessages",
isBundle = true)
})
, , classpath .
Graal VM Spring AOT.
Spring Native , start.spring.io. JPA spring , CRUD . Graal VM , BP_NATIVE_IMAGE_BUILD_ARGUMENTS
Spring AOT, Buildpacks, “<buildArgs>
” pom.xml
, native-image-maven-plugin
.
実際には、コマンドmvn spring-boot:build-imageまたはgradle bootBuildImage
-を実行すると、イメージのビルドが開始されます。アセンブリが正常に完了したため、コレクタには7GBを超えるメモリが必要であることに注意してください。私のマシンでは、アセンブリと画像のダウンロードにかかる時間は5分以内でした。同時に、画像は非常にコンパクトで、わずか60MBであることが判明しました。アプリケーションは0.022秒で起動しました!これは信じられないほどの結果です。ますます多くの企業がK8に切り替えてアプリケーションを開始していること、および使用されるリソースが現代の世界で非常に重要であることを考慮すると、このテクノロジーにより、Springは、FaaSの実装であっても、すべてのタイプのマイクロサービスでナンバーワンのフレームワークを作成できます。コールドスピードが非常に重要な場所から始めます。