主要maven 依赖
java
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.11.2</version>
</dependency>
工具类如下
java
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import lombok.Getter;
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.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import javax.net.ssl.*;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
/**
* @author gaodd
* @version 1.0
* @description esClient 工具类
* @date 2023/12/11 13:29
**/
@Slf4j
public class EsRestClientUtil implements AutoCloseable {
@Getter
private static final EsRestClientUtil instance = new EsRestClientUtil();
private EsRestClientUtil() {
// 私有化构造方法,防止外部实例化对象
}
private final ThreadLocal<RestClient> restClientTl = new ThreadLocal<>();
private final ThreadLocal<ElasticsearchTransport> elasticsearchTransportTl = new ThreadLocal<>();
/**
* 获取es Http类型的客户端
*
* @param host
* @param port
* @param login
* @param password
* @return
*/
public ElasticsearchClient getElasticsearchHttpClient(String host, int port, String login, String password) throws SSLException, NoSuchAlgorithmException, KeyManagementException {
return getElasticsearchClient(null, host, port, login, password, null);
}
public ElasticsearchClient getElasticsearchHttpsClient(String host, int port, String login, String password) throws SSLException, NoSuchAlgorithmException, KeyManagementException {
return getElasticsearchClient("https", host, port, login, password, null);
}
/**
* 关闭客户端
*/
@Override
public void close() {
if (elasticsearchTransportTl.get() != null) {
try {
elasticsearchTransportTl.get().close();
elasticsearchTransportTl.remove();
} catch (IOException e) {
log.error("关闭elasticsearchTransport异常", e);
}
}
if (restClientTl.get() != null) {
try {
restClientTl.get().close();
restClientTl.remove();
} catch (IOException e) {
log.error("关闭restClient异常", e);
}
}
}
/***
*
* @param schema https 或 http
* @param host 主机ip
* @param port 端口
* @param login 用户名
* @param password 密码
* @param fingerprint 证书指纹
* @return ElasticsearchClient
*/
public synchronized ElasticsearchClient getElasticsearchClient(String schema, String host, int port, String login, String password, String fingerprint) throws SSLException, NoSuchAlgorithmException, KeyManagementException {
RestClient restClient = getRestClient(schema, host, port, login, password, fingerprint);
var elasticsearchTransport = new RestClientTransport(
restClient,
new JacksonJsonpMapper()
);
restClientTl.set(restClient);
elasticsearchTransportTl.set(elasticsearchTransport);
return new ElasticsearchClient(elasticsearchTransport);
}
private RestClient getRestClient(String schema, String host, int port, String login, String password, String fingerprint) throws NoSuchAlgorithmException, KeyManagementException {
final var credsProv = new BasicCredentialsProvider();
credsProv.setCredentials(
AuthScope.ANY, new UsernamePasswordCredentials(login, password)
);
if ("https".equals(schema)) {
final var sc = SSLContext.getInstance("TLSv1.2");
sc.init(null, TRUST_ALL_CERTS, new SecureRandom());
// SSLContext sslContext = TransportUtils
// .sslContextFromCaFingerprint(fingerprint);
return RestClient
.builder(new HttpHost(host, port, schema))
.setHttpClientConfigCallback(hc -> hc
.setSSLContext(sc)
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.setDefaultCredentialsProvider(credsProv)).build();
}
return RestClient
.builder(new HttpHost(host, port, schema))
.setHttpClientConfigCallback(hc -> hc
.setDefaultCredentialsProvider(credsProv)
)
.build();
}
private final TrustManager[] TRUST_ALL_CERTS = new TrustManager[]{new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
log.info("all trusted");
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
log.info("no need to Trusted");
}
}};
}
使用方式如下 使用 try with resource 的方式实现自动关闭流
java
import co.elastic.clients.elasticsearch.cluster.ElasticsearchClusterClient;
import co.elastic.clients.elasticsearch.core.GetResponse;;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import java.io.IOException;
import java.io.Serializable;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
/**
* @author gaodd
* @description EsRestClientUtil 工具类使用示例
* @date 2023/12/8 10:44
**/
public class EsClientDemoTest {
@Test
public void testhttp(){
String host = "172.xx.xx.xx";
int port = 9200;
String login = "elastic";
String password = "pswd";
// Create the transport and the API client
try(EsRestClientUtil esRestClientUtil = EsRestClientUtil.getInstance()) {
var esClient = esRestClientUtil.getElasticsearchHttpClient( host, port, login, password);
ElasticsearchClusterClient cluster = esClient.cluster();
log.info("Indexed with version " + cluster.health());
} catch (IOException e) {
throw new RuntimeException(e);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
} catch (KeyManagementException e) {
throw new RuntimeException(e);
}
}
@Test
public void testhttps(){
String host = "172.xx.xx.xxx";
int port = 9200;
String login = "elastic";
String password = "pswd";
// Create the transport and the API client
try(EsRestClientUtil esRestClientUtil = EsRestClientUtil.getInstance()) {
var esClient = esRestClientUtil.getElasticsearchHttpsClient( host, port, login, password);
ElasticsearchClusterClient cluster = esClient.cluster();
log.info("Indexed with version " + cluster.health());
} catch (IOException e) {
throw new RuntimeException(e);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
} catch (KeyManagementException e) {
throw new RuntimeException(e);
}
}
}