package com.xiaopeng.operation.config;
|
|
import cn.hutool.core.lang.Snowflake;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Configuration;
|
|
import java.util.Date;
|
|
@Configuration
|
public class SnowflakeConfig {
|
|
//初始时间戳,设为2026年1月1日0点0时0分
|
public static final Date EPOCH_DATE = new Date(1767225600000L);
|
/**
|
* 如果配置为<0的值,则woker-id根据pod名的hash取模生成
|
* 如果配置为>=0的值,则取配置的值
|
* 如果多个pod的data-center-id和worker-id相同,同一毫秒内请求数上千的话,可能会产生碰撞,生成一样的snowflake id
|
*/
|
@Value("${snowflake.worker-id:-1}")
|
private long workerId;
|
|
@Value("${snowflake.data-center-id:0}")
|
private long dataCenterId;
|
|
@Bean("hutoolSnowflake")
|
public Snowflake snowflake() {
|
long resolvedWorkerId = resolveWorkerId();
|
return new Snowflake(EPOCH_DATE, resolvedWorkerId, dataCenterId, false);
|
}
|
|
private long resolveWorkerId() {
|
if (workerId >= 0 && workerId <= Snowflake.MAX_WORKER_ID) {
|
return workerId;
|
}
|
String podName = System.getenv("HOSTNAME");
|
if (podName == null || podName.isEmpty()) {
|
return 0;
|
}
|
int end = podName.length() - 1;
|
while (end >= 0 && Character.isDigit(podName.charAt(end))) {
|
end--;
|
}
|
String numberPart = podName.substring(end + 1);
|
long candidate;
|
if (!numberPart.isEmpty()) {
|
try {
|
candidate = Long.parseLong(numberPart);
|
} catch (NumberFormatException e) {
|
candidate = Math.abs(podName.hashCode());
|
}
|
} else {
|
candidate = Math.abs(podName.hashCode());
|
}
|
return candidate % (Snowflake.MAX_WORKER_ID + 1);
|
}
|
}
|