springboot3.x入门系列【3】性能提升技巧

一、简介

使用Spring Boot的新特性对代码进行优化,可以显著提升开发效率和应用性能。Spring Boot是一个基于Spring框架之上的快速开发脚手架,它提供了许多预设的配置和自动配置功能,让开发者能够轻松地搭建和运行Spring应用程序

二、springboot3.x 性能优化

1.使用jdk21 开启虚拟线程

1.1 openjdk 21 下载

 1)oracle openjdk 下载

openJdk下载

2) microsoft  openjdk下载

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)使用@Autowiredrequired属性

你可以将@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

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值