背景

从网上找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和生产代码的差异,从而错误评估真实的工作量,导致加班加点的去代码,一些好的习惯慢慢积累,好的代码也要积累,可以充分减少重复性的工作。