干货 | Elasticsearch Java 客户端演进历史和选型指南
1、Elasticsearch java 客户端为什么要选型?
Elasticsearch 官方提供了很多版本的 Java 客户端,包含但不限于:
Transport
客户端Java REST
客户端Low Level REST
客户端High Level REST
客户端Java API
客户端
非官方的 Java 客户端,包含但不限于:
Jest
客户端BBoss
客户端Spring Data Elasticsearch
客户端 ......
写出来的就接近十款客户端!
Elasticsearch java 客户端
各个版本的发展演进历史、选择哪个、如何选择是本篇文章要解决的问题。
2、Elasticsearch 官方 Java 客户端演进史
2.1 Elasticsearch Transport 客户端
Elasticsearch Transport
客户端生命周期:Elasticsearch 0.9 版本(2010 年 7 月 27 日)生,Elasticsearch 7.0.0 版本(2019 年 04 月 10 日)弃用,Elasticsearch 8.0 版本(2022 年 02 月 11 日)彻底移除(removed)。
Transport
客户端使用 Elasticsearch 传输协议(transport protocol of Elasticsearch)和 Elasticsearch 通信。
Elasticsearch 传输协议也就是大家熟知的 9300 端口通信的那个协议,该协议负责节点之间互相通信的。如果客户端的版本与集群版本不一致可能出现兼容性问题。
本文介绍的所有客户端中,仅 Transport
客户端使用的是 Elasticsearch 传输协议,其他客户端都是 Http 协议。
更加通俗一点说:仅有 Transport
客户端使用 9300 端口(默认),其他都是 9200 端口(默认)。
Transport 客户端缺点:
和 JVM、集群版本紧密耦合。
安全性差。
https://www.elastic.co/guide/en/elasticsearch/client/java-api/0.90/java-api.html
https://www.elastic.co/cn/blog/the-elasticsearch-java-high-level-rest-client-is-out
2.2 Elasticsearch Java REST 客户端
Java REST Client
发布版本:5.0 版本(2016 年 10 月 26 日)。
官方对 Java REST Client
的解读为:Elasticsearch 的官方“低级“客户端。允许通过 http 协议与 Elasticsearch 集群通信。与所有 Elasticsearch 版本兼容。
官方醒目的标记了“deprecated”已弃用。
较Transport
客户端,Java REST
客户端特点如下:
耦合性低;
具有更少的依赖项;
应用程序更加轻量级。
在 Elasticsearch 5.6 版本(2017 年 9 月 12 日)的时候,REST 客户端衍生为两种:
Java Low Level REST 客户端
Java High Level REST 客户端
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/5.0/index.html
2.2.1 Java Low Level REST 客户端
Low Level Rest
5.6 版本(2017 年 9 月 11 日)单独分割出来,之前统一叫:Java REST 客户端。
Elasticsearch 官方“低级”客户端,官方强调的一个特点:它与所有 Elasticsearch 版本兼容。
注意:下文提到的 High Level REST
客户端已被废弃,但是:Low Level REST
客户端到 8.X 版本依然健在。
2.2.2 Java High Level REST 客户端
High Level REST
客户端 5.6.0 版本(2017 年 9 月 11 日)推出,已于 7.15.0 版本(2021 年 09 月 22 日)废弃。
Elasticsearch 官方“高级“客户端 基于 Low Level REST
客户端,并扩展了 Low Level REST
客户端 的类和接口。
Java High Level REST
客户端较 Low Level REST
客户端的优势如下:
优势 1:代码的可维护性和可读性强。
举个例子:发送请求的代码,看如下两种客户端不同写法。
Low Level REST
客户端写法如下:
High Level Rest
客户端写法如下:
可以看出,Low Level REST
方式相对“原始”、“笨拙”。
使用 High Level Rest
客户端上工作就像在 Elasticsearch 的 API 层(通过 HTTP 包间接工作),而Low Level REST
客户端纯粹是在 HTTP 上工作,什么都得自己构造。
优势 2:更加便捷。
帮助开发人员像使用 Kibana 一样关联 ES API 使用。
优势 3:XPack 高阶功能 High Level 自动包含,无需使用 Low Level 自己重写。
举个通俗的例子,直接看图。
VS
两个图一对比就更明显了,Low Level REST
客户端 什么都得自己来,High Level REST
客户端都封装好了,我们吃“现成”的。
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/5.6/java-rest-high.html
2.3 Elasticsearch Java API Client
7.16 版本(2021 年 12 月 8 日)推出 Elasticsearch Java API Client
。
值得注意的是:7.17 版本的 High Level REST 客户端可以与 8.X 版本以兼容模式运行。
其实大家可能和我一样都有疑问:High Level
不香吗?为啥还要换?
其实官方在“ElasticCC: The new Elasticsearch Java Client: getting started and behind the scenes”给出了详尽的解读。
概括如下:
1、High Level REST 客户端“太重”。
相关依赖超过 30 MB,且很多都是非必要相关的。
api 暴露了很多服务器内部接口。
2、High Level REST 一致性差。
仍需要大量的维护工作。
3、High Level REST 客户端没有集成 json/object 类型映射。
仍需要自己借助字节缓存区实现。
https://github.com/elastic/elasticsearch-java
Elasticsearch Java API 客户端官方定义如下:
Elasticsearch Java API 客户端为所有的 Elasticsearch API 提供请求和响应处理。
它将请求处理转给 Elasticsearch Low Level REST 客户端,这也是 High Level 被废弃而 Low Level REST 客户端依然健在的原因,Low Level REST 客户端负责处理 Http 连接建立和池化、重试机制等所有传输级别的问题。
Elasticsearch Java API Client 三个典型特点:
特点 1:对象构造基于构建者模式( builder pattern.)。
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。该模式增强了客户端代码的可用性和可读性。
举例如下:
特点 2:使用 lambda 构建嵌套对象,从而编写干净、富有表现力的 DSL 变得容易。
分层 DSL 接近 elasticsearch 的 json 格式。
特点 3:应用程序类能自动映射为 Mapping。
https://github.com/elastic/elasticsearch-java
3、Elasticsearch 非官方客户端
3.1 JEST 客户端
Http REST
客户端,2017 年左右还比较新颖,我还做过推荐。
但,最新一次更新是 2 年前,所以已不推荐使用。
原因:Elasticsearch 版本更迭太快,不做新版本适配,很多功能都可用或至少不好用。
https://github.com/searchbox-io/Jest
3.2 BBoss 客户端
https://esdoc.bbossgroups.com/#/
国产的能适应 1.X——8.X 所有版本的 java rest 客户端。
3.3 Spring data Elasticsearch 客户端
最新版本为:Spring Data Elasticsearch 4.4,支持 Elasticsearch 7.17.3 版本。
8.X 尚不支持,之前的观察看,更新较慢。
使用 Spring Data,High Level REST Client 是默认客户端,且仍然支持 Java Transport 客户端,目 前尚不支持 Elasticsearch Java API 客户端。
Spring data Elasticsearch 官方文档如下:
https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/
实现推荐参考:
https://developer.okta.com/blog/2022/02/16/spring-data-elasticsearch
4、Elasticsearch java 客户端如何选型?
选型关注要点:
Elasticsearch 集群的版本。
历史版本的兼容性问题。
未来升级版本、扩展性问题。
所选型的客户端是否更新及时,能适配将来的版本。
如果当前是:7.X 版本且不考虑升级,那就 High Level REST
客户端。
如果当前是:8.X 版本,那就 Elasticsearch Java API
客户端。
如果当前是:5.X、6.X 版本,推荐尽早升级集群版本。
JEST
已不更新和维护,不推荐使用。
BBoss
客户端,根据自己业务需要做选型。
Spring 框架的 Web 项目,可以使用 Spring Data Elasticsearch,但关注它的更新版本,截止:2022-06-17,支持到:7.17.3 版本。
5、小结
随着 Elasticsearch 的版本快速更迭,Elasticsearch java 客户端也在随之变化。
本文以时间为主线梳理了 Elasticsearch 官方 java 客户端的演进历史,并列举常见的非 Elasticsearch 客户端。
Elasticsearch java 客户端琳琅满目、“乱花渐欲迷人眼”,但我们需要结合集群版本、集群的过去和将来,以发展的眼光选型适合自己的 Elasticsearch 客户端。
你的 Elasticsearch 集群开发使用的什么 java 客户端?有没有坑?欢迎留言交流。
评论