当前位置: 首页 > article >正文

关于es的一个多集群、多索引切换的实现

首先是封装了一个类里定义了关于集群名称和集群节点;以及关于索引的名称和集群的名称做一个关联;将多个集群封装存储得到类中

/**
 * es集群类
 */
@Data
public class EsClusterConfig implements Serializable {
    /**
     * 集群名称
     */
    private String name;
    /**
     * 集群节点
     */
    private String nodes;
}

/**
 * 索引类
 */
@Data
public class EsIndexInfo implements Serializable {
    /**
     * 集群名称
     */
    private String clusterName;
    /**
     * 索引名称
     */
    private String indexName;
}

@Component
@ConfigurationProperties(prefix = "es.cluster")
public class EsConfigProperties {
    private List<EsClusterConfig> esConfigs = new LinkedList<>();

    public List<EsClusterConfig> getEsConfigs() {
        return esConfigs;
    }

    public void setEsConfigs(List<EsClusterConfig> esConfigs) {
        this.esConfigs = esConfigs;
    }
}

yml文件中定义关于集群的一个信息:

es:
  cluster:
    es-configs[0]:
      name: 玫瑰不会过期
      nodes: 127.0.0.1:9200

通过@PostConstruct注解实现提前的初始化赋值,和Bean的InitializingBean接口差不多

@PostConstruct
public void initialize() {
    // 从配置属性对象中获取 Elasticsearch 集群配置列表
    List<EsClusterConfig> esConfigs = esConfigProperties.getEsConfigs();
    // 遍历每个 Elasticsearch 集群配置
    for (EsClusterConfig esConfig : esConfigs) {
        // 打印日志,记录当前正在初始化的配置名称和节点信息
        log.info("initialize.config.name:{},node:{}", esConfig.getName(), esConfig.getNodes());
        // 调用 initRestClient 方法初始化与当前配置对应的 RestHighLevelClient(初始话对应的索引)
        RestHighLevelClient restHighLevelClient = initRestClient(esConfig);
        // 如果初始化成功,即返回的客户端对象不为 null
        if (restHighLevelClient!= null) {
            // 将配置名称和对应的客户端对象放入名为 clientMap 的映射中,方便后续根据配置名称获取对应的客户端
            clientMap.put(esConfig.getName(), restHighLevelClient);
        } else {
            // 如果初始化失败,打印错误日志,记录配置名称和节点信息以及初始化错误的提示
            log.error("config.name:{},node:{}.initError", esConfig.getName(), esConfig.getNodes());
        }
    }
}

调用对应的分割方法,存储到HttpHost对象中

private RestHighLevelClient initRestClient(EsClusterConfig esClusterConfig) {
    // 将配置中的节点字符串以逗号分隔,得到各个节点的字符串表示
    String[] ipPortArr = esClusterConfig.getNodes().split(",");
    // 创建一个用于存储 HttpHost 对象的列表
    List<HttpHost> httpHostList = new ArrayList<>(ipPortArr.length);
    // 遍历每个节点字符串
    for (String ipPort : ipPortArr) {
        // 将节点字符串以冒号分隔,得到 IP 和端口信息
        String[] ipPortInfo = ipPort.split(":");
        // 如果正确分割为两部分(IP 和端口)
        if (ipPortInfo.length == 2) {
            // 创建一个 HttpHost 对象,传入 IP 和端口,并将其添加到列表中
            HttpHost httpHost = new HttpHost(ipPortInfo[0], NumberUtils.toInt(ipPortInfo[1]));
            httpHostList.add(httpHost);
        }
    }
    // 将列表转换为数组
    HttpHost[] httpHosts = new HttpHost[httpHostList.size()];
    httpHostList.toArray(httpHosts);
    // 使用 HttpHost 数组创建 RestClientBuilder 对象
    RestClientBuilder builder = RestClient.builder(httpHosts);
    // 使用 RestClientBuilder 创建 RestHighLevelClient 对象
    RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder);
    // 返回创建的 RestHighLevelClient 对象
    return restHighLevelClient;
}

假设esClusterConfig.getNodes()返回的字符串是 "192.168.1.100:9200,192.168.1.101:9200",表示有两个 Elasticsearch 节点,分别在不同的 IP 地址上,端口都是 9200。

执行String[] ipPortArr = esClusterConfig.getNodes().split(",");后,ipPortArr这个数组将包含两个元素: "192.168.1.100:9200" "192.168.1.101:9200" 这样就把配置中的多个以逗号分隔的节点信息拆分成了数组中的单个节点字符串,方便后续进一步处理每个节点的 IP 和端口信息来创建与 Elasticsearch 节点的连接。

最终存储到HttpHost中建立一个RestHighLevelClient对象,来存储到map中,key是集群名称,value就是调用的对应对象

总结

首先封装三个对象一个是关于es集群的对象包括集群名称、该名称下的节点,还有一个索引表存储集群名称和索引的。然后通过@PostConstruct这个注解来实现提前注入,获取到存储集群名称和节点的对象放到RestHighLevelClient这个对象中,将其存储一个map中,后续操作我们只是需要通过get集群名称就可以获取到这个对象了。

而对应的对应的索引的切换只需要,通过传入一个EsIndexInfo对象,存储的集群名称和索引,就可以进行具体的操作了


http://www.kler.cn/news/315538.html

相关文章:

  • [leetcode刷题]面试经典150题之2移除元素(简单)
  • pycharm 使用 translation 插件通过openai进行翻译
  • 怎么能让电脑屏幕显示多个监控画面?电脑监控如何多画面显示?
  • 面向切面:单元测试、事务、资源操作
  • UDP实现组播发送端和接收端
  • [Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
  • 论文阅读 | 基于流模型和可逆噪声层的鲁棒水印框架(AAAI 2023)
  • 【机器学习】OpenCV入门与基础知识
  • 一种求解无人机三维路径规划的高维多目标优化算法,MATLAB代码
  • Java笔试面试题AI答之设计模式(1)
  • uni-app尺寸单位、flex布局于背景图片
  • Java ETL - Apache Beam 简介
  • 如何使用Privoxy将SOCKS5代理转换为HTTP代理?
  • 数据库(mysql)常用命令
  • 妈妈再也不用担心字符串方法啦!——js String实例方法汇总
  • PicoQuant公司:探索铜铟镓硒(CIGS)太阳能电池技术,引领绿色能源革新
  • MySQL之复合查询与内外连接
  • Qt 读写windows注册表
  • 深度学习02-pytorch-02-张量的拼接操作
  • 零工市场小程序:保障灵活就业
  • java(3)数组的定义与使用
  • 基于SpringBoot+WebSocket实现地图上绘制车辆实时运动轨迹图
  • ARM概念
  • android13 RK3588芯片,录音没有声音
  • AIGC时代算法工程师的面试秘籍(第二十二式2024.9.2-9.15) |【三年面试五年模拟】
  • SVN笔记-SVN安装
  • 【Hot100】LeetCode—295. 数据流的中位数
  • 五、CAN总线
  • C++:动态内存分配(new、delete 相比 malloc、free的优势)与运算符重载
  • 线程池动态设置线程大小踩坑