简介:ES,Kibana,Canal安装及https配置,和Java Api调用,本文为第二章(主要介绍Java api的使用😁)
1. 基础配置
1.1 导入maven依赖
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.15.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>8.15.0</version>
</dependency>
1.2 创建es配置类
1.2.1 在kibana内创建apikey
1.2.2 创建配置类,给java程序访问(直接访问https会报ssl的异常,具体的我忘记了,也可以参考1.2.2.1跳过ssl验证)
1.2.2.1 跳过ssl访问代码创建配置类(可选)
package com.wind.common.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 nl.altindag.ssl.SSLFactory;
import org.apache.http.Header;
import org.apache.http.HttpHost;
import org.apache.http.message.BasicHeader;
import org.elasticsearch.client.RestClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
@Configuration
public class ElasticsearchConfig {
// URL and API key
@Value("${elasticsearch.addresses}")
private String serverUrl;
@Value("${elasticsearch.apiKey}")
private String apiKey;
/**
* 客户端
* @return
* @throws IOException
*/
@Bean
public ElasticsearchClient restClient(){
SSLFactory sslFactory = SSLFactory.builder()
.withUnsafeTrustMaterial()
.withUnsafeHostnameVerifier()
.build();
RestClient restClient = RestClient
.builder(HttpHost.create(serverUrl))
// 请求头
.setDefaultHeaders(new Header[]{
new BasicHeader("Authorization", "ApiKey " + apiKey)
})
// 设置跳过SSL验证
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setSSLContext(sslFactory.getSslContext())
.setSSLHostnameVerifier(sslFactory.getHostnameVerifier()))
.build();
// Create the transport with a Jackson mapper
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
// And create the API client
ElasticsearchClient esClient = new ElasticsearchClient(transport);
return esClient;
}
}
yml中配置:
elasticsearch:
addresses: https:192.168.180.150:9200
apiKey: N2NxR0VwSUJPNTBud3B2alpPd2I6Y19CdUg0NnlUV0NGTzMwM1NnQWRzUQ==
1.2.2 .2 使用证书创建es配置类🎈
1.2.2.1 创建证书并导入到项目内
# 需要的指令
openssl pkcs12 -in elastic-stack-ca.p12 -clcerts -nokeys -out es-ca.crt
1.2.2.2 es配置类
package com.wind.common.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 org.apache.http.Header;
import org.apache.http.HttpHost;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.message.BasicHeader;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.SSLContexts;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
/**
* @author: zhangbo
* @email: 210644837@qq.com
* @description: es client 配置
* @date: 2024/09/20
*/
@Configuration
public class ElasticsearchConfig {
// URL and API key
@Value("${elasticsearch.hostname}")
private String hostname;
@Value("${elasticsearch.port}")
private Integer port;
@Value("${elasticsearch.apiKey}")
private String apiKey;
private final String certPath = "cert/es-ca.crt";
/**
* 客户端
*
* @return
* @throws IOException
*/
@Bean
public ElasticsearchClient restClient() throws Exception {
// 加载证书资源
ClassPathResource resource = new ClassPathResource(certPath);
// 因为我的项目结构是父子项目,所有配置全部在comon下,为了不在其他模块在yml中配置elasticsearch的配置文件,选择了检查是否有证书才加载esClient
if (resource.exists()) {
// 搬运es官网代码
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, null);
trustStore.setCertificateEntry("ca", trustedCa);
SSLContextBuilder sslContextBuilder = SSLContexts.custom()
.loadTrustMaterial(trustStore, null);
final SSLContext sslContext = sslContextBuilder.build();
RestClient restClient = RestClient.builder(
new HttpHost(hostname, port, "https"))
// apiKey认证,也可以使用账号密码认证,账号密码认证见官网
// 官网地址:https://elastic.ac.cn/guide/en/elasticsearch/client/java-api-client/8.14/_basic_authentication.html
.setDefaultHeaders(new Header[]{
new BasicHeader("Authorization", "ApiKey " + apiKey)})
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(
HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setSSLContext(sslContext);
}
}).build();
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
return new ElasticsearchClient(transport);
}
return null;
}
}
# yml配置
elasticsearch:
hostname: 192.168.180.150
port: 9200
apiKey: N2NxR0VwSUJPNTBud3B2alpPd2I6Y19CdUg0NnlUV0NGTzMwM1NnQWRzUQ==