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

Доступ к кластеру Elasticsearch с помощью Spring Boot

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

Вы можете получить доступ к кластеру CSS с помощью Spring Boot. Spring Boot может подключаться к кластеру любым из следующих способов:

Note

Для получения подробной информации о том, как использовать Spring Boot, см. официальную документацию: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

Предостережения

  • Версия Elasticsearch High Level REST Client должна соответствовать версии Elasticsearch. Например, используйте High Level REST Client 7.10.2 для доступа к кластеру Elasticsearch 7.10.2.
  • В этом разделе в качестве примера используется Spring Boot 2.5.5, чтобы описать, как подключить Spring Boot к кластеру. Соответствующая версия Spring Data Elasticsearch — 4.2.x.

Требования

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

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

    • Режим Maven:
      <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.5.5</version>
      </parent>
      <dependencies>
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
      </dependency>
      <dependency>
      <groupId>org.elasticsearch.client</groupId>
      <artifactId>elasticsearch-rest-high-level-client</artifactId>
      <version>7.10.2</version>
      </dependency>
      </dependencies>

Доступ к HTTP Кластеру через Spring Boot

Этот сценарий применим к кластерам в режиме без безопасности или кластерам в режиме безопасности+HTTP.

Файл конфигурации:

1
2
3
4elasticsearch.url=host1:9200,host2:9200
// Вам не нужно настраивать следующие две строки для кластера без безопасности.
elasticsearch.имя пользователя=имя пользователя
elasticsearch.пароль=пароль
Таблица 1 Описание параметра

Параметр

Описание

Хост

IP адрес для доступа к кластеру Elasticsearch.

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

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

пароль

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

Код:

Note
  • com.xxx указывает каталог проекта, например, com.company.project.
  • com.xxx.repository является каталогом репозитория, который определяется extends org.springframework.data.elasticsearch.repository.ElasticsearchRepository.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43пакет com.xxx.configuration;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.xxx.repository")
@ComponentScan(basePackages = "com.xxx")
public class Config extends AbstractElasticsearchConfiguration {
@Value("${elasticsearch.url}")
public String elasticsearchUrl;
// Для кластера без безопасности вам не нужно задавать следующие два параметра.
@Value("${elasticsearch.username}")
public String elasticsearchUsername;
@Value("${elasticsearch.password}")
public String elasticsearchPassword;
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(StringHostParse(elasticsearchUrl))
// Для кластера без обеспечения безопасности нет необходимости настраивать withBasicAuth.
.withBasicAuth(elasticsearchUsername, elasticsearchPassword)
.build();
return RestClients.create(clientConfiguration).rest();
}
private String[] StringHostParse(String hostAndPorts) {
return hostAndPorts.split(",");
}
}

Использование Spring Boot для доступа к HTTPS‑кластеру (без использования какого‑либо сертификата безопасности)

Вы можете подключиться к кластеру в режиме безопасности + HTTPS без использования какого‑либо сертификата безопасности.

Файл конфигурации:

1
2
3elasticsearch.url=host1:9200,host2:9200
elasticsearch.имя пользователя=имя пользователя
elasticsearch.пароль=пароль
Таблица 2 Описание параметра

Параметр

Описание

хост

IP-адрес для доступа к кластеру Elasticsearch.

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

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

пароль

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

Код:

Note
  • com.xxx указывает на каталог проекта, например, com.company.project.
  • com.xxx.repository является каталогом репозитория, который определяется extends org.springframework.data.elasticsearch.repository.ElasticsearchRepository.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71package com.xxx.configuration;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.xxx.repository")
@ComponentScan(basePackages = "com.xxx")
public class Config extends AbstractElasticsearchConfiguration {
@Value("${elasticsearch.url}")
public String elasticsearchUrl;
@Value("${elasticsearch.username}")
public String elasticsearchUsername;
@Value("${elasticsearch.password}")
public String elasticsearchPassword;
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
SSLContext sc = null;
try {
sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
} catch (KeyManagementException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo(StringHostParse(elasticsearchUrl))
.usingSsl(sc, new NullHostNameVerifier())
.withBasicAuth(elasticsearchUsername, elasticsearchPassword)
.build();
return RestClients.create(clientConfiguration).rest();
}
private String[] StringHostParse(String hostAndPorts) {
return hostAndPorts.split(",");
}
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;
}
}
};
public static class NullHostNameVerifier implements HostnameVerifier {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
}
}

Использование Spring Boot для доступа к HTTPS кластеру (Использование сертификата безопасности)

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

  1. Получение и загрузка сертификата безопасности.
  2. application.properties конфигурационный файл:
    1
    2
    3elasticsearch.url=host1:9200,host2:9200
    elasticsearch.имя пользователя=имя пользователя
    elasticsearch.пароль=пароль
    Таблица 3 Описание параметра

    Параметр

    Описание

    Хост

    IP-адрес для доступа к кластеру Elasticsearch.

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

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

    пароль

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

  3. Код:
    Note
    • com.xxx указывает директорию проекта, например, com.company.project.
    • com.xxx.repository это каталог репозитория, который определяется extends org.springframework.data.elasticsearch.repository.ElasticsearchRepository.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96пакет com.xxx.configuration;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.elasticsearch.client.ClientConfiguration;
    import org.springframework.data.elasticsearch.client.RestClients;
    import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
    import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.security.KeyStore;
    import java.security.SecureRandom;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    import javax.net.ssl.HostnameVerifier;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSession;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.TrustManagerFactory;
    import javax.net.ssl.X509TrustManager;
    @Configuration
    @EnableElasticsearchRepositories(basePackages = "com.xxx.repository")
    @ComponentScan(basePackages = "com.xxx")
    public class Config extends AbstractElasticsearchConfiguration {
    @Value("${elasticsearch.url}")
    public String elasticsearchUrl;
    @Value("${elasticsearch.username}")
    public String elasticsearchUsername;
    @Value("${elasticsearch.password}")
    public String elasticsearchPassword;
    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {
    SSLContext sc = null;
    try {
    TrustManager[] tm = {new MyX509TrustManager(certFilePath, certPassword)};
    sc = SSLContext.getInstance("SSL", "SunJSSE");
    sc.init(null, tm, new SecureRandom());
    } catch (Exception e) {
    e.printStackTrace();
    }
    final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
    .connectedTo(StringHostParse(elasticsearchUrl))
    .usingSsl(sc, new NullHostNameVerifier())
    .withBasicAuth(elasticsearchUsername, elasticsearchPassword)
    .build();
    return RestClients.create(clientConfiguration).rest();
    }
    private String[] StringHostParse(String hostAndPorts) {
    return hostAndPorts.split(",");
    }
    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];
    }
    }
    public static class NullHostNameVerifier implements HostnameVerifier {
    @Override
    public boolean verify(String arg0, SSLSession arg1) {
    return true;
    }
    }
    }

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

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

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

  1. Получите сертификат безопасности CloudSearchService.cer.
    1. Войдите в консоль управления CSS.
    2. В навигационной панели слева выберите Кластеры > 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 указывает имя сертификата, определённого пользователем.

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