摘要:通用配置正如初始化中所解釋的,支持提供和,它們?cè)试S公開(kāi)的任何自定義。這些回調(diào)可以修改客戶(hù)端的某些特定行為,而不會(huì)覆蓋初始化的所有其他默認(rèn)配置,本節(jié)介紹一些需要為低級(jí)別進(jìn)行其他配置的常見(jiàn)方案。
通用配置
正如初始化中所解釋的,RestClientBuilder支持提供RequestConfigCallback和HttpClientConfigCallback,它們?cè)试SApache Async Http Client公開(kāi)的任何自定義。這些回調(diào)可以修改客戶(hù)端的某些特定行為,而不會(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ù)并具有相同的返回類(lèi)型,可以修改請(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() { @Override public 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() { @Override public 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ù)并具有相同的返回類(lèi)型,可以修改http客戶(hù)端構(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() { @Override public 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() { @Override public 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() { @Override public 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秒,如果你連接客戶(hù)端的主機(jī)的已解析地址隨時(shí)間變化,那么你可能希望修改默認(rèn)的JVM行為,可以通過(guò)將networkaddress.cache.ttl=節(jié)點(diǎn)選擇器和networkaddress.cache.negative.ttl= 添加到Java安全策略來(lái)修改這些。
客戶(hù)端以循環(huán)方式將每個(gè)請(qǐng)求發(fā)送到其中一個(gè)配置的節(jié)點(diǎn),可以選擇通過(guò)初始化客戶(hù)端時(shí)需要提供的節(jié)點(diǎn)選擇器來(lái)過(guò)濾節(jié)點(diǎn),這在啟用嗅探時(shí)很有用,以防只有HTTP請(qǐng)求才能觸發(fā)專(zhuān)用主節(jié)點(diǎn)。對(duì)于每個(gè)請(qǐng)求,客戶(hù)端將運(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() { @Override public void select(Iterablenodes) { /* * 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 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),這將使客戶(hù)端在首選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)影響輪詢(xún)調(diào)度可預(yù)測(cè)性的節(jié)點(diǎn)的可用性,節(jié)點(diǎn)選擇不應(yīng)該依賴(lài)于其他外部因素,否則輪詢(xún)調(diào)度將無(wú)法正常工作。上一篇:讀取響應(yīng) 下一篇:嗅探器
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72349.html
摘要:用于的官方高級(jí)別客戶(hù)端,基于低級(jí)別客戶(hù)端,它公開(kāi)特定的方法,并負(fù)責(zé)請(qǐng)求編組和響應(yīng)反編組。入門(mén)初始化執(zhí)行請(qǐng)求讀取響應(yīng)日志記錄通用配置嗅探器在中被添加。依賴(lài)于核心項(xiàng)目,它接受與相同的請(qǐng)求參數(shù),并返回相同的響應(yīng)對(duì)象。 Elasticsearch Java REST Client Java REST Client有兩種類(lèi)型: Java Low Level REST Client:用于Elast...
摘要:嗅探器允許從正在運(yùn)行的集群中自動(dòng)發(fā)現(xiàn)節(jié)點(diǎn)并將它們?cè)O(shè)置到現(xiàn)有的實(shí)例的最小的庫(kù),它默認(rèn)使用節(jié)點(diǎn)信息檢索屬于集群的節(jié)點(diǎn),并使用解析獲得的響應(yīng)??梢栽谡业娇蛻?hù)端嗅探器的。 嗅探器 允許從正在運(yùn)行的Elasticsearch集群中自動(dòng)發(fā)現(xiàn)節(jié)點(diǎn)并將它們?cè)O(shè)置到現(xiàn)有的RestClient實(shí)例的最小的庫(kù),它默認(rèn)使用節(jié)點(diǎn)信息api檢索屬于集群的節(jié)點(diǎn),并使用jackson解析獲得的json響應(yīng)。 與Elas...
閱讀 3516·2021-11-15 11:38
閱讀 836·2021-11-08 13:27
閱讀 2250·2021-07-29 14:50
閱讀 2977·2019-08-29 13:06
閱讀 848·2019-08-29 11:22
閱讀 2419·2019-08-29 11:04
閱讀 3510·2019-08-28 18:23
閱讀 896·2019-08-26 13:46