容許從正在運行的Elasticsearch集羣中自動發現節點並將它們設置到現有的RestClient
實例的最小的庫,它默認使用節點信息api檢索屬於集羣的節點,並使用jackson解析得到的json響應。html
與Elasticsearch 2.x及之後版本兼容。java
能夠在https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-client-sniffer/6.4.2/index.html找到REST客戶端嗅探器的javadoc。node
REST客戶端嗅探器與Elasticsearch具備相同的發佈週期,將版本替換爲所需的嗅探器版本,首先使用5.0.0-alpha4
發佈版,嗅探器版本與客戶端能夠與之通訊的Elasticsearch版本之間沒有任何關係,嗅探器支持從Elasticsearch 2.x及之後來獲取節點列表。json
若是你正在尋找SNAPSHOT版本,能夠經過https://snapshots.elastic.co/maven/獲取Elastic Maven Snapshot存儲庫。segmentfault
如下是如何使用maven做爲依賴關係管理器來配置依賴關係,將如下內容添加到pom.xml
文件中:api
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client-sniffer</artifactId> <version>6.4.2</version> </dependency>
如下是使用gradle做爲依賴關係管理器配置依賴關係的方法,將如下內容添加到build.gradle
文件中:服務器
dependencies { compile 'org.elasticsearch.client:elasticsearch-rest-client-sniffer:6.4.2' }
一旦建立了RestClient
實例,如初始化中所示,能夠將Sniffer
與其關聯,Sniffer
將按期使用提供的RestClient
(默認狀況下每隔5分鐘)從集羣中獲取當前節點的列表,並經過調用RestClient#setNodes
來更新它們。elasticsearch
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); Sniffer sniffer = Sniffer.builder(restClient).build();
關閉Sniffer
以使其後臺線程正確關閉並釋放其全部資源很是重要,Sniffer
對象應具備與RestClient
相同的生命週期,並在客戶端以前關閉:maven
sniffer.close(); restClient.close();
Sniffer
默認每5分鐘更新一次節點,能夠經過提供(以毫秒爲單位)來定製此間隔,以下所示:ide
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); Sniffer sniffer = Sniffer.builder(restClient) .setSniffIntervalMillis(60000).build();
也能夠在失敗時啓用嗅探,這意味着在每次失敗後,節點列表會當即更新,而不是在下面的普通嗅探輪詢中,在這種狀況下,須要首先建立SniffOnFailureListener
,並在建立RestClient
時提供。此外,一旦稍後建立了Sniffer
,它就須要與同一個SniffOnFailureListener
實例相關聯,該實例將在每次失敗時獲得通知,並使用Sniffer
執行所述的額外嗅探輪詢。
SniffOnFailureListener sniffOnFailureListener = new SniffOnFailureListener(); RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)) .setFailureListener(sniffOnFailureListener) .build(); Sniffer sniffer = Sniffer.builder(restClient) .setSniffAfterFailureDelayMillis(30000) .build(); sniffOnFailureListener.setSniffer(sniffer);
RestClient
實例中。setSniffAfterFailureDelayMillis
方法在Sniffer
建立時自定義所述間隔,請注意,若是未啓用在失敗時嗅探,則此最後一個配置參數無效,如上所述。Sniffer
實例設置到失敗監聽器。Elasticsearch節點信息api不會返回鏈接到節點時使用的協議,而只返回其host:port
鍵值對,所以默認狀況下使用http
,若是應該使用https
,則必須手動建立ElasticsearchNodesSniffer
實例並按以下方式提供:
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); NodesSniffer nodesSniffer = new ElasticsearchNodesSniffer( restClient, ElasticsearchNodesSniffer.DEFAULT_SNIFF_REQUEST_TIMEOUT, ElasticsearchNodesSniffer.Scheme.HTTPS); Sniffer sniffer = Sniffer.builder(restClient) .setNodesSniffer(nodesSniffer).build();
以一樣的方式,也能夠自定義sniffRequestTimeout
,默認爲一秒。這是在調用節點信息api時做爲查詢字符串參數提供的timeout
參數,這樣當超時在服務器端到期時,儘管它可能只包含做爲集羣一部分的節點的子集,但在此以前已響應的節點仍會返回有效響應。
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); NodesSniffer nodesSniffer = new ElasticsearchNodesSniffer( restClient, TimeUnit.SECONDS.toMillis(5), ElasticsearchNodesSniffer.Scheme.HTTP); Sniffer sniffer = Sniffer.builder(restClient) .setNodesSniffer(nodesSniffer).build();
此外,能夠爲高級用例提供自定義NodesSniffer
實現,這些用例可能須要從外部源而不是從Elasticsearch獲取節點
:
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); NodesSniffer nodesSniffer = new NodesSniffer() { @Override public List<Node> sniff() throws IOException { return null; } }; Sniffer sniffer = Sniffer.builder(restClient) .setNodesSniffer(nodesSniffer).build();
從外部源獲取主機。