package edu.travel.elastic; 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.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @Configuration public class EsClient { @Autowired private ElasticsearchConfig elasticsearchConfig; /** * 如果@Bean没有指定bean的名称,那么方法名就是bean的名称 */ @Bean(name = "restHighLevelClient") public RestHighLevelClient restHighLevelClient() { // 构建连接对象 RestClientBuilder builder = RestClient.builder(getEsHost()); // 连接延时配置 builder.setRequestConfigCallback(requestConfigBuilder -> { requestConfigBuilder.setConnectTimeout(elasticsearchConfig.getConnectTimeOut()); requestConfigBuilder.setSocketTimeout(elasticsearchConfig.getSocketTimeOut()); requestConfigBuilder.setConnectionRequestTimeout(elasticsearchConfig.getConnectionRequestTimeOut()); return requestConfigBuilder; }); // 连接数配置 builder.setHttpClientConfigCallback(httpClientBuilder -> { httpClientBuilder.setMaxConnTotal(elasticsearchConfig.getMaxConnectNum()); httpClientBuilder.setMaxConnPerRoute(elasticsearchConfig.getMaxConnectNumPerRoute()); httpClientBuilder.setDefaultCredentialsProvider(getCredentialsProvider()); return httpClientBuilder; }); return new RestHighLevelClient(builder); } private HttpHost[] getEsHost() { // 拆分地址(es为多节点时,不同host以逗号间隔) List hostLists = new ArrayList<>(); String[] hostList = elasticsearchConfig.getHosts().split(","); for (String addr : hostList) { String host = addr.split(":")[0]; String port = addr.split(":")[1]; hostLists.add(new HttpHost(host, Integer.parseInt(port), elasticsearchConfig.getScheme())); } // 转换成 HttpHost 数组 return hostLists.toArray(new HttpHost[]{}); } private CredentialsProvider getCredentialsProvider() { // 设置用户名、密码 CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(elasticsearchConfig.getUserName(), elasticsearchConfig.getPassword())); return credentialsProvider; } }