
Dari seorang penerjemah: karena Kerangka Pegas adalah salah satu kerangka utama tempat kami membangun CUBA , berita tentang fitur Pegas baru tidak terlewatkan oleh kami. Inisialisasi malas adalah salah satu cara untuk mengurangi waktu boot pertama dari aplikasi, yang di zaman kita sekarang ini penggunaan microservices adalah metrik penting. Bagi mereka yang lebih suka membaca menonton video, ada presentasi 10 menit oleh Josh Long pada topik artikel.
Rilis pertama yang baru-baru ini diumumkan untuk Spring Boot 2.2 menambahkan dukungan untuk inisialisasi malas. Pada artikel ini, kita akan melihat fungsionalitas baru dan menjelaskan cara mengaktifkannya.
Apa artinya malas?
Kerangka Kerja Spring telah mendukung inisialisasi malas sejak kode sumbernya dipindahkan ke git sebelas tahun yang lalu. Secara default, ketika konteks aplikasi diperbarui, setiap kacang dibuat kembali dan dependensinya diimplementasikan. Sebaliknya, jika kacang dikonfigurasi untuk inisialisasi malas, itu tidak akan dibuat dan ketergantungannya tidak akan diletakkan sampai ini diperlukan.
Mengaktifkan inisialisasi malas
Dalam versi apa pun dari Spring Boot, dimungkinkan untuk mengaktifkan inisialisasi malas, jika Anda tidak keberatan mengotori tangan Anda dengan BeanFactoryPostProcessor
. Spring Boot 2.2 hanya menyederhanakan proses ini dengan memperkenalkan properti baru - spring.main.lazy-initialization
(ada juga metode setara di SpringApplication
dan SpringApplicationBuilder
). Ketika properti ini disetel ke true
, kacang aplikasi akan dikonfigurasikan untuk menggunakan inisialisasi malas.
Manfaat inisialisasi malas
Inisialisasi malas dapat secara signifikan mengurangi waktu mulai aplikasi Anda, karena pada tahap ini lebih sedikit kelas yang dimuat dan lebih sedikit tempat sampah dibuat. Misalnya, aplikasi web kecil yang menggunakan Actuator dan Spring Security biasanya dimulai 2,5 detik. Dan dengan inisialisasi malas, proses ini membutuhkan waktu 2 detik. Nilai percepatan yang tepat akan bervariasi dari aplikasi ke aplikasi, tergantung pada struktur grafik dependensi dari bin.
Catatan Penerjemah: Saya menjalankan contoh ini, menulis Spring Boot 2.2 dalam dependensi, dan waktu mulai dengan inisialisasi malas adalah 3 detik, dan tanpanya 4. Saya berpikir bahwa pada aplikasi yang lebih serius, keuntungan signifikan pada waktu mulai karena penggunaan inisialisasi malas kita tidak akan melihat. Pembaruan: atas saran dari alek_sys menonaktifkan validasi dan pembaruan skema database dan menyalakan inisialisasi JPA malas untuk kedua kasus - ternyata 2,7 dan 3,7 detik sebelum pesan Started WebApplication in...
Spring Boot DevTools memberikan akselerasi pengembangan yang signifikan. Alih-alih memulai ulang JVM dan aplikasi setiap kali Anda mengubah sesuatu, DevTools melakukan "hot restart" aplikasi di JVM yang sama. Keuntungan signifikan dari restart seperti itu adalah memberikan JIT kesempatan untuk mengoptimalkan kode yang dijalankan ketika aplikasi dimulai. Setelah beberapa restart, waktu awal 2,5 detik berkurang hampir 80% menjadi 500 ms. Dengan inisialisasi malas, segalanya menjadi lebih baik. Pengaturan properti spring.main.lazy-initialization
menunjukkan waktu restart langsung di IDE sama dengan 400 ms.
Sisi lain inisialisasi malas
Seperti yang ditunjukkan di atas, dimasukkannya inisialisasi malas dapat secara serius mengurangi waktu peluncuran aplikasi. Dan mungkin Anda akan memiliki keinginan yang tak tertahankan untuk menggunakan ini terus-menerus, atau setidaknya Anda akan bertanya-tanya mengapa inisialisasi malas tidak diaktifkan secara default. Ada beberapa kemungkinan efek negatif yang sebaiknya diklarifikasi segera.
Fakta bahwa kelas tidak dimuat dan sampah tidak dibuat sampai mereka diperlukan dapat menutupi masalah yang bisa diidentifikasi sebelumnya pada tahap peluncuran aplikasi. Misalnya, mungkin karena kurangnya kelas yang diperlukan, memori yang berlebihan atau kesalahan yang terkait dengan konfigurasi yang salah.
Dalam aplikasi web, konfigurasi malas dapat meningkatkan latensi permintaan HTTP yang menyebabkan inisialisasi bin. Ini biasanya permintaan pertama, tetapi mungkin ada efek tambahan yang tidak diinginkan yang mempengaruhi keseimbangan beban atau penskalaan otomatis.
Apakah ini termasuk?
Jika Anda tidak yakin seberapa tepatnya inisialisasi malas mempengaruhi aplikasi Anda atau jika Anda ingin memeriksa bahwa aspek-aspek lain dari kerangka kerja tersebut cocok untuk Anda dan melakukan apa yang Anda butuhkan, maka akan berguna bagi Anda untuk menggunakan debugger untuk ini. Dengan menetapkan breakpoint pada konstruktor nampan, Anda dapat melihat pada saat yang tepat saat nampan diinisialisasi. Misalnya, dalam aplikasi web yang ditulis dalam Spring Boot dan dengan inisialisasi malas diaktifkan, Anda dapat melihat bahwa @Controller
ditandai dengan penjelasan @Controller
tidak dibuat hingga permintaan pertama untuk DispatcerServlet
Spring MVC atau ke DispatchHandler
Spring WebFlux.
Kapan mengaktifkan inisialisasi malas?
Seperti yang kita lihat di atas, inisialisasi malas menawarkan peningkatan penting selama peluncuran aplikasi, tetapi ada juga kerugian, jadi Anda perlu menggunakan fitur ini dengan sangat hati-hati.
Satu area di mana inisialisasi malas dapat membayar dividen (dengan hampir tidak ada overhead) adalah proses pengembangan aplikasi. Saat Anda menulis aplikasi, pengurangan waktu restart yang disediakan oleh inisialisasi malas bersama dengan DevTools dapat menghemat banyak waktu Anda.
Di mana lagi Anda bisa mendapatkan manfaat menggunakan inisialisasi malas - ini dalam tes integrasi. Anda mungkin sudah menggunakan tes "slicing" untuk mengurangi waktu eksekusi dengan membatasi jumlah kacang yang diinisialisasi dalam beberapa jenis tes. Inisialisasi malas memberikan peluang alternatif untuk mencapai hasil yang sama. Jika Anda berada di posisi yang salah untuk mengubah struktur aplikasi untuk tes "slicing", atau untuk tes spesifik Anda tidak ada "slicing" yang sesuai, maka dimasukkannya inisialisasi malas akan membatasi jumlah nampan untuk yang hanya digunakan dalam tes Anda. Ini akan mengurangi waktu pelaksanaan pengujian, terutama jika mereka berjalan di lingkungan yang terisolasi selama pengembangan.
Nyalakan inisialisasi malas pada dorongan terakhir. Dan, jika Anda memutuskan untuk melakukannya, lakukan dengan hati-hati. Untuk aplikasi web, pengelola kontainer dapat mengandalkan /health
entry point /health
, yang biasanya merespon cukup cepat, tetapi ingat bahwa, berpotensi, panggilan pertama mungkin memakan waktu lebih lama dari biasanya. Anda juga harus mengingat ukuran memori yang dialokasikan untuk JVM sehingga Anda tidak mengalami overflow ketika semua komponen diinisialisasi.