spring Boot默认配置:
Tomcat连接池
1.默认使用的是Tomcat作为web的容器,但是有一个问题,就是默认配置在高并发下会成为瓶颈。
2.默认配置高并发下连接池是200,最大线程数也是200.这就意味着当并发请求超过200的时候,后续请求就会排队,在生产环境中这个配置默认是不够用的。
3.spring的默认超时时间是无限长这会导致连接诶一直会被占用,直到客户端主动断开。
在网络不稳定的情况,大量的连接会一直挂着不会释放,最终耗尽服务器的资源。
数据库连接池:
默认的数据库连接池是:10,但是对于复杂的场景10是不够用的。
特别注意的是:leak-detection-threshold这个配置,默认检测的是关闭的,如果代码中存在连接泄漏问题,根本发现不了。
JPA的赖加载
默认开启JPA赖加载衷心 是好的,但是会导致N+1查询
当查询用户列表的时候:每访问一次orders属性就会触发一次数据库查询,如果有100个用户,会触发101SQL,这种情况要使用:@EntityGraph 指定加载策略,要么在Repository中使用JOIN FETCH.
Jackson时区序列化
jackson时区序列化,经常出问题,Jackson会使用系统时区,这在分布式部署时会导致不一致的问题,要命的是,如果你的应用部署在不同的时区的服务器,同样的时间会被序列化成为不同值。
默认使用的logback
默认使用的Logback没有对日志进行,滚动和清理,长时间运行会产生巨大的日志文件最终沾满磁盘空间。
另外默认的日志级别是INFO,生产环境会产生大量的日志,合理设置日志级别可以提升服务的性能。
默认的缓存配置
@Cacheable 注解默认使用的ConcurrentHashMap,作为缓存实现,但是这个实现没有过期机制,也没有大小限制,在高并发情况下,缓存会无限制的增长,最终导致,内存溢出。
可以使用:Caffeine来代替默认实现,可以提升更好的性能和内存关林能力
暴漏了一些端点
健康检查,配置信息,环境变量
这些在测试环境可以能很有用,但是在生产容易有安全隐患。
文件大小限制
单个文件只能上传1MB,整个请求限制是10MB
在实际的业务这个限制是不够用的,用户上传稍微大一点的就会报错,当用户上传一些高清文件时后就会报错,
异步线程池的配置
默认使用的是:SimpleAsyncTaskExecutor,这个每次都会创建新的线程池,没有线程池复用机制,高并发情况下会创建大量的线程,最终导致系统资源耗尽。
测试环境可以不明显,但是生产环境量比较大的时候,比如短信,推送,如果每个线程是1MB栈内存,创建几千个线程就是几GB内存。更严重的是,线程池切换开销,cpu大部分时间都在做上下游的切换,真正的业务逻辑反而执行的很慢。
建议:如果是cpu密集型任务,线程设置为CPU的核数就够了,如果是IO密集型任务,可以设置为CPU核数据的2-3倍。
静态资源缓存策略
默认是不为静态资源设置HTTP缓存头,这意味着浏览器每次都会重新请求CSS,JS,图片等静态文件,严重影响加载性能。
用户每次访问页面,浏览器都要重新下载所有静态资源,即使这些文件根本没有变化,对于资源较多的单页面来说,这个问题特别的明显,用户看到的就是页面加载慢,特别是网络不好的时候,体验感觉很差。
2.开启内容版本化策略,springboot会根绝文件内容生成MD5的哈希值作为版本号,文件名称变为style-abc123.css,这样的格式,当文件内容发生变化的时候,哈希值也会变化,浏览器会认为,这是新文件重新下载,如果文件没有变化,浏览器就直接使用缓存,有效提升页面加载速度。
数据库事务超时:
@Transational注解默认没有设置超时时间,长时间的运行事务会一直持有数据库锁,影响其他的操作执行,特别在批量数据处理时候,很容易锁表。
比如一个处理数据导入,需要处理几万条数据,如果放在一个事务里,可能运行几分钟,或者更长时间,在这期间相关的表都被锁住,其他用户的操作只能等待,系统响应会变得很慢。
对于大批量的数据处理,建议分成小事务,这样即使小事务失败,也不会影响整体的进度,而且可以释放数据库梭,提高系统的性能并发。
同时要加上:rollbackFor=Exception.class,确保所有异常都会触发回滚,避免数据不一致的问题。
浙公网安备 33010602011771号