|
|
|
@ -15,17 +15,31 @@ import javax.annotation.PostConstruct;
|
|
|
|
|
/**
|
|
|
|
|
* 基于ZK节点序列
|
|
|
|
|
*/
|
|
|
|
|
// 使用@Component注解将该类标记为Spring容器中的一个组件,方便Spring进行管理和依赖注入等操作
|
|
|
|
|
@Component
|
|
|
|
|
// 使用lombok的@Slf4j注解,用于自动生成日志相关代码,便于在类中记录各种日志信息
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class WorkerIDSenquence {
|
|
|
|
|
|
|
|
|
|
// 使用@Value注解从Spring配置文件(或环境变量等配置源)中读取名为"zk.host"的配置值,并注入到该变量中,
|
|
|
|
|
// 此变量表示Zookeeper服务器的主机地址,用于后续连接Zookeeper
|
|
|
|
|
@Value("${zk.host}")
|
|
|
|
|
private String ZkHost ;
|
|
|
|
|
|
|
|
|
|
// 定义一个静态的常量字符串,表示在Zookeeper中的节点路径,用于存放与雪花算法工作ID相关的信息,
|
|
|
|
|
// 这里的路径是固定的,后续操作会基于此路径在Zookeeper中进行节点的创建、查询等操作
|
|
|
|
|
private static final String ZK_PATH = "/snowflake/workID";
|
|
|
|
|
|
|
|
|
|
// 定义一个静态的CuratorFramework类型的变量,CuratorFramework是用于操作Zookeeper的客户端框架,
|
|
|
|
|
// 在这里用于与Zookeeper服务器进行交互,比如创建节点、查询节点等,此处先声明,后续在初始化方法中进行实例化并启动
|
|
|
|
|
private static CuratorFramework client;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 该方法使用了@PostConstruct注解,意味着此方法会在类实例化且依赖注入完成后自动被调用,用于初始化Zookeeper相关节点
|
|
|
|
|
* 首先通过CuratorFrameworkFactory创建一个连接到Zookeeper服务器的客户端实例,配置了重试策略(最多重试10次,每次间隔5000毫秒)
|
|
|
|
|
* 然后启动客户端连接,连接成功后会在日志中记录相应信息,接着检查在Zookeeper中指定的节点路径(ZK_PATH)是否存在,
|
|
|
|
|
* 如果不存在,则创建该节点,并设置节点的创建模式为持久化(CreateMode.PERSISTENT),确保节点在服务器重启等情况下依然存在
|
|
|
|
|
*/
|
|
|
|
|
@PostConstruct
|
|
|
|
|
void initZKNode() throws Exception {
|
|
|
|
|
client = CuratorFrameworkFactory.newClient(ZkHost,new RetryNTimes(10, 5000));
|
|
|
|
@ -37,6 +51,13 @@ public class WorkerIDSenquence {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 该方法用于获取一个序列值,这个序列值可能用于雪花算法中的工作ID分配等场景
|
|
|
|
|
* 首先判断传入的主机名(hostname)是否为空,如果为空则设置一个默认的主机名"snowflake_"
|
|
|
|
|
* 然后通过Zookeeper客户端在指定的节点路径(ZK_PATH)下创建一个临时顺序节点(CreateMode.EPHEMERAL_SEQUENTIAL),
|
|
|
|
|
* 节点的完整路径会基于传入的主机名进行拼接,创建成功后,从节点路径字符串中提取最后四位数字作为序列值(这里假设节点路径命名有一定规范),
|
|
|
|
|
* 最后将提取到的序列值以长整型的形式返回,这个序列值可用于后续相关业务逻辑,比如作为工作ID的一部分等
|
|
|
|
|
*/
|
|
|
|
|
public long getSequence(String hostname) throws Exception {
|
|
|
|
|
if(StringUtils.isBlank(hostname)){
|
|
|
|
|
hostname = "snowflake_";
|
|
|
|
|