您好,登錄后才能下訂單哦!
這篇文章給大家介紹怎么理解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):
接下來(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)威指南)。
正如上述圖所述,以一個(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)繼承圖如下:
上述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)圖如下:
其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ò),可以把它分享出去讓更多的人看到。
免責(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)容。