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

devtools/2024/9/25 4:21:42/

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

java">/*** 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接口差不多

java">@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);// 如果初始化成功,即返回的客户端对象不为 nullif (restHighLevelClient!= null) {// 将配置名称和对应的客户端对象放入名为 clientMap 的映射中,方便后续根据配置名称获取对应的客户端clientMap.put(esConfig.getName(), restHighLevelClient);} else {// 如果初始化失败,打印错误日志,记录配置名称和节点信息以及初始化错误的提示log.error("config.name:{},node:{}.initError", esConfig.getName(), esConfig.getNodes());}}
}

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

java">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.ppmy.cn/devtools/116803.html

相关文章

1--SpringBoot外卖项目介绍及环境搭建 详解

目录 软件开发整体流程 软件开发流程 角色分工 软件环境 苍穹外卖项目介绍 项目介绍 产品原型 技术选型 开发环境搭建 前端环境搭建 后端环境搭建 完善登录功能 导入接口文档 Swagger 介绍 使用方式 常用注解 软件开发整体流程 软件开发流程 需求分析&#x…

搭建cdh集群及问题处理

CM安装部署 1、MySQL中建库-创建各组件需要的数据库 CREATE DATABASE scm DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; CREATE DATABASE hive DEFAULT CHARSET utf8 COLLATE utf8_general_ci; CREATE DATABASE oozie DEFAULT CHARSET utf8 COLLATE utf8_gene…

[SDX35]SDX35如何查看GPIO的Base值

SDX35 SDX35介绍 SDX35设备是一种多模调制解调器芯片,支持 4G/5G sub-6 技术。它是一个4nm芯片专为实现卓越的性能和能效而设计。它包括一个 1.9 GHz Cortex-A7 应用处理器。 SDX35主要特性 ■ 3GPP Rel. 17 with 5G Reduced Capability (RedCap) support. Backward compati…

全局中断总开关位与各个中断源对应的寄存器使能位开启顺序

在微控制器中&#xff0c;中断总开关通常用来全局性地控制中断的使能和关闭。对于各个中断的位使能&#xff0c;则是用来单独控制每个中断源的使能状态。配置它们的先后关系通常遵循以下步骤&#xff1a; 1.全局中断禁能&#xff1a;首先&#xff0c;需要禁止中断总开关&#x…

Qt圆角窗口

Qt圆角窗口 问题&#xff1a;自己重写了一个窗口&#xff0c;发现用qss设置圆角了&#xff0c;但是都不生效&#xff0c;不过子窗口圆角都生效了。 无边框移动窗口 bool eventFilter(QObject *watched, QEvent *evt) {static QPoint mousePoint;static bool mousePressed f…

模拟自然的本质:与IBM量子计算研究的问答

量子计算可能是计算领域的下一个重大突破&#xff0c;但它的一般概念仍然处于炒作和猜测的现状&#xff1f;它能破解所有已知的加密算法吗&#xff1f;它能设计出治愈所有疾病的新分子吗&#xff1f;它能很好地模拟过去和未来&#xff0c;以至于尼克奥弗曼能和他死去的儿子说话…

老板让我搞一个请假审批流程,我一行代码搞定(Java版)

老板让我搞一个请假审批流程,我一行代码搞定(Java版) 工作流审批功能是办公OA系统核心能力,如果让你设计一个工作流审批系统,你会吗?千万不要小瞧OA内部系统的复杂性,大家可以头脑风暴思考一下实现方案。 要明白工作流审批涉及多个用户的任务流转,多个流程分支跳转,…

WebGL阴影与后期处理

目录 基本后期处理复杂后期处理效果高级视觉效果基本后期处理 阴影贴图(Shadow Mapping) 阴影贴图是一种常用的技术,用于实现实时阴影。它通过从光源视角渲染场景的深度信息,并在主渲染中使用这个深度信息来判断像素是否在阴影中。以下是一个简化的流程: 在光源视角生成阴…