隨着微服務技術快速發展,SpringCloud與Docker新的技術也不斷涌現出來,但是SpringCloud已SpringBoot爲基礎開發的默認內嵌Tomcat服務器,在SpringCloud與Docker整合的時候,使用docker DockerFile或者docker-compose啓動鏡像文件的時候,需要同時啓動多個Tomcat,由於Tomcat 的sessionId在啓動使用Java的SecureRandom類進行隨機生成,所以啓動較慢。可以通過使用cat /usr/jdk1.8.0_131/jre/lib/security/java.security | grep random 命令在jre中查看Java默認的隨機數生成策略,
可以看到隨機數的生成是依靠linux系統random生成的,jdk8默認的隨機算法是NativePRNG 由於Linux /dev/random是阻塞的算法生成器 所以在生成sessionId時阻塞的。
wiki是這樣說的
1.發生器有一個容納噪聲數據的熵池,在讀取時,/dev/random設備會返回小於熵池噪聲總數的隨機字節。/dev/random可生成高隨機性的公鑰或一次性密碼本。若熵池空了,對/dev/random的讀操作將會被阻塞,直到收集到了足夠的環境噪聲爲止[3]。這樣的設計使得/dev/random是真正的隨機數發生器,提供了最大可能的隨機數據熵,建議在需要生成高強度的密鑰時使用。
2./dev/random的一個副本是/dev/urandom(“unblocked”,非阻塞的隨機數發生器[4]),它會重複使用熵池中的數據以產生僞隨機數據。這表示對/dev/urandom的讀取操作不會產生阻塞,但其輸出的熵可能小於/dev/random的。它可以作爲生成較低強度密碼的僞隨機數生成器,不建議用於生成高強度長期密碼。/dev/random也允許寫入,任何用戶都可以向熵池中加入隨機數據。即使寫入非隨機數據亦是無害的,因爲只有管理員可以調用ioctl以增加熵池大小。Linux內核中當前熵的值和大小可以通過訪問/proc/sys/kernel/random/文件夾中的文件得到。
random可以生成高強度的祕銀使用這也許就是爲什麼jdk默認是使用它吧
對於JDK7與JDK8版本間也有很大的差異 github上用strace命令進行分析的 相比較來說jdk8更好一些地址https://gist.github.com/svrc/5a8accc57219b9548fe1
那麼我們怎樣在實際中使用命令的方式選擇用那種方式進行算法生成
使用java -Djava.security.egd=file:/dev/./urandom -jar test.jar 指定了以urandom的方式(中間的.好像是用於解決jdk7的一個bug 好像jdk8已經修復了)
因此在使用java -Djava.security.egd=file:/dev/./urandom -jar test.jar 進行jar包啓動時,可以提高Tomcat的啓動速度