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

         
}
相关推荐
程序员黑豆4 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
GreenTea5 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
风流 少年5 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅5 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
万少5 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
C++、Java和Python的菜鸟6 小时前
第2章 项目前置课-代码版本控制Git
大数据·elasticsearch·搜索引擎
小席是个热心肠6 小时前
AI相关的自我学习
java·人工智能·学习
数智化管理手记8 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
cfm_29148 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统9 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库