springboot2.x连接zookeeper

1、引入相关依赖

    <properties>
        <java.version>1.8</java.version>
        <lombok.version>1.18.12</lombok.version>
        <zookeeper.version>3.6.0</zookeeper.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
    </dependencies>

2、连接配置

@Configuration
public class ZookeeperConfig {
    private static final Logger logger = LoggerFactory.getLogger(ZookeeperConfig.class);

    @Value("${zookeeper.address}")
    private    String connectString;

    @Value("${zookeeper.timeout}")
    private  int timeout;


    @Bean(name = "zkClient")
    public ZooKeeper zkClient(){
        ZooKeeper zooKeeper=null;
        try {
            final CountDownLatch countDownLatch = new CountDownLatch(1);
            //连接成功后,会回调watcher监听,此连接操作是异步的,执行完new语句后,直接调用后续代码
            zooKeeper = new ZooKeeper(connectString, timeout, new Watcher() {
                @Override
                public void process(WatchedEvent event) {
                    logger.info("receive event:" + event.toString());
                    if(Event.KeeperState.SyncConnected==event.getState()){
                        //如果收到了服务端的响应事件,连接成功
                        countDownLatch.countDown();
                    }
                }
            });
            countDownLatch.await();
            logger.info("【初始化ZooKeeper连接状态....】={}",zooKeeper.getState());

        }catch (Exception e){
            logger.error("初始化ZooKeeper连接异常....】={}",e);
        }
        return  zooKeeper;
    }

}

3、测试zookeeper的api

@Slf4j
@Component
public class ZnodeTest implements CommandLineRunner {

    @Autowired
    private ZooKeeper zkClient;

    @Override
    public void run(String... args) throws Exception {
        List<String> children = zkClient.getChildren("/test1", new CustomWatcher());
        log.info("children: "+ children);
        if(!ObjectUtils.isEmpty(children)){
            for (int i = 0; i < children.size(); i++) {
                byte[] data = zkClient.getData("/test1/" + children.get(i), false, null);
                if (data != null) {
                    log.info("get child "+"/test1/"+children.get(i)+":"+new String(data));
                }else{
                    log.info("get child "+"/test1/"+children.get(i)+":"+null);
                }

            }

        }
    }
}

@Slf4j
public class CustomWatcher implements Watcher {

    @Override
    public void process(WatchedEvent watchedEvent) {
        log.info(watchedEvent.toString());
    }
}

在这里插入图片描述
Zookeeper中还有创建znode、删除znode、判断是否存在等api,就不一个一个去试了。

4、Apache Curator

连接zookeeper的java客户端还有一种叫curator。
增加依赖

		<dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>${curator.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>${curator.version}</version>
        </dependency>

properties中增加

<curator.version>4.3.0</curator.version>

curator方式配置连接

@Configuration
public class CuratorConfiguration {

    @Value("${curator.retryCount}")
    private int retryCount;

    @Value("${curator.elapsedTimeMs}")
    private int elapsedTimeMs;

    @Value("${curator.connectString}")
    private String connectString;

    @Value("${curator.sessionTimeoutMs}")
    private int sessionTimeoutMs;

    @Value("${curator.connectionTimeoutMs}")
    private int connectionTimeoutMs;

    @Bean(initMethod = "start")
    public CuratorFramework curatorFramework() {
        return CuratorFrameworkFactory.newClient(
                connectString,
                sessionTimeoutMs,
                connectionTimeoutMs,
                new RetryNTimes(retryCount, elapsedTimeMs));
    }
}

application.properties中增加

#重试次数
curator.retryCount=5
#重试间隔时间
curator.elapsedTimeMs=5000
# zookeeper 地址
curator.connectString=127.0.0.1:2181
# session超时时间
curator.sessionTimeoutMs=60000
# 连接超时时间
curator.connectionTimeoutMs=5000

测试API

@Slf4j
@Component
public class CuratorZnodeTest implements CommandLineRunner {

    @Autowired
    private CuratorFramework zkClient;

    @Override
    public void run(String... args) throws Exception {
        GetChildrenBuilder children = zkClient.getChildren();
        log.info("get children by Curator:"+children.forPath("/test1"));
    }
}

在这里插入图片描述

5、Java客户端的选择

Zookeeper原生Java API、ZKClient和Apache Curator 区别对比

参考

SpringBoot集成Zookeeper
缓存架构SpringBoot集成Curator实现zookeeper分布式锁

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值