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

Подключение к кластеру с помощью High Level REST Client

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

Работа напрямую с разнообразными API Elasticsearch может быть сложной и неэффективной. CSS упрощает это, предоставляя High Level REST Client, предлагая более эффективный способ выполнения запросов и управления вашими данными. High Level REST Client инкапсулирует API Elasticsearch. Вам нужно лишь сформировать необходимые структуры запросов для доступа к кластеру Elasticsearch. Это упрощает процесс работы с кластерами Elasticsearch, а также процесс разработки. Для получения подробной информации о том, как использовать REST Client, см. Java High Level REST Client.

Требования

  • Целевой кластер Elasticsearch доступен.
  • Сервер, на котором выполняется код Java, может взаимодействовать с кластером Elasticsearch.
  • В зависимости от используемого метода настройки сети получите адрес доступа к кластеру. Для получения подробной информации см. Obtaining the Cluster Access Address.
  • Java установлена на сервере, версия JDK 1.8 или новее. Скачайте JDK 1.8 с Java Downloads.
  • Версия High Level REST Client подтверждена. CSS позволяет подключаться к кластеру Elasticsearch с помощью Java‑клиента более новой версии. Однако для обеспечения лучшей совместимости рекомендуется использовать Java‑клиент той же версии, что и целевой кластер Elasticsearch.

    Если версия High Level REST Client новее версии кластера Elasticsearch и возникают проблемы совместимости с некоторыми запросами, вы можете использовать RestHighLevelClient.getLowLevelClient() для получения Low Level REST Client и настройки запросов Elasticsearch. Для получения подробной информации см. Connecting to a Cluster Using the Low Level REST Client.

Введение зависимостей

Импортируйте зависимости Java на сервере, где выполняется код Java, используя один из следующих способов:

  • Maven:

    Замените 7.10.2 на фактическую версию Java‑клиента.

    <dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.10.2</version>
    </dependency>
    <dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.10.2</version>
    </dependency>
  • Gradle:

    Замените 7.10.2 на фактическую версию Java‑клиента.

    compile group: 'org.elasticsearch.client', name: 'elasticsearch-rest-high-level-client', version: '7.10.2'

Подключение к Cluster

Пример кода зависит от настроек режима безопасности целевого кластера Elasticsearch. Выберите соответствующий справочный документ в зависимости от вашего сценария обслуживания.

Table 1 сценарии доступа к Cluster

Настройки режима безопасности кластера Elasticsearch

Нужно ли загружать сертификат безопасности

Details

Режим без безопасности

-

Подключение к кластеру в режиме без безопасности с использованием High Level REST Client

Security mode + HTTP

Security mode + HTTPS

No

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

Security mode + HTTPS

Yes

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

Подключение к кластеру в режиме без безопасности с использованием High Level REST Client

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

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
32import 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;
/**
* Use the High Level REST Client to connect to a non-security mode cluster.
*/
public class Main {
public static void main(String[] args) throws IOException {
List<String> host = Arrays.asList("{Cluster access address}");
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();
}
/**
* Use the constructHttpHosts function to convert the node IP address list of the host cluster.
*/
public static HttpHost[] constructHttpHosts(List<String> host, int port, String protocol) {
return host.stream().map(p -> new HttpHost(p, port, protocol)).toArray(HttpHost[]::new);
}
}

Этот фрагмент кода проверяет, существует ли индекс test в кластере. Если возвращается true (индекс существует) или false (индекс не существует), это указывает на то, что кластер подключён.

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

Используйте High Level REST Client для подключения к кластеру Elasticsearch в режиме безопасности (HTTP или HTTPS) без загрузки сертификата безопасности и выполните запрос, существует ли индекс test. Пример кода приведён ниже:

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115import 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.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 java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
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.concurrent.TimeUnit;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
/**
* Use the High Level REST Client to connect to a security-mode cluster (without a certificate).
*/
public class Main {
private static final Logger logger = LogManager.getLogger(Main.class);
/**
* Create a class for the client. Define the create function.
*/
public static RestHighLevelClient create(List<String> host, int port, String protocol, int connectTimeout,
int connectionRequestTimeout, int socketTimeout, String username, String password) throws IOException {
RestClientBuilder builder = RestClient.builder(constructHttpHosts(host, port, protocol))
.setRequestConfigCallback(requestConfig -> requestConfig.setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.setSocketTimeout(socketTimeout))
.setHttpClientConfigCallback(httpClientBuilder -> {
// enable user authentication
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
// set keepalive
httpClientBuilder.setKeepAliveStrategy(((httpResponse, httpContext) -> TimeUnit.MINUTES.toMinutes(10)));
// enable SSL / TLS
SSLContext sc = null;
try {
sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new SecureRandom());
} catch (KeyManagementException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
SSLIOSessionStrategy sslStrategy = new SSLIOSessionStrategy(sc, new NoopHostnameVerifier());
httpClientBuilder.setSSLStrategy(sslStrategy);
return httpClientBuilder;
});
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);
System.out.println("es rest client health response {} " + response);
return client;
}
/**
* Use the constructHttpHosts function to convert the node IP address list of the host cluster.
*/
public static HttpHost[] constructHttpHosts(List<String> host, int port, String protocol) {
return host.stream().map(p -> new HttpHost(p, port, protocol)).toArray(HttpHost[]::new);
}
/**
* Configure trustAllCerts to ignore the certificate configuration.
*/
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;
}
}
};
/**
* The following is an example of the main function. Call the create function to create a client and check whether the test index exists.
*/
public static void main(String[] args) throws IOException {
RestHighLevelClient client = create(Arrays.asList("{host}"), 9200, "https", 1000, 1000, 1000, "username", "password");
GetIndexRequest indexRequest = new GetIndexRequest("test");
boolean exists = client.indices().exists(indexRequest, RequestOptions.DEFAULT);
System.out.println(exists);
client.close();
}
}
Table 2 Переменные

Параметр

Описание

host

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

port

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

protocol

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

connectTimeout

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

connectionRequestTimeout

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

socketTimeout

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

username

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

password

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

Этот фрагмент кода проверяет, существует ли индекс test в кластере. Если возвращается true (индекс существует) или false (индекс не существует), это указывает на то, что кластер подключён.

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

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

Caution

Чтобы узнать, как получить и загрузить сертификат безопасности, см. Obtaining and Uploading a Security Certificate.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137import 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.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 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.concurrent.TimeUnit;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
/**
* Use the Hive Level REST Client to connect to a security-mode cluster (with an HTTPS certificate).
*/
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 {
RestClientBuilder builder = RestClient.builder(constructHttpHosts(host, port, protocol))
.setRequestConfigCallback(requestConfig -> requestConfig.setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.setSocketTimeout(socketTimeout))
.setHttpClientConfigCallback(httpClientBuilder -> {
// enable user authentication
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
// set keepalive
httpClientBuilder.setKeepAliveStrategy(((httpResponse, httpContext) -> TimeUnit.MINUTES.toMinutes(10)));
// enable SSL / TLS
SSLContext sc = null;
try {
TrustManager[] tm = {new MyX509TrustManager(certFilePath, certPassword)};
sc = SSLContext.getInstance("SSL", "SunJSSE");
//You can also use SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sc.init(null, tm, new SecureRandom());
} catch (Exception e) {
e.printStackTrace();
}
SSLIOSessionStrategy sslStrategy = new SSLIOSessionStrategy(sc, new NoopHostnameVerifier());
httpClientBuilder.setSSLStrategy(sslStrategy);
return httpClientBuilder;
});
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;
}
/**
* Use the constructHttpHosts function to convert the node IP address list of the host cluster.
*/
public static HttpHost[] constructHttpHosts(List<String> host, int port, String protocol) {
return host.stream().map(p -> new HttpHost(p, port, protocol)).toArray(HttpHost[]::new);
}
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("Wrong Certification Path");
}
System.out.println("Loading 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];
}
}
/**
* The following is an example of the main function. Call the create function to create a client and check whether the test index exists.
*/
public static void main(String[] args) throws IOException {
RestHighLevelClient client = create(Arrays.asList({host}), 9200, "https", 1000, 1000, 1000, "username", "password", "certFilePath", "certPassword");
GetIndexRequest indexRequest = new GetIndexRequest("test");
boolean exists = client.indices().exists(indexRequest, RequestOptions.DEFAULT);
System.out.println(exists);
client.close();
}
}
Table 3 Параметры функции

Параметр

Description

host

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

port

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

protocol

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

connectTimeout

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

connectionRequestTimeout

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

socketTimeout

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

username

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

пароль

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

certFilePath

Путь для хранения сертификата безопасности.

certPassword

Пароль сертификата безопасности.

Этот фрагмент кода проверяет, существует ли индекс test в кластере. Если возвращается true (индекс существует) или false (индекс не существует), это указывает на то, что кластер подключён.

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

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

  1. Получите сертификат безопасности CloudSearchService.cer.
    1. Войдите в консоль управления CSS.
    2. В панели навигации слева выберите Clusters > Elasticsearch.
    3. В списке кластеров нажмите имя целевого кластера. Отобразится страница информации о кластере.
    4. Нажмите вкладку Overview. В области Network Information нажмите Download Certificate под HTTPS Access.
  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 указывает пользовательское имя сертификата.

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