SpringBoot 使用 TransportClient 连接 Elasticsearch 一直报错,检查配置和过程后无解,寻找更好的兼容方案,通过官方文档知道将客户端依赖替换为 RestHighLevelClient
Elasticsearch 从 5.x 升级到 6.8.x,原本使用的是 TransportClient 作为 Java 客户端 API。
升级完成后,使用 PostMan 访问正常,使用 URL 直连也正常。
仔细检查了 cluster.name 配置,IP 端口 依赖版本 等配置确认无误。
但是使用 API 查询始终报错:
None of the configured nodes are available: [{#transport#-1}{*.*.*.*}{*.*.*.*:*}]]
尝试了不少方案,在代码中关闭嗅探、关闭集群校验、关闭连接池等等,始终无解。
只能怀疑是否因为升级的原因导致?
但由于不能够考虑全新安装,因为未来生产环境也是从低版本升级上来,因此寻找更好的替代方案。
遇事不决问官网。
官网提供了两种形式的 RestAPI 客户端用来替代 TransportClient 。
RestClient 相比较 TransportClient 而言,直接执行 HTTP 请求而不是序列化的 Java 请求。
TransportClient 基于 TCP 方式访问 ES,这将依赖于一个默认 TCP 端口 9300 。
这样说来,RestClient 的兼容性会更好。
RestClient 区分高级和低级两种,简单来说低级客户端就类似于 HttpClient 这种收发 HTTP 请求的工具包。
高级客户端基于低级客户端做了一些常用的封装,可以直接获得一些实用的对象和方法。
低级客户端可以自由完成更多的操作,高级客户端则是懒人必备(比如我)。
如果确实有些非常特殊的诉求,即便使用高级客户端依旧可以自由调用低级客户端。
整个改在过程非常流畅,这得益于官方提供了详细的手册文档。
下文将依照文档,提取关联改造内容进行说明。
<!-- 基本依赖不变 -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<!-- 建议与 ES 版本一致 -->
<version>6.8.15</version>
</dependency>
<!-- 客户端 -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<!-- 修改此处依赖 -->
<!-- <artifactId>transport</artifactId> -->
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<!-- 使用高级客户端建议与 ES 版本一致 -->
<version>6.8.15</version>
</dependency>
在使用 TransportClient 时以定为其配置了自定义 Bean,这里直接贴出新配置。
/**
* restHighLevelClient 客户端初始化
*
* @return
*/
@Bean(name = "restHighLevelClient")
public RestHighLevelClient restHighLevelClient() {
RestHighLevelClient client = new RestHighLevelClient(
// 此处实际调用了低级客户端
// 如果有多个地址,可以重复此行代码,也可以定义一个 HttpHost[] 传入 RestClient.builder()
RestClient.builder( new HttpHost("192.168.1.123",10086,"http"))
/** 类似下方代码
// 提供对多地址的兼容 预计规则 以逗号隔开
String[] ips = hostName.split(",");
String[] ports = port.split(",");
// 构建一个与配置同长度的地址数组
HttpHost[] httpHosts = new HttpHost[ips.length];
for(int i=0;i<ips.length;i++) {
httpHosts[i] = new HttpHost(ips[i],Integer.valueOf(ports[i]),"http");
}
// 配置全部客户端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(httpHosts)
);
*/
);
return client;
}
这里简单编写一个查询实例,实际业务代码可以直接查阅官方 API 文档。
文档地址:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/java-rest-high.html
@Resource
private RestHighLevelClient client;
@Override
public Object getPage(){
// 条件查询
SearchRequest request = new SearchRequest();
// 指定索引
request.indices("test");
SearchSourceBuilder builder = new SearchSourceBuilder();
// 起始数目
builder.from(0);
builder.size(10);
request.source(builder);
// 实际业务代码建议封装一个 utils 类
try {
return client.search(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
温馨提示:系统将通过浏览器临时记忆您曾经填写的个人信息且支持修改,评论提交后仅自己可见,内容需要经过审核后方可全面展示。