干货 | Elasticsearch Java 客户端演进历史和选型指南

时间:2022-10-19 07:57:38


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 客户端演进史

干货 | 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”已弃用。

干货 | Elasticsearch Java 客户端演进历史和选型指南

较​​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://*.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 自己重写。

举个通俗的例子,直接看图。

干货 | Elasticsearch Java 客户端演进历史和选型指南

VS

干货 | Elasticsearch Java 客户端演进历史和选型指南

两个图一对比就更明显了,​​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”给出了详尽的解读。

干货 | Elasticsearch Java 客户端演进历史和选型指南

概括如下:

  • 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 三个典型特点:

干货 | Elasticsearch Java 客户端演进历史和选型指南

  • 特点1:对象构造基于构建者模式( builder pattern.)。

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。该模式增强了客户端代码的可用性和可读性。

举例如下:

干货 | Elasticsearch Java 客户端演进历史和选型指南

  • 特点2:使用 lambda 构建嵌套对象,从而编写干净、富有表现力的 DSL 变得容易。

分层 DSL 接近 elasticsearch 的 json 格式。

干货 | Elasticsearch Java 客户端演进历史和选型指南

干货 | Elasticsearch Java 客户端演进历史和选型指南

  • 特点3:应用程序类能自动映射为 Mapping。

干货 | Elasticsearch Java 客户端演进历史和选型指南

​https://github.com/elastic/elasticsearch-java​

3、Elasticsearch 非官方客户端

3.1 JEST 客户端

​Http REST​​​ 客户端,2017年左右还比较新颖,我还做过​​推荐​​。

但,最新一次更新是 2 年前,所以已不推荐使用。

干货 | Elasticsearch Java 客户端演进历史和选型指南

原因:Elasticsearch 版本更迭太快,不做新版本适配,很多功能都可用或至少不好用。

​https://github.com/searchbox-io/Jest​

3.2 BBoss 客户端

​https://esdoc.bbossgroups.com/#/​

干货 | Elasticsearch Java 客户端演进历史和选型指南

国产的能适应 1.X——8.X 所有版本的 java rest 客户端。

3.3 Spring data Elasticsearch 客户端

最新版本为:Spring Data Elasticsearch 4.4,支持 Elasticsearch 7.17.3 版本。

干货 | Elasticsearch Java 客户端演进历史和选型指南

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 客户端?有没有坑?欢迎留言交流。

干货 | Elasticsearch Java 客户端演进历史和选型指南

更短时间更快习得更多干货!

和全球 1600+ Elastic 爱好者一起精进!

比同事抢先一步学习进阶干货!