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

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

         
}
相关推荐
南宫生1 分钟前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石9 分钟前
12/21java基础
java
李小白6617 分钟前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp30 分钟前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
woshiabc11138 分钟前
windows安装Elasticsearch及增删改查操作
大数据·elasticsearch·搜索引擎
装不满的克莱因瓶1 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
n北斗1 小时前
常用类晨考day15
java
骇客野人1 小时前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言
AskHarries2 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
yuanbenshidiaos2 小时前
c++---------数据类型
java·jvm·c++