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;