Elasticsearch Java Low Level REST Client(通用配置)
Elasticsearch Java Low Level REST Client(通用配置)
通用配置
正如初始化中所解釋的,RestClientBuilder支持提供RequestConfigCallback和HttpClientConfigCallback,它們允許Apache Async Http Client公開的任何自定義。這些回調可以修改客戶端的某些特定行為,而不會覆蓋RestClient初始化的所有其他默認配置,本節(jié)介紹一些需要為低級別Java REST Client進行其他配置的常見方案。
超時
配置請求超時可以通過在通過其構建器構建RestClient時提供RequestConfigCallback實例來完成,該接口有一個方法接收org.apache.http.client.config.RequestConfig.Builder的實例作為參數(shù)并具有相同的返回類型,可以修改請求配置構建器,然后返回。在以下示例中,我們將增加連接超時(默認為1秒)和socket超時(默認為30秒),我們也相應地調整最大重試超時(默認為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默認啟動一個調度線程,以及連接管理器使用的許多工作線程,與本地檢測到的處理器數(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());}});基本認證
配置基本身份驗證可以通過在通過其構建器構建RestClient時提供HttpClientConfigCallback來完成,該接口有一個方法接收org.apache.http.impl.nio.client.HttpAsyncClientBuilder的實例作為參數(shù)并具有相同的返回類型,可以修改http客戶端構建器,然后返回。在以下示例中,我們設置了需要基本身份驗證的默認憑據(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);}});可以禁用搶占式身份驗證,這意味著每個請求都將在沒有授權標頭的情況下發(fā)送,以查看是否接受該請求,并且在接收到HTTP401響應后,將重新發(fā)送與基本身份驗證標頭完全相同的請求,如果你希望這樣做,那么你可以通過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();?— 禁用搶占式身份驗證。
加密通信
也可以通過HttpClientConfigCallback配置加密通信,作為參數(shù)接收的org.apache.http.impl.nio.client.HttpAsyncClientBuilder公開了多種方法來配置加密通信:setSSLContext、setSSLSessionStrategy和setConnectionManager,按照最不重要的優(yōu)先順序排列,以下是一個例子:
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)默認配置。
其他
對于所需的任何其他必需配置,應參考Apache HttpAsyncClient文檔:https://hc.apache.org/httpcomponents-asyncclient-4.1.x/。
如果你的應用程序在安全管理器下運行,則可能會受到JVM默認策略的限制,即無限期緩存正主機名解析和負主機名解析10秒,如果你連接客戶端的主機的已解析地址隨時間變化,那么你可能希望修改默認的JVM行為,可以通過將networkaddress.cache.ttl=<timeout>和networkaddress.cache.negative.ttl=<timeout>添加到Java安全策略來修改這些。節(jié)點選擇器
客戶端以循環(huán)方式將每個請求發(fā)送到其中一個配置的節(jié)點,可以選擇通過初始化客戶端時需要提供的節(jié)點選擇器來過濾節(jié)點,這在啟用嗅探時很有用,以防只有HTTP請求才能觸發(fā)專用主節(jié)點。對于每個請求,客戶端將運行最終配置的節(jié)點選擇器以過濾候選節(jié)點,然后從剩余的節(jié)點中選擇列表中的下一個節(jié)點。
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();}}}} });設置分配感知節(jié)點選擇器,允許選擇本地rack中的節(jié)點(如果有),否則轉到任何rack中的任何其他節(jié)點。它充當偏好而不是嚴格的要求,如果沒有任何本地節(jié)點可用,它將進入另一個rack,而不是在這種情況下不返回任何節(jié)點,這將使客戶端在首選rack中沒有任何節(jié)點可用時強制恢復本地節(jié)點。
不一致地選擇相同節(jié)點集的節(jié)點選擇器將使循環(huán)行為變得不可預測并且可能不公平,上面的偏好示例很好,因為它可以解釋已經影響輪詢調度可預測性的節(jié)點的可用性,節(jié)點選擇不應該依賴于其他外部因素,否則輪詢調度將無法正常工作。總結
以上是生活随笔為你收集整理的Elasticsearch Java Low Level REST Client(通用配置)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sparkSQL操作hiveSQL
- 下一篇: awk输出指定行,awk如何取反