java使用ElasticSearch的RestHighLevelClient集群配置

背景

從網上找java調用elasticSearch的示例程序,大部分都是諸如下面的方式:



1.單機版本

<code>RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));/<code>

2.集群版本

<code>RestHighLevelClient client = new RestHighLevelClient(
\t\t\t\tRestClient.builder(new HttpHost("localhost", 9200, "http"), new HttpHost("localhost", 9201, "http"),
\t\t\t\t\t\tnew HttpHost("localhost", 9202, "http")));/<code>

這種寫法有以下缺點

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

<code>@Configuration
public class EsClientConfig {
\t@Value("${es.httpHostList}")
\tprivate String httpHostList;
\t@Value("${es.connectTimeout}")
\tprivate String connectTimeout;
\t//TODO more properties added
\t
\t@Bean
\tpublic RestHighLevelClient restHighLevelClient() {
\t\tRestClientBuilder builder=RestClient.builder(init(httpHostList));
\t\tbuilder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback(RequestConfig.Builder requestConfigBuilder) {
\t\t\trequestConfigBuilder.setConnectTimeout(connectTimeout);
\t\t\t//TODO set more properties for builder
\t\t\treturn requestConfig
\t\t}).setMaxRetryTimeoutMills("配置值");
\t}
\t
\tprivate HttpHost[] init(String list) {
\t\tList<httphost> result=new ArrayList<>();
\t\tif(list.indexOf(",")==-1) {
\t\t\tString[] hostPort=list.split(":");
\t\t\tHttpHost httpHost=new HttpHost(hostPort[0],Integer.parseInt(hostPort[1]),"http");
\t\t\tresult.add(httpHost);
\t\t}else {
\t\t\tString[] hosts=list.split(",");
\t\t\tfor(int i=0;i<hosts.length>\t\t\t\tString[] hostPort=hosts[i].split(":");
\t\t\t\tHttpHost httpHost=new HttpHost(hostPort[0],Integer.parseInt(hostPort[1]),"http");
\t\t\t\tresult.add(httpHost);
\t\t\t}
\t\t}
\t\t
\t\tHttpHost[] arr=new HttpHost[result.size()];
\t\tfor(int i=0;i<result.size>\t\t\tarr[i]=result.get(i);
\t\t}
\t\treturn arr;
\t}
}
/<result.size>/<hosts.length>/<httphost>/<code>

總結

很多開發,容易忽略demo和生產代碼的差異,從而錯誤評估真實的工作量,導致加班加點的去代碼,一些好的習慣慢慢積累,好的代碼也要積累,可以充分減少重複性的工作。



分享到:


相關文章: