ES的Java客户端TransportClient改造RestHighLevelClient

SpringBoot 使用 TransportClient 连接 Elasticsearch 一直报错,检查配置和过程后无解,寻找更好的兼容方案,通过官方文档知道将客户端依赖替换为 RestHighLevelClient

所属分类 数据库

相关标签 连接Elasticsearch驱动

问题背景

Elasticsearch 从 5.x 升级到 6.8.x,原本使用的是 TransportClient 作为 Java 客户端API。

升级完成后,使用 PostMan 访问正常,使用 URL 直连也正常。

仔细检查了 cluster.name 配置,IP 端口 依赖版本 等配置确认无误。

但是使用 API 查询始终报错:

None of the configured nodes are available: [{#transport#-1}{*.*.*.*}{*.*.*.*:*}]]

尝试了不少方案,在代码中关闭嗅探、关闭集群校验、关闭连接池等等,始终无解。

只能怀疑是否因为升级的原因导致?

但由于不能够考虑全新安装,因为未来生产环境也是从低版本升级上来,因此寻找更好的替代方案。

Rest客户端

遇事不决问官网。

官网提供了两种形式的 RestAPI 客户端用来替代 TransportClient 。

RestClient 相比较 TransportClient 而言,直接执行HTTP请求而不是序列化的Java请求。

TransportClient 基于 TCP 方式访问 ES,这将依赖于一个默认 TCP 端口 9300 。

这样说来,RestClient 的兼容性会更好。

RestClient 区分高级和低级两种,简单来说低级客户端就类似于 HttpClient 这种收发 HTTP 请求的工具包。

高级客户端基于低级客户端做了一些常用的封装,可以直接获得一些实用的对象和方法。

低级客户端可以自由完成更多的操作,高级客户端则是懒人必备(比如我)。

如果确实有些非常特殊的诉求,即便使用高级客户端依旧可以自由调用低级客户端。

整个改在过程非常流畅,这得益于官方提供了详细的手册文档。

指南地址:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.8/java-rest-high-level-migration.html

下文将依照文档,提取关联改造内容进行说明。

<!-- 基本依赖不变 -->
<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;
    }
}

米虫

做一个有理想的米虫,伪全栈程序猿,乐观主义者,坚信一切都是最好的安排!

本站由个人原创、收集或整理,如涉及侵权请联系删除

本站内容支持转发,希望贵方携带转载信息和原文链接

本站具有时效性,不提供有效、可用和准确等相关保证

本站不提供免费技术支持,暂不推荐您使用案例商业化

发表观点

提示

昵称

邮箱

QQ

网址

当前还没有观点发布,欢迎您留下足迹!

同类其他

数据库

Linux下Oracle数据库配置日志目录及统一迁移

很多运维人员习惯采用默认安装的方式安装Oracle数据库,而Oracle日志默认放置在/opt目录下,绝大多数Linux环境的大磁盘往往挂载在/home,因此经常会出现磁盘空间不足的情况,采用本文配置可指定并迁移日志

Oracle数据库基础实用维护命令集

Linux系统下的Oracle数据库实用常用的维护命令整理,本文内容偏向运维,主要包含:基础启动重启、表空间维护、数据库角色与用户维护、字符集配置等,并给出各类场景的实例语句

ORA-00257: archiver error. Connect internal only, until freed.

登录Oracle报错 ORA-00257: archiver error. Connect internal only, until freed. 由于归档日志(archive log)已满引起的。

Oracle存储过程Procedure基础语法

存储过程是个好东西,WEB工程在架构阶段会设计很多存储过程,后续在架构中开发需求的时候,反而会直接写SQL完成各项诉求。所以说,这玩意儿略微有那么一点点伪高端。

Oracle数据库MERGE INTO语句条件入库

Oracle 9i版本引入MERGE INTO语句,其主要用于实现条件入库能力,用于解决对于已有数据更新升级的情况,即可实现不存在数据则插入,存在数据则更新的分支判断形式的更新能力

MongoDB通过$lookup实现多表连接查询

对于数据库而言,多表连接操作可以算的上是基本操作,在 MongoDB 通过 $lookup 聚合查询可以实现多表左连接查询,在后续的版本中 $lookup 得到了一系列的增强,实现更为复杂的关联查询

选择个人头像

昵称

邮箱

QQ

网址

评论提示

  • 头像:系统为您提供了12个头像自由选择,初次打开随机为你选择一个
  • 邮箱:可选提交邮箱,该信息不会外泄,或将上线管理员回复邮件通知
  • 网址:可选提交网址,评论区该地址将以外链的形式展示在您的昵称上
  • 记忆:浏览器将记忆您已选择或填写过得信息,下次评论无需重复输入
  • 审核:提供一个和谐友善的评论环境,本站所有评论需要经过人工审核