整合 Elasticsearch

Netty-Boot 项目中,推荐使用 java-db 连接 Elasticsearch,这能够简化与 Elasticsearch 的交互。Elasticsearch 是一个分布式搜索和分析引擎,广泛用于全文搜索、日志分析等场景。通过整合 java-dbelasticsearch-rest-high-level-client,可以快速实现与 Elasticsearch 的连接和操作。

Elasticsearch 连接原理

在 Java 应用中,通过 REST API 与 Elasticsearch 进行交互。elasticsearch-rest-high-level-client 是一个官方提供的高级客户端,基于 REST API 封装了对 Elasticsearch 的操作,使开发者能够通过 Java 代码轻松实现对 Elasticsearch 的索引、查询、删除等功能。

具体的连接和操作流程如下:

  1. 解析 Elasticsearch DSN:从配置文件中读取 DSN(Data Source Name),获取连接信息(如地址、端口、用户名、密码等)。
  2. 构建 RestHighLevelClient:通过 RestClientBuilder 构建高层次的客户端 RestHighLevelClient,负责与 Elasticsearch 服务器的通信。
  3. 身份验证:如果 DSN 包含用户名和密码,则设置身份验证信息,确保客户端能够通过安全验证连接到 Elasticsearch。
  4. 测试连接:通过客户端的 ping 方法测试连接是否成功,以确保 Elasticsearch 服务可用。
  5. 资源管理:在应用关闭时,确保客户端连接正确关闭,释放系统资源。

连接 Elasticsearch 示例

1. 添加依赖

在项目的 pom.xml 中添加以下依赖:

<dependency>
  <groupId>com.litongjava</groupId>
  <artifactId>java-db</artifactId>
  <version>${java-db.version}</version>
</dependency>

<dependency>
  <groupId>org.elasticsearch.client</groupId>
  <artifactId>elasticsearch-rest-high-level-client</artifactId>
  <version>7.10.0</version>
</dependency>
  • java-db:简化数据库和中间件的连接和操作。
  • elasticsearch-rest-high-level-client:官方提供的高级客户端,用于与 Elasticsearch 进行交互。

2. 添加 Elasticsearch 配置

在环境变量或 .env 配置文件中添加 Elasticsearch 的 DSN:

ELASTICSEARCH_DSN=http://elastic:v6YwugeWM8P2m@118.89.101.45:9200
  • ELASTICSEARCH_DSN:Elasticsearch 的连接字符串,包含了用户名、密码、地址和端口等信息。

3. 配置 Elasticsearch 客户端

创建 ImElasticSearchConfig 配置类,通过 RestHighLevelClient 建立与 Elasticsearch 的连接:

import java.io.IOException;

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.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;

import com.litongjava.annotation.AConfiguration;
import com.litongjava.annotation.AInitialization;
import com.litongjava.es.client.Elastic;
import com.litongjava.es.client.EsDSN;
import com.litongjava.es.client.EsDSNUtils;
import com.litongjava.hook.HookContainer;
import com.litongjava.tio.utils.environment.EnvUtils;
import com.litongjava.tio.utils.hutool.StrUtil;

import lombok.extern.slf4j.Slf4j;

@AConfiguration
@Slf4j
public class ImElasticSearchConfig {

  @Initialization
  public void config() {
    // 从环境变量或配置文件中读取 Elasticsearch DSN
    String dsn = EnvUtils.getStr("ELASTICSEARCH_DSN");

    if (dsn == null || dsn.isEmpty()) {
      System.out.println("DSN is not set");
      return;
    }

    // 解析 DSN
    EsDSN esInfo = EsDSNUtils.parse(dsn);

    // 创建 HttpHost 实例
    HttpHost httpHost = new HttpHost(esInfo.getHost(), esInfo.getPort(), esInfo.getSchema());

    // 配置 RestClientBuilder
    RestClientBuilder builder = RestClient.builder(httpHost);

    String username = esInfo.getUsername();
    String password = esInfo.getPassword();
    if (StrUtil.isNotEmpty(username)) {
      // 设置凭证提供者
      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
      credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));

      builder.setHttpClientConfigCallback(httpClientBuilder ->
        httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
    }

    // 创建 RestHighLevelClient
    RestHighLevelClient client = new RestHighLevelClient(builder);

    // 添加到 Elastic 中
    Elastic.setClient(client);

    // 测试连接状态
    try {
      log.info("ping es server:{}", client.ping(RequestOptions.DEFAULT));
    } catch (IOException e) {
      e.printStackTrace();
    }

    // 关闭时释放资源
    HookContainer.me().addDestroyMethod(() -> {
      try {
        client.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    });
  }
}

4. 测试 Elasticsearch 连接

在该配置类中,我们通过解析 ELASTICSEARCH_DSN 来获取 Elasticsearch 的连接信息。然后通过 RestHighLevelClient 与 Elasticsearch 建立连接,并使用 ping 方法测试连接状态。

  • 如果连接成功,会在日志中输出 ping es server:true
  • 如果连接失败,会捕获异常并打印错误信息。

5. 使用 Elasticsearch 客户端

完成配置后,你可以通过 com.litongjava.es.client.Elastic 类来操作 Elasticsearch。这个类封装了客户端的常见操作,使得与 Elasticsearch 的交互更加简单。

例如,你可以通过 Elastic.getClient() 来获取 RestHighLevelClient,然后执行索引、查询、删除等操作。

RestHighLevelClient client = Elastic.getClient();
// 使用 client 执行 Elasticsearch 操作

6. 资源管理

在项目结束或服务关闭时,确保客户端连接被正确关闭以释放系统资源。我们通过 HookContainer 在服务器关闭时自动调用 RestHighLevelClient.close() 方法,防止资源泄漏。

总结

通过上述步骤,我们在 Netty-Boot 项目中成功集成了 Elasticsearch,并使用 elasticsearch-rest-high-level-client 实现了与 Elasticsearch 的连接和操作。通过 java-db 的简化操作,开发者能够快速上手 Elasticsearch,进行各种复杂的搜索和分析功能。

Elasticsearch 连接的工作原理

  1. 解析 DSN:从环境变量或配置文件中获取 Elasticsearch 的连接信息,并解析出主机、端口、用户名、密码等。
  2. 创建客户端:通过 RestClientBuilder 创建 RestHighLevelClient,并配置必要的身份验证信息。
  3. 测试连接:通过 ping 方法测试客户端是否成功连接到 Elasticsearch 服务器,确保服务可用。
  4. 操作 Elasticsearch:通过封装的 Elastic 类,开发者可以方便地操作 Elasticsearch,执行各种索引、查询、更新和删除等操作。
  5. 资源管理:在应用关闭时,通过钩子函数自动关闭 Elasticsearch 客户端,释放资源。

通过这一整合方案,开发者可以快速构建基于 Elasticsearch 的强大搜索和分析系统,实现高效的全文检索和数据分析功能。