Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Operasi dan penyelenggaraan meminta saya mengoptimumkan kelajuan permulaan SpringBoot, dan inilah yang saya lakukan!

Operasi dan penyelenggaraan meminta saya mengoptimumkan kelajuan permulaan SpringBoot, dan inilah yang saya lakukan!

WBOY
WBOYke hadapan
2023-06-08 18:52:311780semak imbas

Spring Boot sudah pasti rangka kerja terbesar untuk pembangunan back-end Java Berdasarkan Spring Boot, ia mempunyai rangkaian alat yang lengkap dan pelbagai permulaan. Untuk perkembangan perniagaan harian, boleh dikatakan rodanya sudah lengkap.

Namun, dengan populariti perkhidmatan mikro dan era asal awan, aplikasi Spring Boot telah mendedahkan beberapa masalah, yang lebih menonjol ialah:

  • Permulaan perlahan
  • Aplikasi mengambil banyak memori
  • Aplikasi asli awan mempunyai keperluan yang agak tinggi untuk kelajuan permulaan. Apabila pengembangan mendatar diperlukan, kejadian baharu ini mesti dimulakan dalam masa yang cukup singkat untuk memproses permintaan baharu secepat mungkin.
  • Aplikasi asli awan memerlukan seberapa sedikit sumber yang mungkin untuk dijalankan pada masa jalan. Mengurangkan sumber yang diduduki oleh satu contoh sebanyak mungkin bermakna lebih banyak permintaan akses boleh disokong pada kos yang sama.
  • Aplikasi asli awan memerlukan saiz pembungkusan yang lebih kecil. Aplikasi asli awan dibungkus dalam bentuk imej kontena. Lebih besar saiz imej aplikasi, lebih besar ruang storan yang diperlukan dan lebih lama masa yang diperlukan untuk menolak dan menarik imej.

Malah, kita semua tahu bahawa kebanyakan masa permulaan adalah disebabkan keperluan Spring untuk memuatkan pelbagai kacang, mengakibatkan penurunan kelajuan permulaan

1. Permulaan kacang tertunda

Secara amnya, terdapat banyak tugas yang memakan masa dalam SpringBoot, seperti mewujudkan sambungan pangkalan data, mencipta kumpulan benang awal, dsb. Kami boleh melambatkan pengamulaan operasi ini untuk mengoptimumkan kelajuan permulaan. Atribut
spring.main.lazy-initialization telah diperkenalkan selepas Spring Boot versi 2.2 Jika dikonfigurasikan kepada benar, semua kacang akan dimulakan dengan malas.

spring:main:lazy-initialization: true

Selepas permulaan tertunda dihidupkan secara setempat, permulaan boleh menjadi 1~2 saat lebih cepat.

Persekitaran

Konfigurasi

(sepuluh kali purata) kelajuan permulaan

springboot2+jdk1.8


≈10.3s


Lazy initialization Bean

≈8.63s

二、创建扫描索引

Spring5 之后提供了spring-context-indexer功能,可以通过在编译时创建一个静态候选列表来提高大型应用程序的启动性能。

先看官方的解释:

Operasi dan penyelenggaraan meminta saya mengoptimumkan kelajuan permulaan SpringBoot, dan inilah yang saya lakukan!

在项目中使用了@Indexed之后,编译打包的时候会在项目中自动生成META-INT/spring.components文件。

当Spring应用上下文执行ComponentScan扫描时,META-INT/spring.components将会被CandidateComponentsIndexLoader 读取并加载,转换为CandidateComponentsIndex对象,这样的话@ComponentScan不在扫描指定的package,而是读取CandidateComponentsIndex对象,从而达到提升性能的目的.

我们只需要将依赖引入,然后在启动类上使用@Indexed注解即可。这样在程序编译打包之后会生成
META-INT/spring.components文件,当执行@ComponentScan扫描类时,会读取索引文件,提高扫描速度。

<dependency>	<groupid>org.springframework</groupid>	<artifactid>spring-context-indexer</artifactid>	<optional>true</optional></dependency>
@Indexed@SpringBootApplicationpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

Operasi dan penyelenggaraan meminta saya mengoptimumkan kelajuan permulaan SpringBoot, dan inilah yang saya lakukan!

环境

配置

(十次平均值)启动速度

springboot2+jdk1.8


≈10.3s


+延迟初始化Bean

≈8.63s


+创建扫描索引

≈7.7s

Petua lain:

1 Kurangkan skop @ComponentScan @SpringBootApplication apabila mengimbas kelas

2 pemantauan , tetapkan spring.jmx.enabled=false

3. Tetapkan parameter JVM -noverify, jangan sahkan kelas

4. Tangguhkan pemuatan kacang yang tidak dimuatkan pada permulaan 5. Gunakan Spring Pemuatan malas global Boot

5. Cuba jangan gunakan anotasi untuk aspek AOPQ, yang akan menyebabkan semua kaedah diimbas semasa permulaan 7. Matikan beberapa fungsi pemantauan titik akhir

6. Kecualikan projek berlebihan Bergantung pada jar

7. Apabila swagger mengimbas antara muka, tentukan untuk mengimbas hanya kelas di bawah laluan tertentu 10. Pengimbasan antara muka klien Feign mengecilkan julat pengimbasan pakej

Kelajuan permulaan. harus dioptimumkan pada ketika ini. Ia agak melampau, tetapi penggunaan memori yang besar masih menjadi masalah

3. Naik taraf jdk17

Sudah tentu jdk juga telah melakukan usaha yang hebat dalam hal ini:

Memori Sebab utama pendudukan tinggi ialah memori tidak akan dikembalikan ke sistem pengendalian selepas ia diduduki. Ini beransur-ansur bertambah baik:

  • G1 JDK12 dan kemudiannya telah disokong
  • ZGC JDK13 dan kemudiannya telah menyokong

disebabkan oleh ciri bahasa Java dan Spring Boot Sesetengah kaedah pelaksanaan menentukan bahawa walaupun memori G1/ZGC yang tidak digunakan dihidupkan dan dikembalikan ke sistem pengendalian tepat pada masanya, penggunaan memori Spring Boot masih kekal. jauh lebih besar daripada bahasa yang disusun seperti Golang.

Oleh itu, jika Java ingin menyelesaikan masalah dalam era asal awan, penyelesaian semasa pada asasnya adalah berdasarkan GraalVM, sama ada Quarkus atau Micronaut.

Jadi, adakah Spring Boot mempunyai penyelesaian yang sama? : spring-graalvm-native

4. Naik taraf SpringBoot3

spring-graalvm-native ialah ciri yang sangat penting bagi springBoo6/SpringBoot3

dan sokongan Menggunakan GraalVM untuk menyusun aplikasi SpringBoot ke dalam fail imej boleh laku tempatan boleh meningkatkan kelajuan permulaan, prestasi puncak dan mengurangkan penggunaan memori dengan ketara.

Atas ialah kandungan terperinci Operasi dan penyelenggaraan meminta saya mengoptimumkan kelajuan permulaan SpringBoot, dan inilah yang saya lakukan!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam