背景
生产环境有个功能点击后很慢。
前端调用后端接口是30秒,后端接口没能在30秒内返回。
现象
现象是在页面里点击某按钮,一直loading,后端也无法正常返回数据。
排查
去docker里执行如下
jps
jstack 1 > 1.log
查看线程信息 cat 1.log
, 发现有这么一段
"executor-thread-20" #45 [48] daemon prio=5 os_prio=0 cpu=564.33ms elapsed=76.05s tid=0x00007fbb799d12e0 nid=48 runnable [0x0
0007fbb5115e000]
java.lang.Thread.State: RUNNABLE
at java.io.FileInputStream.readBytes(java.base@21.0.7/Native Method)
at java.io.FileInputStream.read(java.base@21.0.7/FileInputStream.java:287)
at java.io.FilterInputStream.read(java.base@21.0.7/FilterInputStream.java:119)
at sun.security.provider.NativePRNG$RandomIO.readFully(java.base@21.0.7/NativePRNG.java:432)
at sun.security.provider.NativePRNG$RandomIO.ensureBufferValid(java.base@21.0.7/NativePRNG.java:535)
at sun.security.provider.NativePRNG$RandomIO.implNextBytes(java.base@21.0.7/NativePRNG.java:554)
- locked <0x00000000c09e4c88> (a java.lang.Object)
at sun.security.provider.NativePRNG$Blocking.engineNextBytes(java.base@21.0.7/NativePRNG.java:274)
at java.security.SecureRandom.nextBytes(java.base@21.0.7/SecureRandom.java:768)
at org.apache.commons.lang3.CachedRandomBits.<init>(CachedRandomBits.java:67)
at org.apache.commons.lang3.RandomStringUtils.random(RandomStringUtils.java:327)
at org.apache.commons.lang3.RandomStringUtils.random(RandomStringUtils.java:286)
at org.apache.commons.lang3.RandomStringUtils.next(RandomStringUtils.java:732)
at org.apache.commons.lang3.RandomStringUtils.next(RandomStringUtils.java:692)
at org.apache.commons.lang3.RandomStringUtils.nextAlphanumeric(RandomStringUtils.java:823)
at xx.xxx.TokenProvider.createToken(TokenProvider.java:54)
而TokenProvider的第54行是在这样一个方法里。
import org.apache.commons.lang3.RandomStringUtils;
public staticString createToken() {
// 下一行是第54行
String r = RandomStringUtils.secureStrong().nextAlphanumeric(8);
return UUID.randomUUID().toString().replace("-", "") + "-" + r;
}
很明显是这个secureStrong导致的。
修改为不安全的(此方法并发量并不高)。
String r = RandomStringUtils.insecure().nextAlphanumeric(8);
问题解决。