spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.zhuoyan.es.config.ESAutoConfiguration,\
com.zhuoyan.es.config.ESDataAutoConfiguration
spring-configuration-metadata.json
{
"hints" : [],
"groups":[
{
"sourceType":"com.zhuoyan.es.config.ESProperties",
"name":"spring.rest.client.elasticsearch",
"type":"com.zhuoyan.es.config.ESProperties"
}
],
"properties":[
{
"sourceType":"com.zhuoyan.es.config.ESProperties",
"name":"spring.rest.client.elasticsearch.cluster-name",
"defaultValue":"elasticsearch",
"type":"java.lang.String"
},
{
"sourceType":"com.zhuoyan.es.config.ESProperties",
"name":"spring.rest.client.elasticsearch.cluster-nodes",
"type":"java.lang.String"
},
{
"sourceType":"com.zhuoyan.es.config.ESProperties",
"name":"spring.rest.client.elasticsearch.scheme",
"type":"java.lang.String"
},
{
"sourceType":"com.zhuoyan.es.config.ESProperties",
"name":"spring.rest.client.elasticsearch.username",
"type":"java.lang.String"
},
{
"sourceType":"com.zhuoyan.es.config.ESProperties",
"name":"spring.rest.client.elasticsearch.password",
"type":"java.lang.String"
},
{
"sourceType":"com.zhuoyan.es.config.ESProperties",
"name":"spring.rest.client.elasticsearch.max-retry-timeout",
"type":"java.lang.Integer"
},
{
"sourceType":"com.zhuoyan.es.config.ESProperties",
"name":"spring.rest.client.elasticsearch.connect-timeout",
"type":"java.lang.Integer"
},
{
"sourceType":"com.zhuoyan.es.config.ESProperties",
"name":"spring.rest.client.elasticsearch.socket-timeout",
"type":"java.lang.Integer"
},
{
"sourceType":"com.zhuoyan.es.config.ESProperties",
"name":"spring.rest.client.elasticsearch.thread-count",
"type":"java.lang.Integer"
}
]
}
ESProperties
/**
* @Author: wanhao
* @Description high rest client配置信息
* @Date: Created in 19:49 2018/11/27
*/
@ConfigurationProperties(prefix = "spring.rest.client.elasticsearch")
public class ESProperties {
/**
* description: es集群名称
* remark:
* */
private String clusterName = "elasticsearch";
/**
* description: es节点,使用[',']隔开,端口使用9200,例[localhost:9200,192.168.1.1:9200]
* remark:
* */
private String clusterNodes;
/**
* description: 协议(默认'http')
* remark:
* */
private String scheme;
/**
* description: xpack用户名
* remark:
* */
private String username;
/**
* description: xpack密码
* remark:
* */
private String password;
/**
* description: 最大重试超时,默认30秒
* remark:
* */
private Integer maxRetryTimeout;
/**
* description: 连接超时,默认1秒
* remark:
* */
private Integer connectTimeout;
/**
* description: socket超时,默认30秒
* remark:
* */
private Integer socketTimeout;
/**
* description: 线程数(默认Runtime.getRuntime().availableProcessors())
* remark:
* */
private Integer threadCount;
/**
* get set
* */
}
HighRestClientFactoryBean
/**
* @Author: wanhao
* @Description high rest client工厂
* @Date: Created in 10:16 2018/11/28
*/
public class HighRestClientFactoryBean implements FactoryBean , InitializingBean, DisposableBean {
private final Logger log = LoggerFactory.getLogger(this.getClass());
private RestHighLevelClient restHighLevelClient;
private ESProperties esProperties;
public void setEsProperties(ESProperties esProperties) {
this.esProperties = esProperties;
}
@Override
public void destroy() throws Exception {
try {
log.info("Closing elasticSearch client");
if(null != restHighLevelClient){
restHighLevelClient.close();
}
} catch (final Exception e) {
log.error("Error closing ElasticSearch client: ", e);
}
}
@Override
public boolean isSingleton() {
return false;
}
@Override
public Class getObjectType() {
return RestHighLevelClient.class;
}
@Override
public RestHighLevelClient getObject() throws Exception {
return restHighLevelClient;
}
@Override
public void afterPropertiesSet() throws Exception {
createClient();
}
private void createClient() throws Exception {
String clusterNodes = esProperties.getClusterNodes();
RestClientBuilder restClientBuilder = RestClient.builder(this.getHttpHosts(clusterNodes));
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
//xpack账户认证
if(StrUtil.isNotBlank(esProperties.getUsername()) && StrUtil.isNotBlank(esProperties.getPassword())){
credentialsProvider.setCredentials(AuthScope.ANY , new UsernamePasswordCredentials(esProperties.getUsername() , esProperties.getPassword()));
}
//认证和线程数
restClientBuilder.setHttpClientConfigCallback(httpClientBuilder -> {
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
if(null != esProperties.getThreadCount()){
httpClientBuilder.setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(esProperties.getThreadCount()).build());
}
return httpClientBuilder;
});
//超时超时设置
restClientBuilder.setRequestConfigCallback(requestConfigCallback -> {
if(null != esProperties.getConnectTimeout()){
requestConfigCallback.setConnectTimeout(esProperties.getConnectTimeout());
}
if(null != esProperties.getSocketTimeout()){
requestConfigCallback.setSocketTimeout(esProperties.getSocketTimeout());
}
return requestConfigCallback;
});
//重试时间
if(null != esProperties.getMaxRetryTimeout()){
restClientBuilder.setMaxRetryTimeoutMillis(esProperties.getMaxRetryTimeout());
}
restHighLevelClient = new RestHighLevelClient(restClientBuilder);
}
/**
* description: 创建分割nodes,创建httpHost数组
* @param
* @return {@link HttpHost[]}
* createdBy:wanhao
* created:2018/11/28
* */
public HttpHost[] getHttpHosts(String clusterNodes){
Assert.hasText(clusterNodes, "Cluster nodes source must not be null or empty!");
//分割node节点
String[] nodes = StrUtil.split(clusterNodes, StrUtil.COMMA);
List httpHosts = Arrays.stream(nodes).map(node -> {
HttpHost httpHost;
//分割host和端口
String[] hostAndPort = StrUtil.split(node, StrUtil.COLON);
Assert.isTrue(hostAndPort.length == 2,
() -> String.format("在[%s]集群节点中, node:[%s]存在错误 ! 格式必须是host:port!", clusterNodes, node));
String host = hostAndPort[0].trim();
String port = hostAndPort[1].trim();
Assert.hasText(host, () -> String.format("在node:[%s]没找到host!", node));
Assert.hasText(port, () -> String.format("在node:[%s]没找到port!", node));
if (StrUtil.isNotBlank(esProperties.getScheme())) {
httpHost = new HttpHost(host, Integer.parseInt(port), esProperties.getScheme());
} else {
httpHost = new HttpHost(host, Integer.parseInt(port));
}
return httpHost;
}).collect(Collectors.toList());
return ArrayUtil.toArray(httpHosts, HttpHost.class);
}
}
ESAutoConfiguration
/**
* @Author: wanhao
* @Description 初始化读取信息
* @Date: Created in 14:34 2018/6/11
*/
@Configuration
@ConditionalOnClass({RestHighLevelClient.class,HighRestClientFactoryBean.class,RestClient.class})
@ConditionalOnProperty(prefix = "spring.rest.client.elasticsearch" , name = "cluster-nodes")
@EnableConfigurationProperties(ESProperties.class)
public class ESAutoConfiguration {
@Autowired
private ESProperties esProperties;
/**
* description: 初始化自定义templete
* @param
* @return {@link RestHighLevelClient}
* createdBy:wanhao
* created:2018年07月04日
* */
@Bean
@ConditionalOnMissingBean
public RestHighLevelClient restHighLevelClient() throws Exception {
HighRestClientFactoryBean highRestClientFactoryBean = new HighRestClientFactoryBean();
highRestClientFactoryBean.setEsProperties(esProperties);
highRestClientFactoryBean.afterPropertiesSet();
return highRestClientFactoryBean.getObject();
}
}
ESDataAutoConfiguration
/**
* @Author: wanhao
* @Description
* @Date: Created in 18:50 2018/11/29
*/
@Configuration
@ConditionalOnClass({HighRestESTemplete.class , RestHighLevelClient.class , RestClient.class})
@AutoConfigureAfter(ESAutoConfiguration.class)
public class ESDataAutoConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnBean(RestHighLevelClient.class)
public HighRestESTemplete highRestESTemplete(RestHighLevelClient restHighLevelClient){
try {
return new HighRestESTemplete(restHighLevelClient);
}catch (Exception e){
throw new IllegalStateException(e);
}
}
}
HighRestESTemplete
public class HighRestESTemplete{
private RestHighLevelClient restHighLevelClient;
public HighRestESTemplete(RestHighLevelClient restHighLevelClient) {
Assert.notNull(restHighLevelClient, "Client must not be null!");
this.restHighLevelClient = restHighLevelClient;
}
public RestHighLevelClient getClient(){
return restHighLevelClient;
}
}
源码:https://github.com/601198096/sprintHighRestClient