1、Elasticsearch java 客戶端為什么要選型?
Elasticsearch 官方提供了很多版本的 Java 客戶端,包含但不限于:
Transport
客戶端Java REST
客戶端Low Level REST
客戶端High Level REST
客戶端Java API
客戶端
非官方的 Java 客戶端,包含但不限于:
Jest
客戶端BBoss
客戶端Spring Data Elasticsearch
客戶端 ......
寫出來的就接近十款客戶端!
Elasticsearch ?java 客戶端
各個版本的發(fā)展演進(jìn)歷史、選擇哪個、如何選擇是本篇文章要解決的問題。
2、Elasticsearch 官方 Java 客戶端演進(jìn)史
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 傳輸協(xié)議(transport protocol of Elasticsearch)和 Elasticsearch 通信。
Elasticsearch 傳輸協(xié)議也就是大家熟知的 9300 端口通信的那個協(xié)議,該協(xié)議負(fù)責(zé)節(jié)點(diǎn)之間互相通信的。如果客戶端的版本與集群版本不一致可能出現(xiàn)兼容性問題。
本文介紹的所有客戶端中,僅 Transport
客戶端使用的是 Elasticsearch 傳輸協(xié)議,其他客戶端都是 Http 協(xié)議。
更加通俗一點(diǎn)說:僅有 Transport
客戶端使用 9300 端口(默認(rèn)),其他都是 9200 端口(默認(rèn))。
Transport 客戶端缺點(diǎn):
和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
?發(fā)布版本:5.0 版本(2016年10月26日)。
官方對 Java REST Client
的解讀為:Elasticsearch 的官方“低級“客戶端。允許通過 http 協(xié)議與 Elasticsearch 集群通信。與所有 Elasticsearch 版本兼容。
官方醒目的標(biāo)記了“deprecated”已棄用。
較Transport
客戶端,Java REST
客戶端特點(diǎn)如下:
耦合性低;
具有更少的依賴項(xiàng);
應(yīng)用程序更加輕量級。
在 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日)單獨(dú)分割出來,之前統(tǒng)一叫:Java REST 客戶端。
Elasticsearch 官方“低級”客戶端,官方強(qiáng)調(diào)的一個特點(diǎn):它與所有 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
客戶端,并擴(kuò)展了 Low Level REST
客戶端 的類和接口。
Java High Level REST
客戶端較 Low Level REST
客戶端的優(yōu)勢如下:
優(yōu)勢1:代碼的可維護(hù)性和可讀性強(qiáng)。
舉個例子:發(fā)送請求的代碼,看如下兩種客戶端不同寫法。
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 上工作,什么都得自己構(gòu)造。
優(yōu)勢2:更加便捷。
幫助開發(fā)人員像使用 Kibana 一樣關(guān)聯(lián) ES API 使用。
優(yōu)勢3:XPack 高階功能 High Level 自動包含,無需使用 Low Level 自己重寫。
舉個通俗的例子,直接看圖。
VS
兩個圖一對比就更明顯了,Low Level REST
客戶端 什么都得自己來,High Level REST
客戶端都封裝好了,我們吃“現(xiàn)成”的。
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 版本以兼容模式運(yùn)行。
其實(shí)大家可能和我一樣都有疑問:High Level
不香嗎?為啥還要換?
其實(shí)官方在“ElasticCC: The new Elasticsearch Java Client: getting started and behind the scenes”給出了詳盡的解讀。
概括如下:
1、High Level REST 客戶端“太重”。
相關(guān)依賴超過 30 MB,且很多都是非必要相關(guān)的。
api 暴露了很多服務(wù)器內(nèi)部接口。
2、High Level REST 一致性差。
仍需要大量的維護(hù)工作。
3、High Level REST 客戶端沒有集成 json/object 類型映射。
仍需要自己借助字節(jié)緩存區(qū)實(shí)現(xiàn)。
https://github.com/elastic/elasticsearch-java
Elasticsearch Java API?客戶端官方定義如下:
Elasticsearch Java API 客戶端為所有的 Elasticsearch API 提供請求和響應(yīng)處理。
它將請求處理轉(zhuǎn)給 Elasticsearch Low Level REST 客戶端,這也是 High Level 被廢棄而 Low Level ?REST 客戶端依然健在的原因,Low Level REST 客戶端負(fù)責(zé)處理 Http 連接建立和池化、重試機(jī)制等所有傳輸級別的問題。
Elasticsearch Java API Client 三個典型特點(diǎn):
特點(diǎn)1:對象構(gòu)造基于構(gòu)建者模式( builder pattern.)。
建造者模式(Builder Pattern)使用多個簡單的對象一步一步構(gòu)建成一個復(fù)雜的對象。該模式增強(qiáng)了客戶端代碼的可用性和可讀性。
舉例如下:
特點(diǎn)2:使用 lambda 構(gòu)建嵌套對象,從而編寫干凈、富有表現(xiàn)力的 DSL 變得容易。
分層 DSL 接近 elasticsearch 的 json 格式。
特點(diǎn)3:應(yīng)用程序類能自動映射為 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/#/
國產(chǎn)的能適應(yīng) 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 是默認(rèn)客戶端,且仍然支持 Java Transport 客戶端,目 前尚不支持 Elasticsearch Java API 客戶端。
Spring data Elasticsearch 官方文檔如下:
https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/
實(shí)現(xiàn)推薦參考:
https://developer.okta.com/blog/2022/02/16/spring-data-elasticsearch
4、Elasticsearch java 客戶端如何選型?
選型關(guān)注要點(diǎn):
Elasticsearch 集群的版本。
歷史版本的兼容性問題。
未來升級版本、擴(kuò)展性問題。
所選型的客戶端是否更新及時,能適配將來的版本。
如果當(dāng)前是:7.X 版本且不考慮升級,那就 High Level REST
客戶端。
如果當(dāng)前是:8.X 版本,那就 Elasticsearch Java API
客戶端。
如果當(dāng)前是:5.X、6.X 版本,推薦盡早升級集群版本。
JEST
已不更新和維護(hù),不推薦使用。
BBoss
客戶端,根據(jù)自己業(yè)務(wù)需要做選型。
Spring 框架的 Web 項(xiàng)目,可以使用 Spring Data Elasticsearch,但關(guān)注它的更新版本,截止:2022-06-17,支持到:7.17.3 版本。
5、小結(jié)
隨著 Elasticsearch 的版本快速更迭,Elasticsearch java 客戶端也在隨之變化。
本文以時間為主線梳理了 Elasticsearch 官方 java 客戶端的演進(jìn)歷史,并列舉常見的非 Elasticsearch 客戶端。
Elasticsearch java 客戶端琳瑯滿目、“亂花漸欲迷人眼”,但我們需要結(jié)合集群版本、集群的過去和將來,以發(fā)展的眼光選型適合自己的 Elasticsearch 客戶端。
你的 Elasticsearch 集群開發(fā)使用的什么 java 客戶端?有沒有坑?歡迎留言交流。
推薦閱讀
如何從0到1打磨一門 Elasticsearch 線上直播課?
重磅 | 死磕 Elasticsearch 方法論認(rèn)知清單(2021年國慶更新版)
如何系統(tǒng)的學(xué)習(xí) Elasticsearch ?
更短時間更快習(xí)得更多干貨!
和全球?1600+?Elastic 愛好者一起精進(jìn)!
文章來源:http://www.zghlxwxcb.cn/news/detail-410828.html
比同事?lián)屜纫徊綄W(xué)習(xí)進(jìn)階干貨!文章來源地址http://www.zghlxwxcb.cn/news/detail-410828.html
到了這里,關(guān)于干貨 | Elasticsearch Java 客戶端演進(jìn)歷史和選型指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!