背景
从网上找java调用elasticSearch的示例程序,大部分都是诸如下面的方式:
1.单机版本
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));
2.集群版本
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"), new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")));
这种写法有以下缺点
1.和通用的使用配置的方式不同(写死到代码中,无法灵活变动),
2.也不适用于生产环境ElasticSearch集群的调用(生产环境一般都是elasticsearch集群),。
3.常用的一些es配置如ConnectTimeOut等属性也没有设置。
解决方式
参考zookeeper,hbase,hadoop等系统的配置,我们将ElasticSearch的集群放入配置文件如properties文件,格式为:
es.httpHosts=host1:port1,host2:port2,host3:port3,...
es.connectTimeOut=3000
...........................................
这种方式的好处是可以存放到配置文件中,也可以放到配置中心中,修改时无需修改程序,只要重启集群机器即可。
那么如何创建ElasticSearch的客户端呢,以spring boot为例,定义EsClientConfig.java
@Configuration
public class EsClientConfig {
@Value("${es.httpHostList}")
private String httpHostList;
@Value("${es.connectTimeout}")
private String connectTimeout;
//TODO more properties added
@Bean
public RestHighLevelClient restHighLevelClient() {
RestClientBuilder builder=RestClient.builder(init(httpHostList));
builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback(RequestConfig.Builder requestConfigBuilder) {
requestConfigBuilder.setConnectTimeout(connectTimeout);
//TODO set more properties for builder
return requestConfig
}).setMaxRetryTimeoutMills("配置值");
}
private HttpHost[] init(String list) {
List<HttpHost> result=new ArrayList<>();
if(list.indexOf(",")==-1) {
String[] hostPort=list.split(":");
HttpHost httpHost=new HttpHost(hostPort[0],Integer.parseInt(hostPort[1]),"http");
result.add(httpHost);
}else {
String[] hosts=list.split(",");
for(int i=0;i<hosts.length;i++) {
String[] hostPort=hosts[i].split(":");
HttpHost httpHost=new HttpHost(hostPort[0],Integer.parseInt(hostPort[1]),"http");
result.add(httpHost);
}
}
HttpHost[] arr=new HttpHost[result.size()];
for(int i=0;i<result.size();i++) {
arr[i]=result.get(i);
}
return arr;
}
}
总结
很多开发,容易忽略demo和生产代码的差异,从而错误评估真实的工作量,导致加班加点的去代码,一些好的习惯慢慢积累,好的代码也要积累,可以充分减少重复性的工作。