Elasticsearch Java Low Level REST Client(通用配置)
Elasticsearch Java Low Level REST Client(通用配置)
通用配置
正如初始化中所解釋的,RestClientBuilder支持提供RequestConfigCallback和HttpClientConfigCallback,它們?cè)试SApache Async Http Client公開(kāi)的任何自定義。這些回調(diào)可以修改客戶端的某些特定行為,而不會(huì)覆蓋RestClient初始化的所有其他默認(rèn)配置,本節(jié)介紹一些需要為低級(jí)別Java REST Client進(jìn)行其他配置的常見(jiàn)方案。
超時(shí)
配置請(qǐng)求超時(shí)可以通過(guò)在通過(guò)其構(gòu)建器構(gòu)建RestClient時(shí)提供RequestConfigCallback實(shí)例來(lái)完成,該接口有一個(gè)方法接收org.apache.http.client.config.RequestConfig.Builder的實(shí)例作為參數(shù)并具有相同的返回類型,可以修改請(qǐng)求配置構(gòu)建器,然后返回。在以下示例中,我們將增加連接超時(shí)(默認(rèn)為1秒)和socket超時(shí)(默認(rèn)為30秒),我們也相應(yīng)地調(diào)整最大重試超時(shí)(默認(rèn)為30秒)。
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200)).setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {@Overridepublic RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {return requestConfigBuilder.setConnectTimeout(5000).setSocketTimeout(60000);}}).setMaxRetryTimeoutMillis(60000);線程數(shù)
Apache Http Async Client默認(rèn)啟動(dòng)一個(gè)調(diào)度線程,以及連接管理器使用的許多工作線程,與本地檢測(cè)到的處理器數(shù)量一樣多(取決于Runtime.getRuntime().availableProcessors()的返回),線程數(shù)可以修改如下:
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200)).setHttpClientConfigCallback(new HttpClientConfigCallback() {@Overridepublic HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {return httpClientBuilder.setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(1).build());}});基本認(rèn)證
配置基本身份驗(yàn)證可以通過(guò)在通過(guò)其構(gòu)建器構(gòu)建RestClient時(shí)提供HttpClientConfigCallback來(lái)完成,該接口有一個(gè)方法接收org.apache.http.impl.nio.client.HttpAsyncClientBuilder的實(shí)例作為參數(shù)并具有相同的返回類型,可以修改http客戶端構(gòu)建器,然后返回。在以下示例中,我們?cè)O(shè)置了需要基本身份驗(yàn)證的默認(rèn)憑據(jù)提供程序。
final CredentialsProvider credentialsProvider =new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("user", "password"));RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200)).setHttpClientConfigCallback(new HttpClientConfigCallback() {@Overridepublic HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);}});可以禁用搶占式身份驗(yàn)證,這意味著每個(gè)請(qǐng)求都將在沒(méi)有授權(quán)標(biāo)頭的情況下發(fā)送,以查看是否接受該請(qǐng)求,并且在接收到HTTP401響應(yīng)后,將重新發(fā)送與基本身份驗(yàn)證標(biāo)頭完全相同的請(qǐng)求,如果你希望這樣做,那么你可以通過(guò)HttpAsyncClientBuilder禁用它:
final CredentialsProvider credentialsProvider =new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("user", "password"));RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200)).setHttpClientConfigCallback(new HttpClientConfigCallback() {@Overridepublic HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {httpClientBuilder.disableAuthCaching(); return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);}});httpClientBuilder.disableAuthCaching();?— 禁用搶占式身份驗(yàn)證。
加密通信
也可以通過(guò)HttpClientConfigCallback配置加密通信,作為參數(shù)接收的org.apache.http.impl.nio.client.HttpAsyncClientBuilder公開(kāi)了多種方法來(lái)配置加密通信:setSSLContext、setSSLSessionStrategy和setConnectionManager,按照最不重要的優(yōu)先順序排列,以下是一個(gè)例子:
KeyStore truststore = KeyStore.getInstance("jks"); try (InputStream is = Files.newInputStream(keyStorePath)) {truststore.load(is, keyStorePass.toCharArray()); } SSLContextBuilder sslBuilder = SSLContexts.custom().loadTrustMaterial(truststore, null); final SSLContext sslContext = sslBuilder.build(); RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "https")).setHttpClientConfigCallback(new HttpClientConfigCallback() {@Overridepublic HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {return httpClientBuilder.setSSLContext(sslContext);}});如果未提供顯式配置,則將使用系統(tǒng)默認(rèn)配置。
其他
對(duì)于所需的任何其他必需配置,應(yīng)參考Apache HttpAsyncClient文檔:https://hc.apache.org/httpcomponents-asyncclient-4.1.x/。
如果你的應(yīng)用程序在安全管理器下運(yùn)行,則可能會(huì)受到JVM默認(rèn)策略的限制,即無(wú)限期緩存正主機(jī)名解析和負(fù)主機(jī)名解析10秒,如果你連接客戶端的主機(jī)的已解析地址隨時(shí)間變化,那么你可能希望修改默認(rèn)的JVM行為,可以通過(guò)將networkaddress.cache.ttl=<timeout>和networkaddress.cache.negative.ttl=<timeout>添加到Java安全策略來(lái)修改這些。節(jié)點(diǎn)選擇器
客戶端以循環(huán)方式將每個(gè)請(qǐng)求發(fā)送到其中一個(gè)配置的節(jié)點(diǎn),可以選擇通過(guò)初始化客戶端時(shí)需要提供的節(jié)點(diǎn)選擇器來(lái)過(guò)濾節(jié)點(diǎn),這在啟用嗅探時(shí)很有用,以防只有HTTP請(qǐng)求才能觸發(fā)專用主節(jié)點(diǎn)。對(duì)于每個(gè)請(qǐng)求,客戶端將運(yùn)行最終配置的節(jié)點(diǎn)選擇器以過(guò)濾候選節(jié)點(diǎn),然后從剩余的節(jié)點(diǎn)中選擇列表中的下一個(gè)節(jié)點(diǎn)。
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http")); builder.setNodeSelector(new NodeSelector() { @Overridepublic void select(Iterable<Node> nodes) {/** Prefer any node that belongs to rack_one. If none is around* we will go to another rack till it's time to try and revive* some of the nodes that belong to rack_one.*/boolean foundOne = false;for (Node node : nodes) {String rackId = node.getAttributes().get("rack_id").get(0);if ("rack_one".equals(rackId)) {foundOne = true;break;}}if (foundOne) {Iterator<Node> nodesIt = nodes.iterator();while (nodesIt.hasNext()) {Node node = nodesIt.next();String rackId = node.getAttributes().get("rack_id").get(0);if ("rack_one".equals(rackId) == false) {nodesIt.remove();}}}} });設(shè)置分配感知節(jié)點(diǎn)選擇器,允許選擇本地rack中的節(jié)點(diǎn)(如果有),否則轉(zhuǎn)到任何rack中的任何其他節(jié)點(diǎn)。它充當(dāng)偏好而不是嚴(yán)格的要求,如果沒(méi)有任何本地節(jié)點(diǎn)可用,它將進(jìn)入另一個(gè)rack,而不是在這種情況下不返回任何節(jié)點(diǎn),這將使客戶端在首選rack中沒(méi)有任何節(jié)點(diǎn)可用時(shí)強(qiáng)制恢復(fù)本地節(jié)點(diǎn)。
不一致地選擇相同節(jié)點(diǎn)集的節(jié)點(diǎn)選擇器將使循環(huán)行為變得不可預(yù)測(cè)并且可能不公平,上面的偏好示例很好,因?yàn)樗梢越忉屢呀?jīng)影響輪詢調(diào)度可預(yù)測(cè)性的節(jié)點(diǎn)的可用性,節(jié)點(diǎn)選擇不應(yīng)該依賴于其他外部因素,否則輪詢調(diào)度將無(wú)法正常工作。總結(jié)
以上是生活随笔為你收集整理的Elasticsearch Java Low Level REST Client(通用配置)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: sparkSQL操作hiveSQL
- 下一篇: awk输出指定行,awk如何取反