Curator 工具类ZKCuratorUtil

import cn.bugstack.middleware.schedule.common.Constants;
import cn.bugstack.middleware.schedule.domain.Instruct;
import com.alibaba.fastjson.JSON;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.nodes.PersistentEphemeralNode;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;


/**
* zk工具类 curator
*/
public class ZkCuratorUtil {
    private static Logger logger = LoggerFactory.getLogger(ZkCuratorUtil.class);
    public static CuratorFramework client;
    public static String CHARSET_NAME = "utf-8";
    
    
    public static CuratorFramework getClient(String connectString) {
        if (null != client) return client;
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);
        //添加重连监听
        client.getConnectionStateListenable().addListener((curatorFramework, connectionState) -> {
            switch (connectionState) {
                //Sent for the first successful connection to the server
                case CONNECTED:
                    logger.info("middleware schedule init server connected {}", connectString);
                    break;
                //A suspended, lost, or read-only connection has been re-established
                case RECONNECTED:


                    break;
                default:
                    break;
            }
        });
        client.start();
        ZkCuratorUtil.client = client;
        return client;
    }


    //所有子节点监听
    public static void addTreeCacheListener(final ApplicationContext applicationContext, String path) throws Exception {
        TreeCache treeCache = new TreeCache(client, path);
        treeCache.start();
        treeCache.getListenable().addListener((curatorFramework, event) -> {
            if (null == event.getData()) return;
            byte[] eventData = event.getData().getData();
            if (null == eventData || eventData.length < 1) return;
            String json = new String(eventData, CHARSET_NAME);
            if ("".equals(json) || json.indexOf("{") != 0 || json.lastIndexOf("}") + 1 != json.length()) return;
            Instruct instruct = JSON.parseObject(new String(event.getData().getData(), CHARSET_NAME), Instruct.class);
            switch (event.getType()) {
                case NODE_ADDED:
                case NODE_UPDATED:
                    break;
                case NODE_REMOVED:
                    break;
                default:
                    break;
            }
        });
    }


    //创建节点
    public static void createNode(String path) throws Exception {
        List<String> pathChild = new ArrayList<>();
        pathChild.add(path);
        while (path.lastIndexOf(Constants.Global.LINE) > 0) {
            path = path.substring(0, path.lastIndexOf(Constants.Global.LINE));
            pathChild.add(path);
        }
        for (int i = pathChild.size() - 1; i >= 0; i--) {
            Stat stat = client.checkExists().forPath(pathChild.get(i));
            if (null == stat) {
                client.create().creatingParentsIfNeeded().forPath(pathChild.get(i));
            }
        }
    }


    //创建节点
    public static void createNodeSimple(String path) throws Exception {
        if (null == client.checkExists().forPath(path)) {
            client.create().creatingParentsIfNeeded().forPath(path);
        }
    }


    //删除节点
    public static void deleteNodeSimple(String path) throws Exception {
        if (null != client.checkExists().forPath(path)) {
            client.delete().deletingChildrenIfNeeded().forPath(path);
        }
    }


    //设置数据
    public static void setData(String path, String data) throws Exception {
        if(null == client.checkExists().forPath(path)) return;
        client.setData().forPath(path, data.getBytes(Constants.Global.CHARSET_NAME));
    }


    //获取数据
    public static byte[] getData(String path) throws Exception {
        return client.getData().forPath(path);
    }


    //删除数据
    public static void deleteDataRetainNode(String path) throws Exception {
        if (null != client.checkExists().forPath(path)) {
            client.delete().forPath(path);
        }
    }


    //添加临时节点数据
    public static void appendPersistentData(String path, String data) throws Exception {
        PersistentEphemeralNode node = new PersistentEphemeralNode(client, PersistentEphemeralNode.Mode.EPHEMERAL, path, data.getBytes(Constants.Global.CHARSET_NAME));
        node.start();
        node.waitForInitialCreate(3, TimeUnit.SECONDS);
    }


    public static void deletingChildrenIfNeeded(String path) throws Exception {
        if (null == client.checkExists().forPath(path)) return;
        // 递归删除节点
        client.delete().deletingChildrenIfNeeded().forPath(path);
    }


}
### 关于 Elasticsearch 8 的工具类和辅助库 对于使用 Elasticsearch 8 版本的应用程序开发而言,存在多种官方支持以及社区贡献的工具类和辅助库来简化操作流程并增强功能特性。 #### 官方客户端库 Elasticsearch 提供了多个官方客户端库用于不同编程语言环境下的集成工作。这些库经过严格测试以确保兼容性和稳定性,并提供详尽文档指导开发者快速上手[^3]。 - **Java High Level REST Client**: 针对 Java 应用而设计,允许通过高级 API 调用来执行各种 CRUD 操作以及其他管理任务。 - **Python Client (elasticsearch-py)**: 支持 Python 生态系统的接口实现,同样具备完整的查询构建器等功能模块以便灵活运用。 - **JavaScript/TypeScript Clients**: 包含 Node.js 和浏览器端两种形式的支持方案,适用于前端与后端场景下数据交互需求。 ```javascript const { Client } = require('@elastic/elasticsearch') const client = new Client({ node: 'http://localhost:9200' }) async function run () { const response = await client.search({ index: 'test', body: { query: { match_all: {} } } }) console.log(response.body.hits.hits) } run().catch(console.error) ``` #### 社区驱动项目 除了上述由 Elastic 维护的产品外,还有许多来自开源社区的力量围绕着这个搜索引擎平台打造了一系列实用插件和服务: - **Curator**: 主要负责索引生命周期管理和优化工作的命令行工具,在自动化维护方面表现出色。 - **Logstash**: 属于 ELK Stack 中的一员,专注于日志收集、处理管道搭建等领域;能够方便地对接 ES 实现复杂的数据流转逻辑。 - **Watcher Plugin**: 可配置告警机制,当满足特定条件时触发通知动作(邮件发送等),有助于实时监控集群状态变化情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值