Elasticsearch 客戶端transport vs rest

Elasticsearch(ES)有兩種鏈接方式:transport、rest。transport經過TCP方式訪問ES(只支持java),rest方式經過http API 訪問ES(沒有語言限制)。html

Transport

  • 引入maven依賴
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>${elasticsearch.version}</version>
</dependency>
複製代碼
  • 建立transport client(5.x&6.X版本ES)
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
  
Settings settings = Settings.builder()
 .put("cluster.name", "myClusterName")
 .put("client.transport.sniff", true)
 .build();
TransportClient client = new PreBuiltTransportClient(settings)
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300));

複製代碼

設置client.transport.sniff爲true來使客戶端去嗅探整個集羣的狀態,把集羣中其它機器的ip地址加到客戶端中,這樣作的好處是通常你不用手動設置集羣裏全部集羣的ip到鏈接客戶端,它會自動幫你添加,而且自動發現新加入集羣的機器。java

rest(已引入transport不可以再引入 rest,包會發生衝突)

官方提供low-level rest client(支持5.0及之後版本) 和high-level rest client(支持版本爲 5.6及之後版本)bash

low-level rest client

  • 引入maven依賴
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>6.5.4</version>
</dependency>
複製代碼
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>rest</artifactId>
    <version>5.3.2</version>
</dependency>
複製代碼
  • 建立rest client
Header[] defaultHeaders = new Header[] { new BasicHeader("header", "value") };
RestClient restClient = RestClient.builder(
        new HttpHost("localhost", 9200, "http"))
    .setDefaultHeaders(defaultHeaders) //設置默認標頭
    .setMaxRetryTimeoutMillis(10000) //同一請求重試超時時間,默認30s
    .setFailureListener(new RestClient.FailureListener() {

    }) //設置偵聽器,節點出現故障會收到通知
    .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
        @Override
        public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            //create the authentication scope
            AuthScope authScope = new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope
                .ANY_REALM);
            // Create credential pair(username,password)
            UsernamePasswordCredentials usernamePasswordCredentials = new UsernamePasswordCredentials("username", "password");
            credentialsProvider.setCredentials(authScope, usernamePasswordCredentials);
            return httpClientBuilder.setKeepAliveStrategy(new ConnectionKeepAliveStrategy() {
                @Override
                public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
                    return 30 * 1000;
                }
            }).setDefaultCredentialsProvider(credentialsProvider);
        }
    })
    .setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
        @Override
        public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
            return requestConfigBuilder.setSocketTimeout(10000);
        }
    })
    .build();
複製代碼

high level rest client

  • 引入maven依賴
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>rest</artifactId>
    <version>${elasticsearch.version}</version>
</dependency>
複製代碼
  • 建立rest client
RestHighLevelClient client = new RestHighLevelClient(
  RestClient.builder(new HttpHost("localhost", 9200, "http")));
複製代碼

ES官方建議使用rest方式, transport 將計劃在後面的版本中廢棄。

相關文章
相關標籤/搜索