关于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对象,存储的集群名称和索引,就可以进行具体的操作了