用法

编辑

一旦 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 实例

当启用故障嗅探时,不仅在每次故障后更新节点,而且还会比平时更早地安排额外的嗅探轮次,默认情况下在故障一分钟后安排,假设情况会恢复正常,并且我们希望尽快检测到这一点。此间隔可以在 Sniffer 创建时通过 setSniffAfterFailureDelayMillis 方法自定义。请注意,如果未启用故障嗅探(如上所述),则此最后一个配置参数无效。

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();

从外部源获取主机