![Elasticsearch实战与原理解析](https://wfqqreader-1252317822.image.myqcloud.com/cover/554/30918554/b_30918554.jpg)
4.4 常见通用设置
除上述客户端API外,客户端还支持一些常见通用设置,如超时设置、线程数设置、节点选择器设置和配置嗅探器等。
1.超时设置
我们可以在构建RestClient时提供requestconfigCallback的实例来完成超时设置。该接口有一个方法,它接收org.apache.http.client.config.requestconfig.builder的实例作为参数,并且具有相同的返回类型。
用户可以修改请求配置生成器org.apache.http.client.config.requestconfig.builder的实例,然后返回。
在下面的示例中,增加了连接超时(默认为1s)和套接字超时(默认为30s),代码如下所示:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_103_1.jpg?sign=1739284911-k6DwaFyMWrLGwdNpS17FvaWTzD5lElrQ-0-b513f71f622be12d9e6451469583077b)
在具体使用时,详见MeetElasticSearchServiceImpl中的代码,部分代码如下所示:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_103_2.jpg?sign=1739284911-FivMVeKNw0wQQ1WwUuvMDuC9EAKFi2iX-0-5a940b4e25d19227aaa4553e6e073951)
2.线程数设置
Apache HTTP异步客户端默认启动一个调度程序线程,连接管理器使用的多个工作线程。一般线程数与本地检测到的处理器数量相同,线程数主要取决于Runtime.getRuntime().availableProcessors()返回的结果。
Elasticsearch允许用户修改线程数,修改代码如下所示,详见MeetElasticSearchServiceImpl类:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_104_1.jpg?sign=1739284911-6dGDod1zUK8N3rWEi68rwsUNDzB90VUf-0-2e32f6eedcb58f6f184bacb0a76f0efd)
3.节点选择器设置
在默认情况下,客户端会以轮询的方式将每个请求发送到配置的各个节点中。
Elasticsearch允许用户自由选择需要连接的节点。一般通过初始化客户端来配置节点选择器,以便筛选节点。
该功能在启用嗅探器时很有用,以防止HTTP请求只命中专用的主节点。
配置后,对于每个请求,客户端都通过节点选择器来筛选备选节点。
代码如下所示,详见MeetElasticSearchServiceImpl类:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_104_2.jpg?sign=1739284911-XryHlR9qwD80atzboYeN3FKTuxBW80kU-0-1828b4b444e11ef3e3e4e339e82e6ea9)
4.配置嗅探器
嗅探器允许自动发现运行中的Elasticsearch集群中的节点,并将其设置为现有的RestClient实例。
在默认情况下,嗅探器使用nodes info API检索属于集群的节点,并使用jackson解析获得的JSON响应。
目前,嗅探器与Elasticsearch 2.X及更高版本兼容。
在使用嗅探器之前需添加相关的依赖,代码如下所示:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_105_2.jpg?sign=1739284911-4Xk0ZV6qptwVn1tTvb2Nx8m0A0CmkC7A-0-b79e67c53fb9bab5daabb1ba7cd2d698)
在创建好RestClient实例(如初始化中代码所示)后,就可以将嗅探器与其进行关联了。嗅探器利用RestClient提供的定期机制(在默认情况下定期时间为5min),从集群中获取当前节点的列表,并通过调用RestClient类中的setNodes方法来更新它们。
嗅探器的使用代码详见ServiceImpl实现层的MeetElasticSearchServiceImpl类,部分代码如下所示:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_106_1.jpg?sign=1739284911-BDLGMISqe1FO8vrErbRMWBLaB27nTIFH-0-ee16525b7aa206cf940acc2e70972bbd)
当然,除在客户端启动时配置嗅探器外,还可以在失败时启用嗅探器。这意味着在每次失败后,节点列表都会立即更新,而不是在接下来的普通嗅探循环中更新。
在这种情况下,首先需要创建一个SniffOnFailureListener,然后在创建RestClient时配置。在创建嗅探器后,同一个SniffOnFailureListener实例会相互关联,以便在每次失败时都通知该实例,并使用嗅探器执行嗅探动作。
嗅探器SniffOnFailureListener的使用代码详见ServiceImpl实现层的MeetElasticSearchServiceImpl类,部分代码如下所示:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_106_2.jpg?sign=1739284911-pzsISDYtq2U67NeTBwtSiPJgqGemn1Ec-0-87cf1fda1849ee1b2678c5d00ca53407)
由于Elasticsearch节点信息API不会返回连接到节点时要使用的协议,而是只返回它们的host:port,因此在默认情况下会使用HTTP。如果需要使用HTTPS,则必须手动创建并提供ElasticSearchNodesNiffer实例,相关代码如下所示:
![](https://epubservercos.yuewen.com/A9D91A/16793577104229806/epubprivate/OEBPS/Images/38380_107_2.jpg?sign=1739284911-HuiIdjZXYLtVdxRG7m2t3fqJgvJhLx09-0-8fec0c6955088b9e22b8c88f72b3da87)