注:本文出自博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎
前言
今天我们来聊聊Elasticsearch客户端的类型。我们知道Elasticsearch是一种分布式的海量数据搜索与分析的技术,可以用于电商网站、门户网站、企业IT系统等各种场景下的搜索引擎,也可以用于对海量的数据进行近实时的数据分析。
但Elasticsearch版本迭代更新太快,这就意味着在Elasticsearch升级过程中容易出现兼容性问题。也引出了今天对Elasticsearch客户端种类及使用的问题讨论!
ES客户端种类
ES官方客户端有TransportClient、Java Low Level REST Client和Java High Level REST Client三种。官方文档对他们的说明是:
TransportClient
We plan on deprecating the TransportClient in Elasticsearch 7.0 and removing it completely in 8.0.
Java Low Level REST Client
the official low-level client for Elasticsearch. It allows to communicate with an Elasticsearch cluster through http. Leaves requests marshalling and responses un-marshalling to users. It is compatible with all Elasticsearch versions.
Java High Level REST Client
the official high-level client for Elasticsearch. Based on the low-level client, it exposes API specific methods and takes care of requests marshalling and responses un-marshalling.
意思就是说,TransportClient将会在将来版本进行废弃移除,官方建议使用Java High Level REST Client。
为什么会这样呢?这里涉及到两个问题:
- 未来版本为什么会淘汰TransportClient客户端?
- Java Low/High Level REST Client客户端优点在哪里?
先别急,我们来看看这两个问题!
客户端的使用
各客户端使用需要引入相关依赖,这里统一引入相关依赖,后面就不多赘述了!
1 | <!-- elasticsearch core --> |
注:TransportClient将会在8.x版本后完全移除!
TransportClient
初始化TransportClient客户端代码示例:
1 | public TransportClient initTransportClient(String esClusterName,String host,String port) throws UnknownHostException { |
Java Low Level REST Client
初始化 RestClient 客户端代码示例:
1 | public RestClient initRestClient(String host, int port) { |
Java High Level REST Client
初始化 RestHighLevelClient 客户端代码示例:
1 | public RestHighLevelClient restHighLevelClient(List<String> hostArray) { |
以上就是初始化三种不同客户端的示例代码!下面我们深入客户端代码底层,看看他们之间有什么不一样?
深入客户端的底层
TransportClient
TransportClient客户端自从Elasticsearch诞生以来,一直是Elasticsearch的一部分。 它是一个特殊的客户端,因为它使用传输层协议(TCP)与Elasticsearch进行通信,如果该客户端与其所使用的Elasticsearch不在同一版本上,则会导致兼容性问题。基于这个原因,官方会在8.x后完全移除!
因此,在这里就不对 TransportClient 客户端底层进行深究了!
Java Low Level REST Client
2016年,Elasticsearch官方发布了一个低级REST客户端,该客户端基于众所周知的Apache HTTP客户端,它允许使用 HTTP 与任何版本的Elasticsearch集群进行通信。
我们来看看RestClient客户端的代码:
1 | package org.elasticsearch.client; |
看到上面的代码,RestClient 类构造器的第一个参数是 CloseableHttpAsyncClient,是 Apache HTTP client 中的类,也就是说 RestClient 是基于 Apache HTTP 实现的,这里是 Apache HTTP 的依赖!
1 | <dependency> |
Java High Level REST Client
最重要的是,我们发布了基于低级客户端的高级REST客户端,它负责请求编组和响应解组。
我们来看看 RestHighLevelClient 的底层代码!
1 | package org.elasticsearch.client; |
看上面的代码及注解,我相信你很快就豁然开朗了!
其实上面的问题现在就有答案了!TransportClient废弃的主要原因就是考虑到兼容性的问题,而后续两个客户端在兼容性方面就做的很好!
小结
关于Elasticsearch的客户端问题,其实 ES官网 已经说得很明确了,这里也通过代码剖析的方式去认识一下底层的代码,加深理解!
由此可见,HighLevelClient 是基于 RestClient,而 RestClient 又是基于 Apache HTTP 客户端, 这样一来, 在客户端方面, Elasticsearch 将 Java, Python, Php, Javascript 等各种语言的底层接口就都统一起来了; 与此同时, 使用 rest api, 还可以屏蔽各版本之前的差异。
这也提醒我们,在代码的升级过渡期, 处理好新 client 和旧 client 的关系,可以减少代码后期维护的工作量!