Elasticsearch Java API - 客戶端連接(TransportClient,PreBuiltXPackTransportClient)(一)

Elasticsearch Java API 客戶端連接

一個是TransportClient,一個是NodeClient,還有一個XPackTransportClient

  • TransportClient:

作為一個外部訪問者,請求ES的集群,對于集群而言,它是一個外部因素。

  • NodeClient

作為ES集群的一個節(jié)點,它是ES中的一環(huán),其他的節(jié)點對它是感知的。

  • XPackTransportClient:

服務(wù)安裝了 x-pack 插件

重要:客戶端版本應(yīng)該和服務(wù)端版本保持一致

TransportClient旨在被Java高級REST客戶端取代,該客戶端執(zhí)行HTTP請求而不是序列化的Java請求。 在即將到來的Elasticsearch版本中將不贊成使用TransportClient,建議使用Java高級REST客戶端。

上面的警告比較尷尬,但是在 5xx版本中使用還是沒有問題的,可能使用rest 客戶端兼容性更好做一些。

Elasticsearch Java Rest API 手冊

Maven Repository

Elasticsearch Java API包已經(jīng)上傳到 Maven Central

pom.xml文件中增加:

transport 版本號最好就是與Elasticsearch版本號一致。

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>5.6.3</version>
</dependency>

Transport Client

不設(shè)置集群名稱

// on startup

//此步驟添加IP,至少一個,如果設(shè)置了"client.transport.sniff"= true 一個就夠了,因為添加了自動嗅探配置
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));

// on shutdown  關(guān)閉client

client.close();

設(shè)置集群名稱

Settings settings = Settings.builder()
        .put("cluster.name", "myClusterName").build();  //設(shè)置ES實例的名稱
TransportClient client = new PreBuiltTransportClient(settings);  //自動嗅探整個集群的狀態(tài),把集群中其他ES節(jié)點的ip添加到本地的客戶端列表中
//Add transport addresses and do something with the client...

增加自動嗅探配置

Settings settings = Settings.builder()
        .put("client.transport.sniff", true).build();
TransportClient client = new PreBuiltTransportClient(settings);

其他配置

client.transport.ignore_cluster_name  //設(shè)置 true ,忽略連接節(jié)點集群名驗證
client.transport.ping_timeout       //ping一個節(jié)點的響應(yīng)時間 默認(rèn)5秒
client.transport.nodes_sampler_interval //sample/ping 節(jié)點的時間間隔,默認(rèn)是5s

對于ES Client,有兩種形式,一個是TransportClient,一個是NodeClient。兩個的區(qū)別為:
TransportClient作為一個外部訪問者,通過HTTP去請求ES的集群,對于集群而言,它是一個外部因素。
NodeClient顧名思義,是作為ES集群的一個節(jié)點,它是ES中的一環(huán),其他的節(jié)點對它是感知的,不像TransportClient那樣,ES集群對它一無所知。NodeClient通信的性能會更好,但是因為是ES的一環(huán),所以它出問題,也會給ES集群帶來問題。NodeClient可以設(shè)置不作為數(shù)據(jù)節(jié)點,在elasticsearch.yml中設(shè)置,這樣就不會在此節(jié)點上分配數(shù)據(jù)。

如果用ES的節(jié)點,仁者見仁智者見智。

實例

package name.quanke.es.study;

import name.quanke.es.study.util.Utils;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.After;
import org.junit.Before;

import java.net.InetAddress;

/**
 * Elasticsearch 5.5.1 的client 和 ElasticsearchTemplate的初始化
 * 作為一個外部訪問者,請求ES的集群,對于集群而言,它是一個外部因素。
 * Created by http://quanke.name on 2017/11/10.
 */
public class ElasticsearchClient {

    protected TransportClient client;

    @Before
    public void setUp() throws Exception {

        Settings esSettings = Settings.builder()
                .put("cluster.name", "utan-es") //設(shè)置ES實例的名稱
                .put("client.transport.sniff", true) //自動嗅探整個集群的狀態(tài),把集群中其他ES節(jié)點的ip添加到本地的客戶端列表中
                .build();

        /**
         * 這里的連接方式指的是沒有安裝x-pack插件,如果安裝了x-pack則參考{@link ElasticsearchXPackClient}
         * 1. java客戶端的方式是以tcp協(xié)議在9300端口上進(jìn)行通信
         * 2. http客戶端的方式是以http協(xié)議在9200端口上進(jìn)行通信
         */
        client = new PreBuiltTransportClient(esSettings)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.1.10"), 9300));

        System.out.println("ElasticsearchClient 連接成功");
    }

    @After
    public void tearDown() throws Exception {
        if (client != null) {
            client.close();
        }

    }

    protected void println(SearchResponse searchResponse) {
        Utils.println(searchResponse);
    }

}


本實例代碼已經(jīng)上傳到 Git ElasticsearchClient.java

所有實例 已經(jīng)上傳到Git

XPackTransportClient

如果 ElasticSearch 服務(wù)安裝了 x-pack 插件,需要PreBuiltXPackTransportClient實例才能訪問

使用Maven管理項目,把下面代碼增加到pom.xml;

一定要修改默認(rèn)倉庫地址為https://artifacts.elastic.co/maven ,因為這個庫沒有上傳到Maven中央倉庫,如果有自己的 maven ,請配置代理

<project ...>

   <repositories>
      <!-- add the elasticsearch repo -->
      <repository>
         <id>elasticsearch-releases</id>
         <url>https://artifacts.elastic.co/maven</url>
         <releases>
            <enabled>true</enabled>
         </releases>
         <snapshots>
            <enabled>false</enabled>
         </snapshots>
      </repository>
      ...
   </repositories>
   ...

   <dependencies>
      <!-- add the x-pack jar as a dependency -->
      <dependency>
         <groupId>org.elasticsearch.client</groupId>
         <artifactId>x-pack-transport</artifactId>
         <version>5.6.3</version>
      </dependency>
      ...
   </dependencies>
   ...

 </project>

實例


/**
 * Elasticsearch XPack Client
 * Created by http://quanke.name on 2017/11/10.
 */
public class ElasticsearchXPackClient {

    protected TransportClient client;
    
    @Before
    public void setUp() throws Exception {
        /**
         * 如果es集群安裝了x-pack插件則以此種方式連接集群
         * 1. java客戶端的方式是以tcp協(xié)議在9300端口上進(jìn)行通信
         * 2. http客戶端的方式是以http協(xié)議在9200端口上進(jìn)行通信
         */
        Settings settings = Settings.builder()
                .put("xpack.security.user", "elastic:utan100")
                .put("cluster.name", "utan-es")
                .build();
        client = new PreBuiltXPackTransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.1.10"), 9300));
//        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
//        credentialsProvider.setCredentials(AuthScope.ANY,
//                new UsernamePasswordCredentials("elastic", "utan100"));

        System.out.println("ElasticsearchXPackClient 啟動成功");
    }

    @Test
    public void testClientConnection() throws Exception {

        System.out.println("--------------------------");
    }

    @After
    public void tearDown() throws Exception {
        if (client != null) {
            client.close();
        }

    }

    protected void println(SearchResponse searchResponse) {
        Utils.println(searchResponse);
    }
}

本實例代碼已經(jīng)上傳到 Git ElasticsearchXPackClient.java

所有實例 已經(jīng)上傳到Git

更多請瀏覽 spring-boot-starter-es 開源項目

如何有任何問題請給我留言

全科龍婷▼升職加薪

全科龍婷
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,969評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,959評論 6 342
  • 緣份如此神奇和美妙,每個人在對愛,對自己,對未來,對彼此都無限憧憬~ 愛的理解如此多般不同,處在不同的時間,地點,...
    嬌之語閱讀 321評論 1 1
  • 建筑學(xué)學(xué)生的Harvard之路(2012-04-27 14:04:51) 一般認(rèn)為能上Harvard的同學(xué)一定是G...
    lockchen閱讀 575評論 0 0
  • 科斯定律的基本含義 只要交易費用足夠低那么無論資源最后歸誰所有,資源的用途都應(yīng)該是一樣的,誰用得好就歸誰。誰避...
    青山外客閱讀 383評論 0 0