SecureRandom实例创建问题导致Spring Boot首次请求很慢

Creation of SecureRandom Instance is Slow in Spring Boot

今天,在Linux服务器上启动了一个Spring Boot项目后,第一次请求用了很长的时间,查看日志后发现一个关键内容:Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [155,058] milliseconds.

2020-03-20 15:28:15.413 WARN 1995 --- [http-nio-8080-exec-1] o.a.c.util.SessionIdGeneratorBase : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [155,058] milliseconds.

原因分析

从日志的内容我们基本可以知道,是服务接收到第一个请求时,需要为当前会话创建一个Session ID。而创建这个Session ID需要用到 java.security.SecureRandom 这个类来生成一个随机数。就是创建这个类的实例消耗了很长的时间。

在类UNIX的系统上,SecureRandom 会默认使用 /dev/random 文件来获取随机数,通过该文件获取随机数是可能会阻塞的。具体内容可参考维基百科:https://en.wikipedia.org/wiki//dev/random

除了 /dev/random 文件,其实还可以通过另一个文件 /dev/urandom 来获取随机数,两者最主要的一个区别就是通过 /dev/urandom 文件来获取随机数是不会阻塞的:

/dev/random文件的介绍

解决办法

查明原因后,我们就可以通过以下办法来解决这个问题,我们只需要在启动Spring Boot项目时通过命令行指定获取随机数的文件为 /dev/urandom 即可:

java -jar -Djava.security.egd=file:/dev/./urandom project.jar

 

文章评论
${fromAuthor ? '郄正元' : '游客'} 作者 ${gmtCreate}
${content}
${subList.length}
发表评论
${commentToArticle ? '' : parentContent}
字数:0/${maxCommentLength}
该邮箱地址仅用于接收其他用户的回复提醒,不会泄露