https://segmentfault.com/a/1190000016828977?utm_source=tag-newest#articleHeader0
嗅探器
允許從正在運行的Elasticsearch集群中自動發現節點並將它們設置到現有的RestClient實例的最小的庫,它默認使用節點信息api檢索屬於集群的節點,並使用jackson解析獲得的json響應。
與Elasticsearch 2.x及以后版本兼容。
Javadoc
可以在https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-client-sniffer/6.4.2/index.html找到REST客戶端嗅探器的javadoc。
Maven倉庫
REST客戶端嗅探器與Elasticsearch具有相同的發布周期,將版本替換為所需的嗅探器版本,首先使用5.0.0-alpha4發布版,嗅探器版本與客戶端可以與之通信的Elasticsearch版本之間沒有任何關系,嗅探器支持從Elasticsearch 2.x及以后來獲取節點列表。
如果你正在尋找SNAPSHOT版本,可以通過https://snapshots.elastic.co/maven/獲取Elastic Maven Snapshot存儲庫。
Maven配置
以下是如何使用maven作為依賴關系管理器來配置依賴關系,將以下內容添加到pom.xml文件中:
<dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client-sniffer</artifactId> <version>6.4.2</version> </dependency>
Gradle配置
以下是使用gradle作為依賴關系管理器配置依賴關系的方法,將以下內容添加到build.gradle文件中:
dependencies { compile 'org.elasticsearch.client:elasticsearch-rest-client-sniffer:6.4.2' }
使用
一旦創建了RestClient實例,如初始化中所示,可以將Sniffer與其關聯,Sniffer將定期使用提供的RestClient(默認情況下每隔5分鍾)從集群中獲取當前節點的列表,並通過調用RestClient#setNodes來更新它們。
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build(); Sniffer sniffer = Sniffer.builder(restClient).build();
關閉Sniffer以使其后台線程正確關閉並釋放其所有資源非常重要,Sniffer對象應具有與RestClient相同的生命周期,並在客戶端之前關閉:
sniffer.close(); restClient.close();
Sniffer默認每5分鍾更新一次節點,可以通過提供(以毫秒為單位)來定制此間隔,如下所示:
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();
從外部源獲取主機。
