溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么理解ElasticSearch Client

發(fā)布時(shí)間:2021-11-23 16:12:11 來(lái)源:億速云 閱讀:191 作者:柒染 欄目:大數(shù)據(jù)

這篇文章給大家介紹怎么理解ElasticSearch Client,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

小編將重點(diǎn)探討ElasticSearch Client的相關(guān)知識(shí),主要關(guān)注TransportClient與Rest Client。Elasticsearch client 是我們進(jìn)入Elasti-Search的大門(mén)。

1、概述

關(guān)注Elasticsearch與Java相關(guān)的API實(shí)現(xiàn)。所有Elasticsearch操作都是使用Client對(duì)象執(zhí)行的。Client 定義的所有API都是異步執(zhí)行的(要么使用事件監(jiān)聽(tīng)器回調(diào)或者使用Future模式)。此外,客戶端上的操作可以批量累積和執(zhí)行。

Elasticsearch官方計(jì)劃在Elasticsearch 7.0中棄TransportClient,并在8.0中完全刪除它。相反,您應(yīng)該使用Java高級(jí)REST client,rest client執(zhí)行HTTP請(qǐng)求來(lái)執(zhí)行操作,無(wú)需再序列化的Java請(qǐng)求。Java高級(jí)REST Client API目前支持更常用的api,但還需要添加更多的api。

任何缺失的api都可以通過(guò)使用帶有JSON請(qǐng)求和響應(yīng)體的低級(jí)Java REST客戶機(jī)來(lái)實(shí)現(xiàn)。按照官方的意思,以后ElasticSearch應(yīng)該不會(huì)再為某一種具體語(yǔ)言單獨(dú)提供客戶端API,而是使用通用rest請(qǐng)求(http)來(lái)與ElasticSearch服務(wù)器進(jìn)行交互。

接下來(lái)我們會(huì)從java api開(kāi)始進(jìn)入ElasticSearch API的學(xué)習(xí)。

ElasticSearch Client按照編程語(yǔ)言提供如下實(shí)現(xiàn):

怎么理解ElasticSearch Client

接下來(lái)將重點(diǎn)分析JAVA Client與Java REST Client。

2、TransportClient詳解

2.1 TransportClient概述

TransportClient 是ElasticSearch(java)客戶端封裝對(duì)象,使用transport模塊遠(yuǎn)程連接到Elasticsearch集群,該transport node并不會(huì)加入集群,而是簡(jiǎn)單的向ElasticSearch集群上的節(jié)點(diǎn)發(fā)送請(qǐng)求。transport node使用輪詢(xún)機(jī)制進(jìn)行集群內(nèi)的節(jié)點(diǎn)進(jìn)行負(fù)載均衡,盡管大多數(shù)操作(請(qǐng)求)可能是“兩跳操作”,其操作如圖(引用在Elasticsearch權(quán)威指南)。

怎么理解ElasticSearch Client

正如上述圖所述,以一個(gè)新建操作為例,第一個(gè)請(qǐng)求首先發(fā)送到NODE1,然后會(huì)根據(jù)ID進(jìn)行路由計(jì)算(hashcode(id)%主分片個(gè)數(shù)),例如使用p0(第一個(gè)主分片),此時(shí)NODE1會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到Node3,然后客戶端發(fā)送第二個(gè)請(qǐng)求,會(huì)發(fā)送到NODE2上(上文中的輪詢(xún)機(jī)制)。

默認(rèn)構(gòu)建TransportClient的方法如下

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)    // @1
        .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.1.10"), 9300))     // @2
        .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.1.11"), 9300));   
 // on shutdown
 client.close();

代碼@1:使用空配置。

代碼@2:連接ElasticSearch 節(jié)點(diǎn),可以通過(guò)addTransportAddress方法連接多個(gè)Node節(jié)點(diǎn),這樣請(qǐng)求會(huì)輪流發(fā)送到這些節(jié)點(diǎn)上,實(shí)現(xiàn)集群節(jié)點(diǎn)在接受請(qǐng)求時(shí)的負(fù)載均衡。

TransportClient級(jí)別的主要參數(shù)如下:

參數(shù)名

參數(shù)描述

cluster.name

transport node與服務(wù)端節(jié)點(diǎn)并不在一個(gè)集群中。

client.transport.sniff

是否開(kāi)啟集群嗅探功能,下文會(huì)詳細(xì)介紹。

client.transport.ignore_cluster_name

是否忽略連接節(jié)點(diǎn)的集群名稱(chēng)校驗(yàn),設(shè)置為true表示忽略,避免連接的節(jié)點(diǎn)并不在同一個(gè)集群中。

client.transport.ping_timeout

ping命令的響應(yīng)超時(shí)時(shí)間,默認(rèn)為5s。

client.transport.nodes_sampler_interval

對(duì)連接節(jié)點(diǎn)發(fā)送ping命令的頻率,默認(rèn)為5s,即常說(shuō)的心跳檢測(cè)間隔時(shí)間。

接下來(lái)重點(diǎn)描述一下client.transport.sniff參數(shù),集群群嗅探機(jī)制。

在創(chuàng)建TransportClient時(shí)可以通過(guò)addTransportAddress來(lái)靜態(tài)的增加ElasticSearch集群中的節(jié)點(diǎn),如果開(kāi)啟集群群嗅探機(jī)制,即開(kāi)啟節(jié)點(diǎn)動(dòng)態(tài)發(fā)現(xiàn)機(jī)制,允許動(dòng)態(tài)添加和刪除節(jié)點(diǎn)。當(dāng)啟用嗅探功能時(shí),首先客戶端會(huì)連接addTransportAddress中的節(jié)點(diǎn)上。在此之后,客戶端將調(diào)用這些節(jié)點(diǎn)上的內(nèi)部集群狀態(tài)API來(lái)發(fā)現(xiàn)可用的數(shù)據(jù)節(jié)點(diǎn)。客戶端的內(nèi)部節(jié)點(diǎn)列表將僅被發(fā)現(xiàn)的數(shù)據(jù)數(shù)據(jù)節(jié)點(diǎn)替換。默認(rèn)情況下,這個(gè)列表每5秒刷新一次。也就意味著如果該節(jié)點(diǎn)不是數(shù)據(jù)節(jié)點(diǎn),則列表可能不包括它連接的原始節(jié)點(diǎn)。例如,如果您最初連接到一個(gè)主節(jié)點(diǎn),在嗅探之后,如果發(fā)現(xiàn)了有其對(duì)應(yīng)的數(shù)據(jù)節(jié)點(diǎn),則不會(huì)再向該主節(jié)點(diǎn)發(fā)出請(qǐng)求,而是向任何數(shù)據(jù)節(jié)點(diǎn)發(fā)出請(qǐng)求。傳輸客戶端排除非數(shù)據(jù)節(jié)點(diǎn)的原因是為了避免只向主節(jié)點(diǎn)發(fā)送搜索流量。

使用配置構(gòu)建Settings構(gòu)建TransportClient對(duì)象代碼如下:

Settings settings = Settings.builder()
  .put(“cluster.name”, “myClusterName”)
       .put(“client.transport.sniff”, “true”).build();
TransportClient client = new PreBuiltTransportClient(settings)
  .addTransportAddress(new TransportAddress(InetAddress.getByName(“192.168.1.10”), 9300))  

2.2、TransportClient API

TransportClient 的核心類(lèi)繼承圖如下:

怎么理解ElasticSearch Client

上述API的設(shè)計(jì)要點(diǎn):

整個(gè)客戶端API提供兩個(gè)最底層的方法,execute,其關(guān)鍵特征如下:

  • ActionFuture<Response> execute(Action<Request, Response, RequestBuilder> action, Request request);

返回ActionFuture,根據(jù)名稱(chēng)即可知道,該方法是典型的異步調(diào)用,F(xiàn)uture模式。

  • void execute(Action<Request, Response, RequestBuilder> action, Request request, ActionListener<Response> listener);

無(wú)返回值,但需要傳入ActionListener<Response> listener,同樣根據(jù)名稱(chēng)即可知道,該參數(shù)的作用是事件監(jiān)聽(tīng)器(回調(diào)方法),也就是收到服務(wù)端響應(yīng)后,調(diào)用回調(diào)函數(shù),進(jìn)行結(jié)果處理。

注意:ElasticSearch Client API 其本質(zhì)是使用異步請(qǐng)求模式。

  • prepare 開(kāi)頭的方法,例如IndexRequestBuilder prepareIndex()

這類(lèi)API的設(shè)計(jì)是使用Build模式,先通過(guò)build構(gòu)建請(qǐng)求參數(shù),最終會(huì)通過(guò)調(diào)用get()方法完成接口調(diào)用。

TransportClient Api就先解釋到這里了,后續(xù)會(huì)詳細(xì)對(duì)上述API進(jìn)行分類(lèi)詳解。

2.3 Maven依懶

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>6.4.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.1</version>
</dependency>

3、Java Rest Client詳解

Java REST客戶端有兩種風(fēng)格:

  • Java Low Level REST Client:elasticsearch client 低級(jí)別客戶端。它允許通過(guò)http請(qǐng)求與Elasticsearch集群進(jìn)行通信。API本身不負(fù)責(zé)數(shù)據(jù)的編碼解碼,由用戶去編碼解碼。它與所有的ElasticSearch版本兼容。

  • Java High Level REST Client:Elasticsearch client官方高級(jí)客戶端。基于低級(jí)客戶端,它定義的API,已經(jīng)對(duì)請(qǐng)求與響應(yīng)數(shù)據(jù)包進(jìn)行編碼解碼。



3.1 Java High Level REST Client

3.1.1 初始化

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http"),
                new HttpHost("localhost", 9201, "http")));
// close
client.close();

new HttpHost("localhost", 9200, "http")其機(jī)制與TransportClient的addTransportAddress的作用一致。

3.1.2 核心API依懶

RestHighLevelClient 的類(lèi)圖如下:

怎么理解ElasticSearch Client

其API設(shè)計(jì)具有如下特征:

  • 每個(gè)API提供同步與異步調(diào)用,方法名以async結(jié)尾的方法為異步調(diào)用,需要提供對(duì)應(yīng)的ActionListener實(shí)現(xiàn)。

  • 每個(gè)API都可以提供RequestOptions對(duì)象來(lái)定制請(qǐng)求選型。

本節(jié)將不會(huì)對(duì)上述API一一介紹,上述API會(huì)在后續(xù)文章中詳細(xì)解析。

3.1.3 Maven依懶

<dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-client</artifactId>
        <version>6.4.0</version>
</dependency>
 <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>6.4.0</version>
         <type>pom</type>
</dependency>

關(guān)于怎么理解ElasticSearch Client就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI