package com.xiaopeng.order.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); } }