最全SpringBoot3整合Elasticsearch8(1),吃透这份Java高级工程师面试497题解析

最后

各位读者,由于本篇幅度过长,为了避免影响阅读体验,下面我就大概概括了整理了

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

整合ES

环境准备

  1. 安装配置EShttps://blog.csdn.net/qq_50864152/article/details/136724528
  2. 安装配置Kibanahttps://blog.csdn.net/qq_50864152/article/details/136727707
  3. 新建项目:新建名为webSpringBoot3项目

elasticsearch-java

公共配置
  1. 介绍:一个开源的高扩展的分布式全文检索引擎,可以近乎实时的存储 和检索数据
  2. 依赖:web模块引入elasticsearch-java依赖---但其版本必须与你下载的ES的版本一致
<!-- 若不存在Spring Data ES的某个版本支持你下的ES版本,则使用 -->
<!-- ES 官方提供的在JAVA环境使用的依赖 -->
<dependency>
  <groupId>co.elastic.clients</groupId>
  <artifactId>elasticsearch-java</artifactId>
  <version>8.11.1</version>
</dependency>

<!-- 和第一个依赖是一起的,为了解决springboot项目的兼容性问题 -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
</dependency>

  1. 配置:web模块dev目录application-dal添加

使用open+@Value("${elasticsearch.open}")的方式不能放到Nacos配置中心

# elasticsearch配置
elasticsearch:
  # 自定义属性---设置是否开启ES,false表不开窍ES
  open: true
  # es集群名称,如果下载es设置了集群名称,则使用配置的集群名称
  clusterName: es
  hosts: 127.0.0.1:9200
  # es 请求方式
  scheme: http
  # es 连接超时时间
  connectTimeOut: 1000
  # es socket 连接超时时间
  socketTimeOut: 30000
  # es 请求超时时间
  connectionRequestTimeOut: 500
  # es 最大连接数
  maxConnectNum: 100
  # es 每个路由的最大连接数
  maxConnectNumPerRoute: 100

  1. 配置:web模块config包下新建ElasticSearchConfig
package cn.bytewisehub.pai.web.config;

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.Data;
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.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Slf4j
@Data
@Configuration
@ConfigurationProperties(prefix = "elasticsearch")
public class ElasticSearchConfig {

    // 是否开启ES
    private Boolean open;

    // es 集群host ip 地址
    private String hosts;

    // es用户名
    private String userName;

    // es密码
    private String password;

    // es 请求方式
    private String scheme;

    // es集群名称
    private String clusterName;

    // es 连接超时时间
    private int connectTimeOut;

    // es socket 连接超时时间
    private int socketTimeOut;

    // es 请求超时时间
    private int connectionRequestTimeOut;

    // es 最大连接数
    private int maxConnectNum;

    // es 每个路由的最大连接数
    private int maxConnectNumPerRoute;

    // es api key
    private String apiKey;


    public RestClientBuilder creatBaseConfBuilder(String scheme){


        // 1. 单节点ES Host获取
        String host = hosts.split(":")[0];
        String port = hosts.split(":")[1];
        // The value of the schemes attribute used by noSafeRestClient() is http
        // but The value of the schemes attribute used by safeRestClient() is https
        HttpHost httpHost = new HttpHost(host, Integer.parseInt(port),scheme);

        // 2. 创建构建器对象
        //RestClientBuilder: ES客户端库的构建器接口,用于构建RestClient实例;允许你配置与Elasticsearch集群的连接,设置请求超时,设置身份验证,配置代理等
        RestClientBuilder builder = RestClient.builder(httpHost);

        // 连接延时配置
        builder.setRequestConfigCallback(requestConfigBuilder -> {
            requestConfigBuilder.setConnectTimeout(connectTimeOut);
            requestConfigBuilder.setSocketTimeout(socketTimeOut);
            requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
            return requestConfigBuilder;
        });

        // 3. HttpClient 连接数配置
        builder.setHttpClientConfigCallback(httpClientBuilder -> {
            httpClientBuilder.setMaxConnTotal(maxConnectNum);
            httpClientBuilder.setMaxConnPerRoute(maxConnectNumPerRoute);
            return httpClientBuilder;
        });

        return builder;
    }
}

  1. 测试:web模块test目录下新建ElasticSearchTest
@Slf4j
@SpringBootTest
public class ElasticSearchTest {

    @Value("${elasticsearch.open}")
    // 是否开启ES,默认开启
    String open = "true";
}

直接连接ES
  1. 设置:ES Elasticsearch.ymlxpack.security.enabled属性设置为false

xpack.security.enabled
● 默认true:必须使用账号连接ES
● 若为false:必须使用http://localhost:9200/访问ES服务+启动Kibana服务会失败+不需要使用账号连接,但必须使用HTTP连接

  1. 添加:ElasticSearchConfig类添加下列方法
/\*\*
\* @function: 创建使用http连接来直接连接ES服务器的客户端
\* 如果@Bean没有指定bean的名称,那么这个bean的名称就是方法名
\*/
@Bean(name = "directConnectionESClient")
public ElasticsearchClient directConnectionESClient(){

    RestClientBuilder builder = creatBaseConfBuilder((scheme == "http")?"http":"http");
    
    //Create the transport with a Jackson mapper
    ElasticsearchTransport transport = new RestClientTransport(builder.build(), new JacksonJsonpMapper());

    //And create the API client
    ElasticsearchClient esClient = new ElasticsearchClient(transport);

    return esClient;
};

  1. 添加:ElasticSearchTest类中添加下列代码---索引名必须小写
  2. 运行:设置跳过测试--->手动运行/不跳过--->直接install,但不运行测试
@Resource(name = "directConnectionESClient")
ElasticsearchClient directConnectionESClient;


@Test
public void directConnectionTest() throws IOException {

if (open.equals("true")) {
    //创建索引
    CreateIndexResponse response = directConnectionESClient.indices().create(c -> c.index("direct\_connection\_index"));
    log.info(response.toString());
}
else{
    log.info("es is closed");
}
}

账号密码连接ES
  1. 设置:ES Elasticsearch.ymlxpack.security.enabled属性使用默认值+ xpack.security.http.ssl.enabled设置为false

注意:若xpack.security.enabled属性为false,则xpack.security.http.ssl.enabled属性不生效,即相当于设置为false;所有以xpack开头的属性都不会生效

ES Elasticsearch.ymlxpack.security.http.ssl.enabled
● 默认true:必须使用https://localhost:9200/访问ES服务+启动Kibana服务会成功+需要使用账号连接+必须使用HTTPS连接
● 若为false:必须使用http://localhost:9200/访问ES服务+启动Kibana服务会失败+需要使用账号连接,但必须使用HTTP连接

  1. 配置:dev目录application-dal中添加下列配置
# elasticsearch配置
elasticsearch:
  userName:  #自己的账号名
  password:  #自己的密码

  1. 添加:ElasticSearchTest类中添加下列代码---索引名必须小写+不能有空格
  2. 运行:设置跳过测试--->手动运行/不跳过--->直接install,但不运行测试
@Resource(name = "accountConnectionESClient")
ElasticsearchClient accountConnectionESClient;


@Test
public void accountConnectionTest() throws IOException {

if (open.equals("true")) {
    //创建索引
    CreateIndexResponse response = accountConnectionESClient.indices().create(c -> c.index("account\_connection\_index"));
    log.info(response.toString());
}
else{
    log.info("es is closed");
}
}

证书账号连接ES
  1. 设置:ES Elasticsearch.ymlxpack.security.enabledxpack.security.http.ssl.enabled配置项使用默认值

设置为true后,ES就走https,若schemehttp,则报Unrecognized SSL message错误

  1. 配置:将dev目录application-dalelasticsearch.scheme配置项改成https
  2. 证书添加:终端输入keytool -importcert -alias es_https_ca -keystore "D:\computelTool\Java\JDK\JDK21\lib\security\cacerts" -file "D:\computelTool\database\elasticsearch8111\config\certs\http_ca.crt"

keytool -delete -alias es_https_ca -keystore "D:\computelTool\Java\JDK\JDK21\lib\security\cacerts" ---与上面的命令相反

  1. 拷贝:将ESconfig目录下certs目录下的http_ca.crt文件拷贝到web模块resource目录
  2. 添加:ElasticSearchConfig类添加下列方法
/\*\*
\* @function: 创建用于安全连接(证书 + 账号)ES服务器的客户端
\* 如果@Bean没有指定bean的名称,那么这个bean的名称就是方法名
\*/
@Bean(name = "accountAndCertificateConnectionESClient")
public ElasticsearchClient accountAndCertificateConnectionESClient() {


    RestClientBuilder builder = creatBaseConfBuilder( (scheme == "https")?"https":"https");

    // 1.账号密码的配置
    //CredentialsProvider: 用于提供 HTTP 身份验证凭据的接口; 允许你配置用户名和密码,以便在与服务器建立连接时进行身份验证
    CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));

    // 2.设置自签证书,并且还包含了账号密码
    builder.setHttpClientConfigCallback(httpAsyncClientBuilder -> httpAsyncClientBuilder
                                        .setSSLContext(buildSSLContext())
                                        .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                                        .setDefaultCredentialsProvider(credentialsProvider));

    RestClientTransport transport = new RestClientTransport(builder.build(), new JacksonJsonpMapper());

    //And create the API client
    ElasticsearchClient esClient = new ElasticsearchClient(transport);

    return esClient;
}

private static SSLContext buildSSLContext() {

    // 读取http\_ca.crt证书
    ClassPathResource resource = new ClassPathResource("http\_ca.crt");
    SSLContext sslContext = null;
    try {
        // 证书工厂
        CertificateFactory factory = CertificateFactory.getInstance("X.509");
        Certificate trustedCa;
        try (InputStream is = resource.getInputStream()) {
            trustedCa = factory.generateCertificate(is);
        }
        // 密钥库
        KeyStore trustStore = KeyStore.getInstance("pkcs12");
        trustStore.load(null, "liuxiansheng".toCharArray());
        trustStore.setCertificateEntry("ca", trustedCa);
        SSLContextBuilder sslContextBuilder = SSLContexts.custom()
                 .loadTrustMaterial(trustStore, null);
        sslContext = sslContextBuilder.build();
    } catch (CertificateException | IOException | KeyStoreException | NoSuchAlgorithmException |
                 KeyManagementException e) {
        log.error("ES连接认证失败", e);
    }
    return sslContext;
}


  1. 测试:ElasticSearchTest类添加
@Resource(name = "accountAndCertificateConnectionESClient")
ElasticsearchClient accountAndCertificateConnectionESClient;

@Test
public void  accountAndCertificateConnectionTest() throws IOException {

if (open.equals("true")) {
    //创建索引
    CreateIndexResponse response =  accountAndCertificateConnectionESClient.indices().create(c -> c.index("account\_and\_certificate\_connection\_index"));
    log.info(response.toString());
    System.out.println(response.toString());
}
else{
    log.info("es is closed");
}
}

Spring Data ES

公共配置
  1. 依赖:web模块引入该依赖---但其版本必须与你下载的ES的版本一致

版本:点击https://spring.io/projects/spring-data-elasticsearch#learn,点击GA版本的Reference Doc,点击version查看Spring Data ESES版本的支持关系

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

Spring Data ESES版本的支持关系

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

[外链图片转存中…(img-af1mx02g-1715582676100)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 26
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值