** 情景模式是因为系统生成密钥速度慢,所以在项目启动的时候就开始生成一定量的密钥,在使用时消耗.有一个监控会每隔几秒中监控一次密钥池,如果发现数量低于一个阀值就继续生成.直到最大量阀值.**
具体代码如下:
import org.shredzone.acme4j.util.KeyPairUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.security.KeyPair;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Component
public class KeyPairManager {
private static final Logger logger = LoggerFactory.getLogger(KeyPairManager.class);
private static final int KEY_SIZE = 4096;
private static final int INITIAL_NUM_KEYS = 100;
private static final int MIN_NUM_KEYS = 20;
private static final int ADDITIONAL_KEYS = 50; // 每次生成的额外KeyPair数量
private static final List<KeyPair> keyPairs = new CopyOnWriteArrayList<>();
private static final ExecutorService keyPairGenerator = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
private static final Random random = new Random();
{
// 初始化生成KeyPair
generateKeyPairs(INITIAL_NUM_KEYS);
// 定时任务,检查KeyPair数量
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(KeyPairManager::checkAndGenerateKeyPairs, 0, 2, TimeUnit.SECONDS);
}
private static void generateKeyPairs(int numKeys) {
for (int i = 0; i < numKeys; i++) {
keyPairGenerator.submit(() -> {
KeyPair keyPair = KeyPairUtils.createKeyPair(KEY_SIZE);
keyPairs.add(keyPair);
});
}
}
private static void checkAndGenerateKeyPairs() {
int currentSize = keyPairs.size();
if (currentSize < MIN_NUM_KEYS) {
logger.info("当前KeyPair数量: {},少于{},正在生成更多KeyPair...", currentSize, MIN_NUM_KEYS);
generateKeyPairs(ADDITIONAL_KEYS);
}
}
static KeyPair getRandomKeyPairAndRemove() {
synchronized (keyPairs) {
if (!keyPairs.isEmpty()) {
int randomIndex = random.nextInt(keyPairs.size());
return keyPairs.remove(randomIndex);
} else {
return null;
}
}
}
}