一、简介
使用Spring Boot的新特性对代码进行优化,可以显著提升开发效率和应用性能。Spring Boot是一个基于Spring框架之上的快速开发脚手架,它提供了许多预设的配置和自动配置功能,让开发者能够轻松地搭建和运行Spring应用程序
二、springboot3.x 性能优化
1.使用jdk21 开启虚拟线程
1.1 openjdk 21 下载
1)oracle openjdk 下载
2) microsoft openjdk下载
1.2 springboot 配置tomcat虚拟线程
代码
// 配置tomcat虚拟线程 @Bean TomcatProtocolHandlerCustomizer<?> tomcatProtocolHandlerCustomizer(){ return protocolHandler -> protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor()); }
配置文件启用虚拟线程
spring: threads: virtual: enabled: true
代码日志输出:
2. 前后端不分离,对前端资源进行优化
2.1 启用gzip
server: compression: enabled: true min-response-size: 1024 # 响应内容长度超过设置大小时进行压缩,默认值为2048:2K mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml,application/x-www-form-urlencoded servlet: context-path: /eolinker_os session: timeout: PT6H tomcat: uri-encoding: UTF-8
2.2 启用前端静态资源缓存
spring: resources: static-locations: classpath:dump/,file:dump/,classpath:config/,file:config/ # 添加静态资源缓存 cache: period: 3600 cache-control: max-age: 3600 #静态资源缓存时间 cache-policy: true #请求会被缓存 chain: cache: true
2.3 效果比对
未优化前
优化后
查看请求头信息
3. springboot3.x 懒加载
3.1 懒加载特性
懒加载(Lazy Initialization)是一种设计模式,用于延迟对象的创建直到实际需要它们的时候。在Spring框架中,懒加载可以减少应用启动时间,因为不是所有Bean都在应用启动时创建,而是在首次请求时才创建
3.2 启用懒加载
全局配置
spring: main: lazy-initialization: true
此时会全局都进行懒加载
3.3 存在的问题
- 在启动时没有加载,而是在第一次请求处理加载, 会导致第一次请求时间变长。之后的请求不受影响(说到这里自然而然的会联系到 spring cloud 启动后的第一次调用超时的问题)。
- 错误不会在应用启动时抛出,不利于早发现、早解决。
举例:
懒加载(Lazy Loading)可能会导致使用@Autowired进行构造器注入的Bean实例为空
1)使用
@Lazy
注解在构造器参数上在Spring的早期版本中,如果一个Bean被标记为懒加载(通过
@Lazy
注解或@Profile
注解),那么在构造器注入时,Spring容器启动时不会立即创建这个Bean的实例,这可能导致无法满足其他Bean的依赖。从Spring 4.3开始,可以在构造器参数上使用@Lazy
注解,以确保即使依赖是懒加载的,它也会在其他Bean的构造函数中被正确解析。public class SomeBean { private DependencyBean dependencyBean; @Autowired public SomeBean(@Lazy DependencyBean dependencyBean) { this.dependencyBean = dependencyBean; } }
2)使用
@Autowired
的required
属性:你可以将
@Autowired
注解的required
属性设置为false
,这样即使懒加载的Bean尚未初始化,构造函数也可以正常执行public class SomeBean { private DependencyBean dependencyBean; @Autowired(required = false) public SomeBean(DependencyBean dependencyBean) { this.dependencyBean = dependencyBean; } }
3)禁用懒加载属性
@Lazy(false)
在类上加上以上注释表示不进行懒加载
@Lazy(false) public class SomeBean { private DependencyBean dependencyBean; @Autowired public SomeBean(DependencyBean dependencyBean) { this.dependencyBean = dependencyBean; } }
4. 类数据共享 (CDS)
4.1 CDS 介绍
springboot 3.3 版本发布支持CDS ,它通过将类元数据缓存在 Archive(归档/存档) 文件中,使其可以快速预加载到新启动的 JVM 中,从而帮助缩短 JVM 的启动时间和内存占用
4.2 编译
1)mvn clean package
进行包构建得到构建包 eolinker_os-4.0.jar
2)使用 命令进行 一体式jar包提取成可以使用CDS技术的格式
java -Djarmode=tools -jar eolinker_os-4.0.jar extract --destination application
3) cd application
生成 application.jsa
java -XX:ArchiveClassesAtExit=application.jsa -Dspring.context.exit=onRefresh -jar eolinker_os-4.0.jar
在启动脚本中添加 -XX:SharedArchiveFile=application.jsa
app=`ls *.jar` thePid=`ps -ef|grep ${app}|grep -v grep|awk '{print $2}'` kill -9 ${thePid} echo kill Pid:[${thePid}] for [${app}] OK! CurDir=$(cd `dirname $0`; pwd) echo "$CurDir" mkdir -pv $CurDir/logs/gc/ mkdir -pv $CurDir/logs/dump/ #nohup /home/hik/reapWeb/jdk1.8.0_151/bin/java -Xms1536M -Xmx1536M -jar $app >> ./logs/out.log 2>&1 & nohup /opt/chopin/eolinker3.x-21-cds/jdk21/jdk-21.0.3/bin/java -verbose:gc -Xloggc:$CurDir/logs/gc/gc.log -Xms512M -Xmx512M -XX:NewRatio=2 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+UseG1GC -Xss1m -XX:SharedArchiveFile=application.jsa -jar $CurDir/application/$app >> ./logs/out.log 2 >&1 & #$app > /dev/null 2>&1 & #nohup ../jdk1.8.0_151/bin/java -Xms1536M -Xmx1536M -jar $app >> ./logs/out.log 2>&1 & echo [${app}] resarted OK ! exit 0