Spring支持RestHighLevelClient(2)

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<RestHighLevelClient> , 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<HttpHost> 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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值