spring boot3.2 集成 es 8.x 版本工具类 支持认证与非认证的方式( jdk21)

主要maven 依赖 

     
            co.elastic.clients
            elasticsearch-java
            8.11.2
        

工具类如下

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 restClientTl = new ThreadLocal<>();

    private final  ThreadLocal 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 的方式实现自动关闭流

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);
               }
           }

         
}

你可能感兴趣的:(spring,boot,elasticsearch,后端,java)