Der Betrieb und die Wartung haben mich gebeten, die Startgeschwindigkeit von SpringBoot zu optimieren, und das habe ich getan!

WBOY
Freigeben: 2023-06-08 18:52:31
nach vorne
1784 Leute haben es durchsucht

Spring Boot ist zweifellos das Framework Nummer eins für die Java-Backend-Entwicklung. Es basiert auf Spring Boot und verfügt über eine vollständige Toolkette und verschiedene Starter. Für die tägliche Geschäftsentwicklung kann man sagen, dass die Räder komplett sind.

Mit der Beliebtheit von Microservices und der Cloud-Native-Ära haben Spring Boot-Anwendungen jedoch einige Probleme aufgedeckt. Die auffälligsten sind:

  • Langsamer Start
  • Die Anwendung nimmt zu viel in Anspruch Speicher
  • Cloud-native Anwendungen stellen relativ hohe Anforderungen an die Startgeschwindigkeit. Wenn eine horizontale Erweiterung erforderlich ist, müssen diese neuen Instanzen innerhalb einer ausreichend kurzen Zeit gestartet werden, um neue Anfragen so schnell wie möglich zu bearbeiten.
  • Cloud-native Anwendungen benötigen möglichst wenig Ressourcen, um zur Laufzeit genutzt zu werden. Die größtmögliche Reduzierung der von einer einzelnen Instanz belegten Ressourcen bedeutet, dass mehr Zugriffsanfragen bei gleichen Kosten unterstützt werden können.
  • Cloud-native Anwendungen erfordern eine kleinere Paketgröße. Cloud-native Anwendungen werden in Form von Container-Images verpackt. Je größer das Anwendungsbild ist, desto größer ist der erforderliche Speicherplatz und desto länger dauert das Pushen und Ziehen des Bildes.

Tatsächlich wissen wir alle, dass der größte Teil der Startzeit darauf zurückzuführen ist, dass Spring verschiedene Beans laden muss, was zu einer Verringerung der Startgeschwindigkeit führt

1. Verzögerte Initialisierung von Beans

Im Allgemeinen In SpringBoot gibt es viele zeitaufwändige Aufgaben, z. B. den Aufbau einer Datenbankverbindung, die Erstellung des anfänglichen Thread-Pools usw. Wir können die Initialisierung dieser Vorgänge verzögern, um die Startgeschwindigkeit zu optimieren. Die Eigenschaft
spring.main.lazy-initialization wurde nach Spring Boot Version 2.2 eingeführt. Wenn sie auf „true“ konfiguriert ist, werden alle Beans verzögert initialisiert.

spring:main:lazy-initialization: true
Nach dem Login kopieren

Nachdem die verzögerte Initialisierung lokal aktiviert wurde, kann der Start 1 bis 2 Sekunden schneller erfolgen.

Umgebung

Konfiguration

(durchschnittlich zehnmal) Startgeschwindigkeit.

springboot2+jdk1.8


≈10,3s


Verzögerte Initialisierung von Bean

≈8,63s

二、创建扫描索引

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

先看官方的解释:

Der Betrieb und die Wartung haben mich gebeten, die Startgeschwindigkeit von SpringBoot zu optimieren, und das habe ich getan!

在项目中使用了@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>
Nach dem Login kopieren
@Indexed@SpringBootApplicationpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
Nach dem Login kopieren

Der Betrieb und die Wartung haben mich gebeten, die Startgeschwindigkeit von SpringBoot zu optimieren, und das habe ich getan!

环境

配置

(十次平均值)启动速度

springboot2+jdk1.8


≈10.3s


+延迟初始化Bean

≈8.63s


+创建扫描索引

≈7.7s

Weitere Tipps:

1. Reduzieren Sie den Umfang von @ComponentScan @SpringBootApplication beim Scannen von Klassen

2. Schalten Sie die JMX-Überwachung von Spring Boot aus und setzen Sie spring.jmx.enabled=false

3. noverify, verifizieren Sie die Klasse nicht

4. Verzögern Sie das Laden von Beans, die beim Start nicht geladen werden müssen 5. Verwenden Sie das globale Lazy Loading von Spring Boot

5. Versuchen Sie, keine Annotationen für AOPQ-Aspekte zu verwenden, da dies alle Methoden verursacht beim Start gescannt werden 7. Deaktivieren Sie einige Endpunktüberwachungsfunktionen

6. Schließen Sie unnötige Jar-Abhängigkeiten des Projekts aus

7. Wenn Swagger die Schnittstelle scannt, legen Sie fest, dass nur die Klassen unter einem bestimmten Pfad gescannt werden sollen 10. Der Scan von Feign Die Client-Schnittstelle schränkt den Umfang des Paket-Scannens ein.

Zu diesem Zeitpunkt sollte die Startgeschwindigkeit als am besten angesehen werden, aber die große Speichernutzung ist immer noch ein Problem.

3 Aktualisieren Sie jdk17 Viele Anstrengungen in diesem Bereich:

Der große Speicherverbrauch ist hauptsächlich auf die Speichernutzung zurückzuführen. Das Betriebssystem wird in Zukunft nicht zurückgegeben, dies verbessert sich allmählich:

  • G1 JDK12 und höher wird unterstützt
  • ZGC JDK13 und höher wird unterstützt

basiert auf den Funktionen der Java-Sprache. Und einige Implementierungsmethoden von Spring Boot bestimmen, dass auch dann der ungenutzte Speicher von G1/ZGC eingeschaltet und wiederhergestellt wird Mit der Zeit des Betriebssystems ist die Speichernutzung von Spring Boot immer noch viel größer als die von kompilierten Sprachen wie Golang. Wenn Java also die Probleme im Cloud-native-Zeitalter lösen will, basieren die aktuellen Lösungen grundsätzlich auf GraalVM, egal ob Quarkus oder Micronaut.

Hat Spring Boot eine ähnliche Lösung? :spring-graalvm-native

spring-graalvm-native ist eine sehr wichtige Funktion von springBoo6/SpringBoot3

. Es unterstützt die Verwendung von GraalVM zum Kompilieren von SpringBoot-Anwendungen in lokale ausführbare Image-Dateien Startgeschwindigkeit, Spitzenleistung und Reduzierung der Speichernutzung.

Das obige ist der detaillierte Inhalt vonDer Betrieb und die Wartung haben mich gebeten, die Startgeschwindigkeit von SpringBoot zu optimieren, und das habe ich getan!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:51cto.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage