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 版本依然健在。
https://stackoverflow.com/questions/62340904/elasticsearch-rest-high-level-client-vs-elasticsearch-rest-client
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
客户端写法如下:
Request request = new Request("GET", "/posts/_search");
High Level Rest
客户端写法如下:
SearchRequest searchRequest = new SearchRequest("posts");
可以看出,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 客户端?有没有坑?欢迎留言交流。