背景
從網上找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和生產代碼的差異,從而錯誤評估真實的工作量,導致加班加點的去代碼,一些好的習慣慢慢積累,好的代碼也要積累,可以充分減少重複性的工作。
閱讀更多 架構師筆記 的文章
關鍵字: ElasticSearch HBase 單機