Constructing ES Multi client Based on Springboot2.0

  • 2021-07-24 10:54:04
  • OfStack

Sometimes when we operate es, we have a special requirement. For example, index that needs to be operated uses different es servers, user names, passwords, parameters, etc. At this time, we need to use different es clients to operate, but we don't want to split it into multiple projects for use. At this time, we need to build a set of ES multi-clients in our configuration.

Article catalog

pom.xml
ElasticsearchConfig.java
ElasticsearchRestClient.java
Ultimately

pom.xml

First, our pom. xml:


<dependencies>
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter</artifactId>
   <version>2.0.5.RELEASE</version>
  </dependency>
  
  <!--es for transport-->
  <dependency>
   <groupId>org.elasticsearch</groupId>
   <artifactId>elasticsearch</artifactId>
   <version>5.6.11</version>
  </dependency>

  <dependency>
   <groupId>org.elasticsearch.client</groupId>
   <artifactId>elasticsearch-rest-client</artifactId>
   <version>5.6.11</version>
  </dependency>

  <!--es sniffer-->
  <dependency>
   <groupId>org.elasticsearch.client</groupId>
   <artifactId>elasticsearch-rest-client-sniffer</artifactId>
   <version>5.6.3</version>
   <scope>compile</scope>
  </dependency>

  <!--es for rest-high-level-client-->
  <dependency>
   <groupId>org.elasticsearch.client</groupId>
   <artifactId>elasticsearch-rest-high-level-client</artifactId>
   <version>5.6.11</version>
  </dependency>

  <dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
   <version>3.4</version>
  </dependency>

  <dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.39</version>
  </dependency>

  <dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-core</artifactId>
   <version>2.9.1</version>
  </dependency>

  <!-- SpringBoot  Hot start  -->
  <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
  </dependency>

  <dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-pool2</artifactId>
   <version>2.4.2</version>
  </dependency>

  <dependency>
   <groupId>org.elasticsearch.client</groupId>
   <artifactId>elasticsearch-rest-client-sniffer</artifactId>
   <version>5.6.0</version>
  </dependency>

  <dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>2.6</version>
  </dependency>
</dependencies>

ElasticsearchConfig.java

Then there is our configuration file. I use the configuration file of application. properties here. Because we use different information, I won't write it here. I can get it according to my needs.

ElasticsearchRestClient.java


import cnkj.site.config.ElasticsearchConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.sniff.SniffOnFailureListener;
import org.elasticsearch.client.sniff.Sniffer;
import org.elasticsearch.client.sniff.SnifferBuilder;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/*
 * @version 1.0 created by LXW on 2018/11/22 9:43
 */
@Slf4j
@Configuration
public class ElasticsearchClient {

 @Bean(name = "HighESClient")
 public RestClient restTomcatClient(ElasticsearchConfig elasticsearchConfig) {
  final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
  credentialsProvider.setCredentials(AuthScope.ANY,
    //es Account password 
    new UsernamePasswordCredentials(elasticsearchConfig.getUsername(), elasticsearchConfig.getPassword()));
  // Automatic scanning network segment 
  // Monitor services on the same network segment 
  //Low Level Client init
  RestClientBuilder builder = RestClient.builder(
    new HttpHost(
      elasticsearchConfig.getHost(),
      Integer.valueOf(elasticsearchConfig.getPort()),
      elasticsearchConfig.getSchema()
    )
  ).setHttpClientConfigCallback(
    httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)
  ).setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {
     @Override
     public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder builder) {
      builder.setConnectTimeout(elasticsearchConfig.getConnectTimeout());
      builder.setSocketTimeout(elasticsearchConfig.getSocketTimeout());
      return builder;
     }
    })
    .setMaxRetryTimeoutMillis(elasticsearchConfig.getMaxRetryTimeoutMillis());
  builder.setMaxRetryTimeoutMillis(elasticsearchConfig.getMaxRetryTimeoutMillis());
  SniffOnFailureListener sniffOnFailureListener = new SniffOnFailureListener();
  builder.setFailureListener(sniffOnFailureListener);
  RestClient lowLevelRestClient = builder.build();
  SnifferBuilder snifferBuilder = Sniffer.builder(lowLevelRestClient).setSniffIntervalMillis(elasticsearchConfig.getSnifferinterval());
  if (elasticsearchConfig.getFailuredelay() > 0) {
   snifferBuilder.setSniffAfterFailureDelayMillis(elasticsearchConfig.getFailuredelay());
  }
  sniffOnFailureListener.setSniffer(snifferBuilder.build());
  return lowLevelRestClient;
 }
 @Bean(name = "HighLevelESClient")
 public RestHighLevelClient restHighLevelClient(@Qualifier("HighESClient") RestClient restClient) {
  return new RestHighLevelClient(restClient);
 }

}

Ultimately

Use different clients directly through injection where they need to be used


@Resource(name = "HighLevelESClient")
private RestHighLevelClient client;

Related articles: