问题
在项目中使用使用SecureRandom的generateSeed来获取随机数,在windowns系统下调试没有什么大的问题,部署到linux系统上一旦访问的人数增加,再调用这个获取随机数的接口时会卡在这个方法上。
查看源码
翻译:注意:根据实现的不同,generateSeed, reseed和nextBytes方法可能会在熵被收集时阻塞,例如,如果熵源在各种类unix操作系统上是/dev/random。
dev/random是Linux特殊的设备文件,可以用作随机数发生器。
在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到从别的设备中收集到了足够的环境噪声为止。
SecureRandom在Linux默认使用NativePRNG算法(很慢),在Windows默认使用SHA1PRNG算法。
解决方案
在启动命令中添加
-Djava.security.egd=file:/dev/urandom
重新启动就不会有这样的问题了