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

news/2024/9/25 4:20:09/

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

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/news/1530112.html

相关文章

算法练习题26——等差素数数列 (2017年蓝桥杯试题B)

题目描述 我们知道&#xff0c;素数是只能被1和它自身整除的正整数&#xff0c;比如&#xff1a;2, 3, 5, 7, 11, 13, 17, 19, 23, 29 等。 类似地&#xff0c;如果一个数列中的所有元素都是素数&#xff0c;并且这些素数构成了一个等差数列&#xff08;即公差相等&#xff0…

【Linux探索学习】第一弹——Linux的基本指令(上)——开启Linux学习第一篇

前言&#xff1a; 在进入Linux学习之前&#xff0c;我们首先要先做好以下两点&#xff1a;1、已经基本掌握C语言或C&#xff0c;2、已经配置好了Linux的环境&#xff0c;做完以上两点后我们就开始Linux的学习&#xff0c;今天我们首先要学习的就是Linux中最基础的操作&#xff…

CSS的文本属性

text-align属性 指定文本的水平对齐方式 left: 文本居左对齐&#xff08;默认值) right: 居右对齐 center&#xff1a;居中对齐 .p1{text-align: left;}.p2{text-align: right;}.p3{text-align: center;} text-decorration属性 规定添加到文本的修饰&#xff0c;下划线&am…

React基础教程(10):React Hooks

9.1 使用hooks理由 高阶组件为了复用,导致代码层级复杂。生命周期的复杂。写成函数组件,无状态组件,因为需要状态,又写成了class,成本高9.2 useState(保存组件状态) const [state, setState] = useState(initialState);案例:点击按钮修改name

深入理解Go并发编程:避免Goroutine泄漏与错误处理

Go语言以其强大的并发模型和高效的协程(goroutine)而闻名。协程的轻量级和易用性使得并发编程变得更加简单。然而,如果不正确管理协程,可能会导致Goroutine泄漏,从而消耗系统资源,影响程序性能。本文将深入探讨如何避免Goroutine泄漏,并提供实用的代码示例和技巧,帮助您…

Qt圆角窗口

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

基于51单片机的汽车倒车防撞报警器系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 本课题基于微控制器控制器&#xff0c; 设计一款汽车倒车防撞报警器系统。 要求&#xff1a; 要求&#xff1a;1.配有距离&#xff0c; 用于把车和障碍物之间的距离信号送入控制器。 2.配有报警系…

执行网络攻击模拟的 7 个步骤

在进攻和防守策略方面&#xff0c;我们可以从足球队和美式足球队身上学到很多东西。球员们会分析对方球队的策略&#xff0c;找出弱点&#xff0c;相应地调整进攻策略&#xff0c;最重要的是&#xff0c;练习、练习、再练习。作为最低要求&#xff0c;网络安全部门也应该这样做…