1. 程式人生 > >ElasticSearch Client詳解

ElasticSearch Client詳解

   從本文開始,將與大家進入到Elasticsearch的精妙世界中來,基於當前最新的6.4.x版本。    本文將重點探討ElasticSearch Client的相關知識,重點關注TransportClient與Rest Client。Elasticsearch client 是我們進入ElasticSearch的大門。 1、概述    本節描述Elasticsearch提供的Java API。所有Elasticsearch操作都是使用Client物件執行的。Client 定義的所有API都是非同步執行的。(要麼使用事件監聽器回撥或者使用Future模式) 此外,客戶端上的操作可以批量累積和執行。 注意,所有API都通過Java API公開(實際上,Java API在內部用於執行它們)。    Elasticsearch計劃在Elasticsearch 7.0中棄用TransportClient,在8.0中完全刪除它。相反,您應該使用Java高階REST client,rest client執行HTTP請求來執行操作,無需再序列化的Java請求。 Java高階REST Client API目前支援更常用的api,但還需要新增更多的api。 任何缺失的api都可以通過使用帶有JSON請求和響應體的低階Java REST客戶機來實現。    按照官方的意思,以後ElasticSearch應該不會再為某一種具體語言單獨提供客戶端API,而是使用通用rest請求(http)來與ElasticSearch伺服器進行互動。    接下來我們會從java api開始進入ElasticSearch API的學習。    ElasticSearch Client按照程式語言提供如下實現: 在這裡插入圖片描述

   官方文件連結:https://www.elastic.co/guide/en/elasticsearch/client/index.html    接下來將重點分析JAVA Client與Java REST Client。 2、TransportClient詳解 2.1 TransportClient概述    TransportClient 是ElasticSearch(java)客戶端封裝物件,使用transport模組遠端連線到Elasticsearch叢集,該transport node並不會加入叢集,而是簡單的向ElasticSearch叢集上的節點發送請求。transport node使用輪詢機制進行叢集內的節點進行負載均衡,儘管大多數操作(請求)可能是“兩跳操作”。(圖片來源於Elasticsearch權威指南) 在這裡插入圖片描述
   正如上述圖所述,以一個新建操作為例,第一個請求首先發送到NODE1,然後會根據ID進行路由計算(hashcode(id)%主分片個數),例如使用p0(第一個主分片),此時NODE1會將請求轉發到Node3,然後客戶端傳送第二個請求,會發送到NODE2上(上文中的輪詢機制)。    預設構建TransportClient的方法如下:

// on startup
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 節點,可以通過addTransportAddress方法連線多個Node節點,這樣請求會輪流傳送到這些節點上,實現叢集節點在接受請求時的負載均衡。    TransportClient級別的主要引數如下:

引數名 描述
transport node與服務端節點並不在一個叢集中
client.transport.sniff 是否開啟叢集嗅探功能,下文會詳細介紹。
client.transport.ignore_cluster_name 是否忽略連線節點的叢集名稱校驗,設定為true表示忽略,避免連線的節點並不在同一個叢集中。
client.transport.ping_timeout ping命令的響應超時時間,預設為5s。
client.transport.nodes_sampler_interval 對連線節點發送ping命令的頻率,預設為5s,即常說的心跳檢測間隔時間。

接下來重點描述一下client.transport.sniff引數,叢集群嗅探機制。    在建立TransportClient時可以通過addTransportAddress來靜態的增加ElasticSearch叢集中的節點,如果開啟叢集群嗅探機制,即開啟節點動態發現機制,允許動態新增和刪除節點。當啟用嗅探功能時,首先客戶端會連線addTransportAddress中的節點上。在此之後,客戶端將呼叫這些節點上的內部叢集狀態API來發現可用的資料節點。客戶端的內部節點列表將僅被發現的資料資料節點替換。預設情況下,這個列表每5秒重新整理一次。也就意味著如果該節點不是資料節點,則列表可能不包括它連線的原始節點。例如,如果您最初連線到一個主節點,在嗅探之後,如果發現了有其對應的資料節點,則不會再向該主節點發出請求,而是向任何資料節點發出請求。傳輸客戶端排除非資料節點的原因是為了避免只向主節點發送搜尋流量。    使用配置構建Settings構建TransportClient物件程式碼如下:

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))  ;
 //Add transport addresses and do something with the client...

2.2、TransportClient API    TransportClient 的核心類繼承圖如下: 在這裡插入圖片描述    上述API的設計要點:    整個客戶端API提供兩個最底層的方法,execute,其關鍵特徵如下:

  • ActionFuture execute(Action<Request, Response, RequestBuilder> action, Request request);    返回ActionFuture,根據名稱即可知道,該方法是典型的非同步呼叫,Future模式。
  • void execute(Action<Request, Response, RequestBuilder> action, Request request, ActionListener listener);    無返回值,但需要傳入ActionListener listener,同樣根據名稱即可知道,該引數的作用是事件監聽器(回撥方法),也就是收到服務端響應後,呼叫回撥函式,進行結果處理。 注意:ElasticSearch Client API 其本質是使用非同步請求模式。
  • prepare 開頭的方法,例如IndexRequestBuilder prepareIndex()    這類API的設計是使用Build模式,先通過build構建請求引數,最終會通過呼叫get()方法完成介面呼叫。    TransportClient Api就先解釋到這裡了,後續會詳細對上述API進行分類詳解。 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客戶端有兩種風格:

  • Java Low Level REST Client:elasticsearch client 低級別客戶端。它允許通過http請求與Elasticsearch叢集進行通訊。API本身不負責資料的編碼解碼,由使用者去編碼解碼。它與所有的ElasticSearch版本相容。
  • Java High Level REST Client:Elasticsearch client官方高階客戶端。基於低階客戶端,它定義的API,已經對請求與響應資料包進行編碼解碼。 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”)其機制與TransportClient的addTransportAddress的作用一致。    3.1.2 核心API依懶    RestHighLevelClient 的類圖 如下: 在這裡插入圖片描述    其API設計具有如下特徵:

  • 每個API提供同步與非同步呼叫,方法名以async結尾的方法為非同步呼叫,需要提供對應的ActionListener實現。
  • 每個API都可以提供RequestOptions物件來定製請求選型。    本節將不會對上述API一一介紹,上述API會在後續文章中詳細解析。 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>

   本文就先介紹到這裡了,詳細分析介紹了Elasticsearch兩大客戶端 TransportClient與RestHighLevelClient ,後續文章會詳細介紹各個API,例如文件的索引、更新、查詢、刪除、批量查詢,Search API等。

   相關文章首先會在筆者的微信公眾號首發,該公眾號專注於java併發、Netty、Mycat、RocketMQ、ElasticJob、Dubbo、ElasticSearch等中介軟體技術。 在這裡插入圖片描述