Облачная платформаAdvanced

Доступ к кластеру Elasticsearch через High Level REST Client

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Elasticsearch предоставляет SDK (High Level REST Client) для подключения к кластеру. Этот клиент инкапсулирует API Elasticsearch. Вам необходимо лишь сформировать требуемые структуры для доступа к кластеру Elasticsearch. Подробнее о том, как использовать Rest Client, см. официальную документацию по адресу https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html.

В этом разделе описывается, как использовать High Level REST Client для доступа к кластеру CSS. High Level REST Client можно подключить к кластеру одним из следующих способов:

Ограничения

Версия High Level REST Client должна соответствовать версии Elasticsearch. Например, используйте High Level REST Client 7.6.2 для доступа к кластеру Elasticsearch 7.6.2. Если версия вашего Java High Level REST Client новее кластера Elasticsearch и возникают проблемы совместимости с некоторыми запросами, вы можете использовать RestHighLevelClient.getLowLevelClient() для получения Low Level Client и настройки содержимого запросов Elasticsearch.

Требования

  • Доступны кластеры CSS.
  • У вас есть сервер с запущенным Java, который может взаимодействовать с кластером CSS.
  • В зависимости от используемого метода настройки сети получите адрес доступа к кластеру. Подробности см Настройка сети.
  • Установите JDK 1.8 на сервер. Вы можете загрузить JDK 1.8 по адресу: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
  • Java зависимости были установлены на сервере.

    7.6.2 указывает версию клиента Elasticsearch Java.

    • Maven mode:
      <dependency>
      <groupId>org.elasticsearch.client</groupId>
      <artifactId>elasticsearch-rest-high-level-client</artifactId>
      <version>7.6.2</version>
      </dependency>
      <dependency>
      <groupId>org.elasticsearch</groupId>
      <artifactId>elasticsearch</artifactId>
      <version>7.6.2</version>
      </dependency>
    • Gradle mode:
      compile group: 'org.elasticsearch.client', name: 'elasticsearch-rest-high-level-client', version: '7.6.2'

Connecting to a Non-Security Mode Cluster Through the High Level REST Client

Используйте High Level REST Client для подключения к кластеру в режиме без безопасности и проверьте, тест индекс существует. Пример кода приведён ниже:

import org.apache.http.HttpHost;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
/**
* Используйте Rest Hive Level для подключения к кластеру без безопасности.
*/
public class Main {
public static void main(String[] args) throws IOException {
List<String> host = Arrays.asList("xx.xx.xx.xx", "xx.xx.xx.xx");
RestClientBuilder builder = RestClient.builder(constructHttpHosts(host, 9200, "http"));
final RestHighLevelClient client = new RestHighLevelClient(builder);
GetIndexRequest indexRequest = new GetIndexRequest("test");
boolean exists = client.indices().exists(indexRequest, RequestOptions.DEFAULT);
System.out.println(exists);
client.close();
}
/**
* Используйте функцию constructHttpHosts для преобразования списка IP‑адресов узлов хост‑кластера.
*/
public static HttpHost[] constructHttpHosts(List<String> host, int port, String protocol) {
return host.stream().map(p -> new HttpHost(p, порт, протокол)).toArray(HttpHost[]::new);
}
}

хост указывает IP‑адрес кластера. Если указано несколько IP‑адресов, разделите их запятыми (,). тест указывает имя индекса для запроса.

Подключение к кластеру в режиме Security-Mode через High Level REST Client (Без сертификата безопасности)

Подключитесь к кластеру в режиме безопасности, который использует HTTP или HTTPS без использования сертификата безопасности.

Пример кода выглядит следующим образом:

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.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
импорт org.elasticsearch.common.Nullable;
импорт java.io.IOException;
импорт java.security.KeyManagementException;
импорт java.security.NoSuchAlgorithmException;
импорт java.security.SecureRandom;
импорт java.security.cert.CertificateException;
импорт java.security.cert.X509Certificate;
импорт java.util.Arrays;
импорт java.util.List;
импорт java.util.Objects;
импорт javax.net.ssl.HostnameVerifier;
импорт javax.net.ssl.SSLContext;
импорт javax.net.ssl.SSLSession;
импорт javax.net.ssl.TrustManager;
импорт javax.net.ssl.X509TrustManager;
/**
* Подключитесь к кластеру безопасности через Rest High Level (без использования сертификатов).
*/
public class Main {
/**
* Создайте класс для клиента. Определите функцию create.
*/
public static RestHighLevelClient create(List<String> host, int port, String protocol, int connectTimeout, int connectionRequestTimeout, int socketTimeout, String username, String password) throws IOException{
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
SSLContext sc = null;
try {
sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
} catch (KeyManagementException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
SSLIOSessionStrategy sessionStrategy = new SSLIOSessionStrategy(sc, new NullHostNameVerifier());
SecuredHttpClientConfigCallback httpClientConfigCallback = new SecuredHttpClientConfigCallback(sessionStrategy,
credentialsProvider);
RestClientBuilder builder = RestClient.builder(constructHttpHosts(host, port, protocol))
.setRequestConfigCallback(requestConfig -> requestConfig.setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.setSocketTimeout(socketTimeout))
.setHttpClientConfigCallback(httpClientConfigCallback);
final RestHighLevelClient client = new RestHighLevelClient(builder);
logger.info("es rest client build success {} ", client);
ClusterHealthRequest request = new ClusterHealthRequest();
ClusterHealthResponse response = client.cluster().health(request, RequestOptions.DEFAULT);
logger.info("es rest client health response {} ", response);
return client;
}
/**
* Используйте функцию constructHttpHosts для преобразования списка IP‑адресов узлов хост‑кластера.
*/
public static HttpHost[] constructHttpHosts(List<String> host, int port, String protocol) {
return Хост.поток().map(p -> new HttpHost(p, порт, протокол)).toArray(HttpHost[]::new);
}
/**
* Настройте trustAllCerts, чтобы игнорировать конфигурацию сертификата.
*/
public static TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
};
private static final Logger logger = LogManager.getLogger(Main.class);
static class SecuredHttpClientConfigCallback implements RestClientBuilder.HttpClientConfigCallback {
@Nullable
private final CredentialsProvider credentialsProvider;
/**
* {@link SSLIOSessionStrategy} для всех запросов, чтобы включить шифрование SSL / TLS.
*/
private final SSLIOSessionStrategy sslStrategy;
/**
* Создать новый {@link SecuredHttpClientConfigCallback}.
*
* @param credentialsProvider Провайдер учетных данных, если указаны имя пользователя/пароль
* @param sslStrategy SSL‑стратегия, если SSL / TLS были предоставлены
* @throws NullPointerException если {@code sslStrategy} равен {@code null}
*/
SecuredHttpClientConfigCallback(final SSLIOSessionStrategy sslStrategy,
@Nullable final CredentialsProvider credentialsProvider) {
this.sslStrategy = Objects.requireNonNull(sslStrategy);
this.credentialsProvider = credentialsProvider;
}
/**
* Получить {@link CredentialsProvider}, который будет добавлен к HTTP client.
*
* @return Может быть {@code null}.
*/
@Nullable
CredentialsProvider getCredentialsProvider() {
return credentialsProvider;
}
/**
* Получить {@link SSLIOSessionStrategy}, который будет добавлен в HTTP клиент.
*
* @return Никогда {@code null}.
*/
SSLIOSessionStrategy getSSLStrategy() {
return sslStrategy;
}
/**
* Устанавливает {@linkplain HttpAsyncClientBuilder#setDefaultCredentialsProvider(CredentialsProvider) провайдер учетных данных},
*
* @param httpClientBuilder Клиент для настройки.
* @return Всегда {@code httpClientBuilder}.
*/
@Override
public HttpAsyncClientBuilder customizeHttpClient(final HttpAsyncClientBuilder httpClientBuilder) {
// включить SSL / TLS
httpClientBuilder.setSSLStrategy(sslStrategy);
// enable user authentication
if (credentialsProvider != null) {
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
return httpClientBuilder;
}
}
public static class NullHostNameVerifier implements HostnameVerifier {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
}
/**
* Следующее является примером основной функции. Вызовите функцию create, чтобы создать клиент и проверить, существует ли тестовый индекс.
*/
public static void main(String[] args) throws IOException {
RestHighLevelClient client = create(Arrays.asList("xx.xx.xx.xx", "xx.xx.xx.xx"), 9200, "https", 1000, 1000, 1000, "username", "password");
GetIndexRequest indexRequest = new GetIndexRequest("test");
boolean exists = клиент.индексы().существует(indexRequest, RequestOptions.DEFAULT);
System.out.println(существует);
клиент.close();
}
}
Таблица 1 Переменные

Параметр

Описание

host

IP-адрес для доступа к кластеру Elasticsearch. Если указано несколько IP-адресов, разделите их запятыми (,).

port

Порт доступа к кластеру Elasticsearch. Значение по умолчанию — 9200.

protocol

Протокол соединения, который может быть http или https.

connectTimeout

Таймаут сокетного соединения (в мс).

connectionRequestTimeout

Таймаут запроса сокетного соединения (в мс).

socketTimeout

Тайм-аут запроса сокета (в мс).

username

Имя пользователя для доступа к кластеру.

password

Пароль пользователя.

Подключение к кластеру в режиме безопасности через клиент высокого уровня REST (с сертификатом безопасности)

Подключитесь к кластеру Elasticsearch в режиме безопасности, использующему HTTPS с сертификатом безопасности. Пример кода выглядит следующим образом:

Caution

Как получить и загрузить сертификат безопасности, см. Получение и загрузка сертификата безопасности.

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.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.Nullable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
/**
* Используйте Rest Hive Level для подключения к безопасному кластеру (с использованием HTTPS сертификата).
*/
public class Main {
public static RestHighLevelClient create(List<String> host, int port, String protocol, int connectTimeout, int connectionRequestTimeout, int socketTimeout, String username, String password, String certFilePath,
String certPassword) throws IOException {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
SSLContext sc = null;
try {
TrustManager[] tm = {new MyX509TrustManager(certFilePath, certPassword)};
sc = SSLContext.getInstance("SSL", "SunJSSE");
//Вы также можете использовать SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sc.init(null, tm, new SecureRandom());
} catch (Exception e) {
e.printStackTrace();
}
SSLIOSessionStrategy sessionStrategy = new SSLIOSessionStrategy(sc, new NoopHostnameVerifier());
SecuredHttpClientConfigCallback httpClientConfigCallback = new SecuredHttpClientConfigCallback(sessionStrategy,
credentialsProvider);
RestClientBuilder builder = RestClient.builder(constructHttpHosts(host, port, протокол))
.setRequestConfigCallback(requestConfig -> requestConfig.setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.setSocketTimeout(socketTimeout))
.setHttpClientConfigCallback(httpClientConfigCallback);
final RestHighLevelClient client = new RestHighLevelClient(builder);
logger.info("es rest client build success {} ", client);
ClusterHealthRequest request = new ClusterHealthRequest();
ClusterHealthResponse response = client.cluster().health(request, RequestOptions.DEFAULT);
logger.info("es rest client health response {} ", ответ);
вернуть клиент;
}
/**
* Используйте функцию constructHttpHosts для преобразования списка IP‑адресов узлов кластера хостов.
*/
public static HttpHost[] constructHttpHosts(List<String> host, int port, Строка протокол) {
return хост.стрим().map(p -> new HttpHost(p, порт, протокол)).toArray(HttpHost[]::new);
}
/**
* SecuredHttpClientConfigCallback определение класса
*/
static class SecuredHttpClientConfigCallback implements RestClientBuilder.HttpClientConfigCallback {
@Nullable
private final CredentialsProvider credentialsProvider;
private final SSLIOSessionStrategy sslStrategy;
SecuredHttpClientConfigCallback(final SSLIOSessionStrategy sslStrategy,
@Nullable final CredentialsProvider credentialsProvider) {
this.sslStrategy = Objects.requireNonNull(sslStrategy);
this.credentialsProvider = credentialsProvider;
}
@Nullable
CredentialsProvider getCredentialsProvider() {
return credentialsProvider;
}
SSLIOSessionStrategy getSSLStrategy() {
return sslStrategy;
}
@Override
public HttpAsyncClientBuilder customizeHttpClient(final HttpAsyncClientBuilder httpClientBuilder) {
httpClientBuilder.setSSLStrategy(sslStrategy);
if (credentialsProvider != null) {
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
return httpClientBuilder;
}
}
private static final Logger logger = LogManager.getLogger(Main.class);
public static class MyX509TrustManager implements X509TrustManager {
X509TrustManager sunJSSEX509TrustManager;
MyX509TrustManager(String certFilePath, String certPassword) throws Exception {
File file = new File(certFilePath);
if (!file.isFile()) {
throw new Exception("Неправильный путь сертификата");
}
System.out.println("Загрузка KeyStore " + file + "...");
InputStream in = new FileInputStream(file);
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(in, certPassword.toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509", "SunJSSE");
tmf.init(ks);
TrustManager[] tms = tmf.getTrustManagers();
for (TrustManager tm : tms) {
if (tm instanceof X509TrustManager) {
sunJSSEX509TrustManager = (X509TrustManager) tm;
return;
}
}
throw new Exception("Couldn't initialize");
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
/**
* Следующий пример основной функции. Вызовите функцию create, чтобы создать клиент и проверить, существует ли тестовый индекс.
*/
public static void main(String[] args) throws IOException {
RestHighLevelClient client = create(Arrays.asList("xxx.xxx.xxx.xxx", "xxx.xxx.xxx.xxx"), 9200, "https", 1000, 1000, 1000, "username", "password", "certFilePath", "certPassword");
GetIndexRequest indexRequest = new GetIndexRequest("test");
boolean exists = клиент.индексы().существует(indexRequest, RequestOptions.DEFAULT);
System.out.println(существует);
клиент.close();
}
}
Таблица 2 Параметры функции

Параметр

Описание

Хост

IP‑адрес для доступа к кластеру Elasticsearch. Если указано несколько IP‑адресов, разделите их запятыми (,).

port

Порт доступа к кластеру Elasticsearch. Значение по умолчанию 9200.

протокол

Протокол соединения. Установите этот параметр в https.

connectTimeout

Тайм‑аут сокет‑соединения (в мс).

connectionRequestTimeout

Тайм‑аут запроса сокет‑соединения (в мс).

socketTimeout

Тайм‑аут сокет‑запроса (в мс).

имя пользователя

Имя пользователя для доступа к кластеру.

пароль

Пароль пользователя.

certFilePath

Путь к сертификату.

certPassword

Пароль сертификата.

Получение и загрузка сертификата безопасности

Для доступа к кластеру Elasticsearch в режиме security, использующему HTTPS, необходимо загрузить сертификат безопасности. Выполните следующие шаги, чтобы получить сертификат безопасности и загрузить его в клиент:

  1. Получить сертификат безопасности CloudSearchService.cer.
    1. Войдите в консоль управления CSS.
    2. В навигационной панели слева выберите Clusters > Elasticsearch.
    3. В списке кластеров щелкните имя целевого кластера. Появится страница информации о кластере.
    4. Нажмите Обзор вкладка. В Конфигурация области, щелкните Скачать сертификат рядом с HTTPS доступ.
  2. Конвертировать сертификат безопасности CloudSearchService.cer. Загрузите скачанный сертификат безопасности на клиент и используйте keytool для преобразования .cer сертификат в .jks сертификат, который может быть прочитан Java.
    • В Linux выполните следующую команду для преобразования сертификата:
      keytool -import -alias newname -keystore ./truststore.jks -file ./CloudSearchService.cer
    • В Windows выполните следующую команду для преобразования сертификата:
      keytool -import -alias newname -keystore .\truststore.jks -file .\CloudSearchService.cer

    В предыдущей команде, newname указывает пользовательское имя сертификата.

    После выполнения этой команды вам будет предложено задать пароль сертификата и подтвердить его. Надёжно сохраните пароль. Он будет использоваться для доступа к кластеру.