SpringCloud服务启动后,接口第一次请求很慢

您所在的位置:网站首页 ipad第一次开机为什么这么慢 SpringCloud服务启动后,接口第一次请求很慢

SpringCloud服务启动后,接口第一次请求很慢

2024-03-28 17:10| 来源: 网络整理| 查看: 265

SpringCloud服务启动后,接口第一次请求很慢的优化历程 症状概述

服务启动后,请求任意接口,都很慢,响应时长达到2秒

而再次进行请求,响应很快,响应时长毫秒级。

初步诊断

很可能耗时资源在第一次接收到请求时才进行初始化

确定病因

在这里插入图片描述 在这里插入图片描述 上图为第一次请求时打印的日志,由此可知第一次请求时初始化了DataSource、Redis、Servlet

还有个网上找到的Ribbon优化,默认client是懒加载,第一次请求才会进行初始化,所以这里也会影响,需要进行优化

对症下药 DataSource

DataSourceConfig配置类中修改:应用启动时,进行初始化

@org.springframework.context.annotation.Bean(name = "dataSource",initMethod = "init",destroyMethod = "close") public DruidDataSource dataSource() throws SQLException { DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(this.driverClassName); ds.setUrl(this.url); ds.setUsername(this.username); ds.setPassword(this.password); ds.setInitialSize(this.initialSize.intValue()); ds.setMinIdle(this.minIdle.intValue()); ds.setMaxActive(this.maxActive.intValue()); ds.setMaxWait(this.maxWait.longValue()); ds.setTimeBetweenEvictionRunsMillis(this.timeBetweenEvictionRunsMillis.longValue()); ds.setMinEvictableIdleTimeMillis(this.minEvictableIdleTimeMillis.longValue()); ds.setValidationQuery(this.validationQuery); ds.setTestWhileIdle(this.testWhileIdle.booleanValue()); ds.setTestOnBorrow(this.testOnBorrow.booleanValue()); ds.setTestOnReturn(this.testOnReturn.booleanValue()); ds.setFilters(this.filters); ds.init(); return ds; } DispatcherServlet

当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet

在配置文件上添加:

spring.mvc.servlet.load-on-startup=100 初始化Redis

像我这里使用的是codis,封装了一个工具类,第一次调用时会初始化

所以Redis工具类初始化方法上加 @PostConstruct

被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行

Ribbon

Ribbon进行客户端负载均衡的Client并不是在服务启动的时候就初始化好的,而是在调用的时候才会去创建相应的Client

所以第一次调用的耗时不仅仅包含发送HTTP请求的时间,还包含了创建RibbonClient的时间

饥饿加载 ribbon.eager-load.enabled=true ribbon.eager-load.clients=member-api,activity-api


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3