ES目前有的客户端
Transport client
是通过9300端口,使用 Elasticsearch 的原生传输协议和集群交互。(集群交互的端口都是通过9300)
Transport client 是不需要单独一个节点,不加入集群,而是通过获取单个或多个 transport 地址来以轮询的方式与他们通信。
TransportClient 在 7.0 版本就开始不推荐使用,而推荐使用 Java High Level REST Client,并将在 Elasticsearch 8.0 中删除。
兼容性问题:
TransportClient 与 ES有兼容性问题,使用 transport 端口(通讯端口)通过 TCP 协议与 Elasticsearch 节点通信,如果客户端的版本和与其通信的 ES 实例的版本不同,就会出现兼容性问题,必须保证大版本相同。
SpringBoot 与 ES 也有兼容性问题,见 SpringBoot 与 ES 兼容版本。
ES 所在服务器与客户端所在服务器的 JVM 版本也需要一致,不然也可能出现错误。
优点:
- Transport client 在网络传输层使用的是 TCP 协议,传输的就是 binary format 类型的数据,服务层不需要进行数据结构类型转换,速度较快,但不明显。
缺点:
- 重依赖:并非单独意义上的客户端,需要依赖于 lucene、log4j2 等,可能会产生依赖冲突
- 不安全:网络传输层通过 transport 使用 TCP 协议调用服务,不安全
- 重耦合:和 ES 有共同依赖,有版本兼容性问题。
Java Rest Client
5.0 版本才出现 Rest Client,但是之前的版本也可以使用。
优点:
- 安全:使用单一的集群入口点,通过 HTTPS 保障数据安全,TCP 协议只用于内部节点通讯
- 兼容性强:REST风格交互,符合ES设计初衷。
缺点:
- Java Rest Client 在网络传输层使用的是 HTTPS 协议,传输的就是一串 Json body 数据,服务层接收到数据之后,需要把这个数据处理成 Java object,然后再转成 binary format,最后通过 transport 发送给 node,所以速度较慢,但不明显。
Java Low Level REST Client
Java Low Level REST Client 中文翻译(仅供参考)
之所以被称为低级客户端,是因为它几乎没有帮助 Java 用户构建请求或解析响应。用户需自己编组请求JSON串,及解析响应JSON串。
优点:
- 最小的依赖关系
- 所有可用节点之间的负载平衡
- 在节点故障的情况下,根据特定的响应代码进行故障转移
- 失败连接惩罚(失败节点是否被重试取决于它连续失败的次数;失败次数越多,客户机在再次尝试同一节点之前等待的时间就越长)
- 持久连接
- 跟踪请求和响应的日志记录
- 可选 : 自动发现集群节点
Java High Level REST Client
部分 Java High Level REST Client 中文API(仅供参考)
在 7.15.0 版本被弃用
基于低级别的 REST 客户端,增加了编组请求 JSON 串、解析响应JSON串等相关 API。
优点:
- 功能强大:支持所有 ES 的 API 调用
- 松耦合:客户端与 ES 核心服务完全独立,无共同依赖
- 接口稳定
缺点:
- 兼容性中等:基于 Low Level Client,一般只能向后兼容相同主版本和大于或等于小版本上的任何 Elasticsearch节点通信,比如 6.0 的客户端支持 6.X ,但是 6.1 的客户端未必支持 6.0 的 ES API。
Spring Data Elasticsearch
不能算是客户端,只能说是与 ES 交互的数据访问层项目
是 Spring Data 的一部分,旨在为新数据存储提供熟悉且一致的基于 Spring 的编程模型,同时保留特定于存储的特性和功能。
Spring Data Elasticsearch 的关键功能领域是以 POJO 为中心的模型,用于与 Elastichsearch 文档交互并轻松编写存储库样式的数据访问层。
优点:
- 用统一的接口,适配所有不同的存储类型,学习成本低。
缺点:
- 适配的版本要比原生的API要慢。这个取决于 Spring Data Elasticsearch 团队的开发速度。无法使用ES的一些新特性