Tim porting Spring untuk GraalVM baru-baru ini merilis rilis besar pertama mereka, Spring Native Beta. Bersama dengan pembuat GraalVM, mereka dapat memperbaiki banyak bug baik di kompiler itu sendiri maupun di musim semi. Sekarang proyek tersebut memiliki dukungan resmi, siklus rilisnya sendiri dan Anda dapat merasakannya.
Hambatan paling penting saat mem-port kode dari JVM ke binari adalah masalah penggunaan chip yang hanya ada di java - refleksi, bekerja dengan classpath, pemuatan dinamis kelas, dll.
Menurut dokumentasi, perbedaan utama antara JVM biasa dan implementasi asli adalah sebagai berikut:
Analisis statis dari seluruh aplikasi dilakukan pada waktu pembuatan.
Komponen yang tidak digunakan dilepas selama perakitan.
Refleksi, sumber daya, dan proxy dinamis hanya dapat dikonfigurasi dengan konfigurasi tambahan.
Pada waktu pembuatan, semua komponen diperbaiki di Classpath.
Tidak ada pemuatan lambat kelas: saat memuat semua yang ada di file yang dapat dieksekusi akan dimuat ke dalam memori. Misalnya, agar panggilan ke Class.forName ("myClass") berfungsi dengan benar, Anda harus memiliki myClass di file konfigurasi. Jika tidak ada kelas yang ditemukan dalam file konfigurasi yang diminta untuk memuat kelas secara dinamis, ClassNotFoundException akan ditampilkan
Beberapa kode akan dijalankan pada waktu pembuatan untuk menghubungkan komponen dengan benar. Misalnya, tes.
, , , - .
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
.
Sebenarnya, kami menjalankan perintah mvn spring-boot: build-image atau gradle bootBuildImage
- dan pembuatan image akan dimulai. Perlu dicatat bahwa kolektor membutuhkan lebih dari 7 GB memori, untuk itu perakitan selesai dengan sukses. Di komputer saya, perakitan, bersama dengan pengunduhan gambar, tidak lebih dari 5 menit. Pada saat yang sama, gambarnya ternyata sangat ringkas, hanya 60 MB. Aplikasi dimulai dalam 0,022 detik! Ini hasil yang luar biasa. Mengingat semakin banyak perusahaan yang beralih ke K8 dan memulai aplikasi, serta sumber daya yang digunakan sangat penting di dunia modern, teknologi ini memungkinkan Spring membuat kerangka kerja nomor satu untuk semua jenis layanan mikro, bahkan untuk implementasi FaaS, dimana kecepatan dingin sangat penting.