导入依赖
<properties>
<curator.version>4.2.0</curator.version>
</properties>
<!-- curator ZK 客户端 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${curator.version}</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${curator.version}</version>
</dependency>
配置文件
根路径下新建zookeeper.properties
zk.host=192.168.81.128:2181
# zk自增存储node
zk.sequence-path=/news/sequence/
枚举封装
创建com.demo.common.zookeeper.sequence.ZkSequenceEnum文件,用于定义通过Zk生成自增ID的枚举,在项目中规范要求与物理表名项目,使用与当前项目阶段的枚举如下:
package com.demo.common.zookeeper.sequence;
public enum ZkSequenceEnum {
AP_LIKES,
AP_READ_BEHAVIOR,
AP_COLLECTION,
AP_USER_FOLLOW,
AP_USER_FAN
}
序列封装
创建com.demo.common.zookeeper.sequence.ZkSequence文件,用于封装程序在运行时每个表对应的自增器,这里主要通过分布式原子自增类(DistributedAtomicLong)实现,注意每500毫秒重试3次后仍然生成失败则返回null,由上层处理,相关实现代码如下:
package com.demo.common.zookeeper.sequence;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.atomic.AtomicValue;
import org.apache.curator.framework.recipes.atomic.DistributedAtomicLong;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class ZkSequence {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(500, 3);
DistributedAtomicLong distAtomicLong;
public ZkSequence(String sequenceName, CuratorFramework client) {
distAtomicLong = new DistributedAtomicLong(client, sequenceName, retryPolicy);
}
/***
* 生成序列
* @return
* @throws Exception
* */
public Long sequence() throws Exception {
AtomicValue<Long> sequence = this.distAtomicLong.increment();
if (sequence.succeeded(