ElasticSearch-Java-low-level-rest-client官方文档翻译
人肉翻译,非谷歌机翻,部分地方添加了个人的理解,并做了分割,如有错误请在评论指出。转载请指明原链接,尊重个人劳动成果。
High-Level-Rest-Client基于Low-Level-Rest-Client封装,Client配置方面基于Low-Level,而API使用上基于High-Level。
翻译的版本为6.5.4版本的Elasticsearch,部分不重要的内容(如Maven/Gradle坐标、License等不在本文出现)。
在实际的配置过程中,查看源码发现LowLevelClient完全基于HttpAsyncClient来实现的,内部具体组装Client的细节,如果有时间会写另外一篇博文分享出来。
- 最小的依赖
- 在集群所有结点间负载均衡
- 结点失败后,根据具体的响应码(response code)进行失效转移
- 连接失败惩罚机制(是否重连一个失败的结点取决于它失败的次数;尝试重新连接失败的次数越多,客户端下一次尝试重新连接该结点的等待时间也越长)
- 持久化连接
- 请求和响应的日志追踪
- (可选功能)集群结点自动发现
1、初始化客户端
1.1.基本设置
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")).build();
restClient.close();
1.2.参数化设置
- 设置默认的请求头,该请求头会应用到每个request上去。不允许单独的在每次请求时进行请求头设置。
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));
Header[] defaultHeaders = new Header[]{new BasicHeader("header", "value")};
builder.setDefaultHeaders(defaultHeaders);
- 设置同一个请求的多次尝试时的最大超时时间,这个设置默认的时间是30秒(同socket timeout的默认超时时间一样)。如果你修改了socket timeout,你也应该修改这个值来适应socket timeout。
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));
builder.setMaxRetryTimeoutMillis(10000);
- 设置监听器,当一个结点故障时收到通知,以采取措施。嗅探失败节点功能会隐式的使用一个这样的监听器。
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));
builder.setFailureListener(new RestClient.FailureListener() {
@Override
public void onFailure(Node node) {
}
});
- 设置结点选择器,用于过滤某些es的结点(这些结点在初始化时设置到Client中)。当结点嗅探开启时,如果你不想将请求发送至dedicated master结点上,该功能很好用。Client默认会将请求发送到所有配置的节点上。
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));
builder.setNodeSelector(NodeSelector.SKIP_DEDICATED_MASTERS);
- 通过一个回调函数修改默认的请求配置(如超时时间、验证信息等其他apache httpclient包中RequestConfig.Builder允许的配置)。
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));
builder.setRequestConfigCallback(
new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(
RequestConfig.Builder requestConfigBuilder) {
return requestConfigBuilder.setSocketTimeout(10000);
}
});
- 通过一个回调函数修改默认的HttpClient配置(如ssl配置等其他apache httpclient包中HttpAsyncClientBuilder允许的配置)。
RestClientBuilder builder = RestClient.builder(new HttpHost("localhost", 9200, "http"));
builder.setHttpClientConfigCallback(new HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(
HttpAsyncClientBuilder httpClientBuilder) {
return httpClientBuilder.setProxy(
new HttpHost("proxy", 9000, "http"));
}
});
2、执行请求
2.1.同步与异步API
Request request = new Request(
"GET", //HTTP方法,支持GET、POST、HEAD等
"/"); //es服务端点endpoint
Response response = restClient.performRequest(request);
Request request = new Request(
"GET", //HTTP方法,支持GET、POST、HEAD等
"/"); //es服务端点endpoint
restClient.performRequestAsync(request, new ResponseListener() {
@Override
public void onSuccess(Response response) {
//成功回调
} @Override
public void onFailure(Exception exception) {
//失败回调
}
});
request.addParameter("pretty", "true");
如果将HttpEntity设置为String,那么ContentType会被默认设置为application/json:
2.2.请求可选项
private static final RequestOptions COMMON_OPTIONS;
static {
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
builder.addHeader("Authorization", "Bearer " + TOKEN); //设置请求头的校验信息
builder.setHttpAsyncResponseConsumerFactory( //设置Response的缓冲池大小
new HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
COMMON_OPTIONS = builder.build();
}
- 这里有一个addHeader方法,需要注意的是,在这里不需要设置ContentType,因为在设置HttpEntity时就会自动关联ContentType;
- 你可以在这里设置NodeSelector。NodeSelector.NOT_MASTER_ONLY是一个比较好的选择;
- 你可以在这里定制用于缓冲异步响应的Response Consumer。默认的ResponseConsumer会在JVM堆上缓存100M的响应数据。如果响应数据比缓冲区过大,当次请求会失败。如果你的应用跑在一个JVM堆比较小的环境中,你需要降低缓冲区的最大值。
request.setOptions(COMMON_OPTIONS);
如果有某些请求需要对OPTIONS做一定程度的变更,可以通过如下方式增量处理而不是重新写一遍设置代码:
RequestOptions.Builder options = COMMON_OPTIONS.toBuilder();
options.addHeader("cats", "knock things off of other things");
request.setOptions(options);
2.3.批量并行异步请求
下面是一个使用闭锁并行执行异步请求的例子。在实际的编程中,你一般会倾向于使用_bulk这个API来替代,当然了,下面的例子依然具有参考性:
final CountDownLatch latch = new CountDownLatch(documents.length);
for (int i = 0; i < documents.length; i++) {
Request request = new Request("PUT", "/posts/doc/" + i);
//let's assume that the documents are stored in an HttpEntity array
request.setEntity(documents[i]);
restClient.performRequestAsync(
request,
new ResponseListener() {
@Override
public void onSuccess(Response response) { latch.countDown();
} @Override
public void onFailure(Exception exception) { latch.countDown();
}
}
);
}
latch.await();
3、读取响应
3.1.获取响应对象
Response response = restClient.performRequest(new Request("GET", "/"));
RequestLine requestLine = response.getRequestLine();
HttpHost host = response.getHost();
int statusCode = response.getStatusLine().getStatusCode();
Header[] headers = response.getHeaders();
String responseBody = EntityUtils.toString(response.getEntity());
4、通用配置
4.1.Timeouts
RestClientBuilder builder = RestClient.builder(
new HttpHost("localhost", 9200))
.setRequestConfigCallback(
new RestClientBuilder.RequestConfigCallback() {
@Override
public RequestConfig.Builder customizeRequestConfig(
RequestConfig.Builder requestConfigBuilder) {
return requestConfigBuilder
.setConnectTimeout(5000) //默认值1S
.setSocketTimeout(60000); //默认值30S
}
})
.setMaxRetryTimeoutMillis(60000); //设置完SocketTimeout后,一般需要联动修改这个值
4.2.线程数
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());
}
});
4.3.身份验证
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);
}
});
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);
}
});
4.4.SSL通信
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);
}
});
4.5.节点选择器
RestClientBuilder builder = RestClient.builder(
new HttpHost("localhost", 9200, "http"));
builder.setNodeSelector(new NodeSelector() {
@Override
public 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();
}
}
}
}
});
5、嗅探Sniffer
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client-sniffer</artifactId>
<version>6.5.4</version>
</dependency>
5.1.基本设置
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http"))
.build();
Sniffer sniffer = Sniffer.builder(restClient).build();
sniffer.close();
restClient.close();
5.2.定制刷新间隔
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http"))
.build();
Sniffer sniffer = Sniffer.builder(restClient)
.setSniffIntervalMillis(60000).build(); //设置Sniffer刷新间隔
SniffOnFailureListener sniffOnFailureListener =
new SniffOnFailureListener(); //创建Sniffer失败监听器
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200))
.setFailureListener(sniffOnFailureListener) //为RestClient设置监听器
.build();
Sniffer sniffer = Sniffer.builder(restClient)
.setSniffAfterFailureDelayMillis(30000) //设置失败之后的额外调度延迟
.build();
sniffOnFailureListener.setSniffer(sniffer); //为监听器设置Sniffer
- 关于setSniffAfterFailureDelayMillis:当我们在失败上设置了Sniffer监听后,每次失败不仅会通过监听器勾起一次Sniffer的节点刷新行为,一次额外的Sniffer节点刷新行为也会比平常的间隔调度更快的到来(这是Sniffer的默认特征,且默认时间为1分钟)。假设失败的节点能够很快的恢复,我们的应用需要尽快知道这个情况,那么我们可以通过setSniffAfterFailureDelayMillis来调整这个额外Sniffer行为的延迟时间(这是什么意思呢?举个例子,当请求失败后,通过监听器触发的Sniffer行为获取到的节点列表可能是剔除了有问题节点的列表,如果此时问题节点未恢复的话;可能这些问题节点在一阵子后自行恢复了,但是Sniffer还没有到下次触发时间,因此我们需要调整一下这个失败后Sniffer额外调度的延迟时间,缩短该时间以尽快拉取到恢复后的节点列表)。
5.3.设置节点通信协议
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();
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();
5.4.自定义NodesSniffer
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();
ElasticSearch-Java-low-level-rest-client官方文档翻译的更多相关文章
- Elasticsearch Java Low Level REST Client(嗅探器)
https://segmentfault.com/a/1190000016828977?utm_source=tag-newest#articleHeader0 嗅探器 允许从正在运行的Elastic ...
- 使用Java Low Level REST Client操作elasticsearch
Java REST客户端有两种风格: Java低级别REST客户端(Java Low Level REST Client,以后都简称低级客户端算了,难得码字):Elasticsearch的官方low- ...
- Elasticsearch java api操作(一)(Java Low Level Rest Client)
一.说明: 一.Elasticsearch提供了两个JAVA REST Client版本: 1.java low level rest client: 低级别的rest客户端,通过http与集群交互, ...
- Elasticsearch java api操作(二)(Java High Level Rest Client)
一.说明: 一.Elasticsearch提供了两个JAVA REST Client版本: 1.java low level rest client: 低级别的rest客户端,通过http与集群交互, ...
- 使用Java High Level REST Client操作elasticsearch
Java高级别REST客户端(The Java High Level REST Client)以后简称高级客户端,内部仍然是基于低级客户端.它提供了更多的API,接受请求对象作为参数并返回响应对象,由 ...
- Java High Level REST Client 中文API(仅供参考)
1.初始化 兼容性 Java High Level REST Client需要Java 1.8,并依赖于Elasticsearch核心项目,客户端版本与客户端开发的Elasticsearch版本相同, ...
- 【ES】Java High Level REST Client 使用示例(增加修改)
ES提供了多种编程语言的链接方式,有Java API,PHP API,.NET API 官网可以详细了解 https://www.elastic.co/guide/en/elasticsearch/c ...
- Java High Level REST Client 使用示例
概述 ES 在 7.0 版本开始将废弃 TransportClient,8.0 版本开始将完全移除 TransportClient,取而代之的是 High Level REST Client,官方文档 ...
- Java High Level REST Client 使用地理位置查询
Java High Level REST Client 使用地理位置查询 一.需求 二.对应的query语句 三.对应java代码 1.引入 jar 包 2.创建 RestHighLevelClien ...
- SpringBoot:elasticSearch 7.2.0 Java High Level REST Client 搜索 API
Springboot整合最新版elasticSearch参考之前的文章:SpingBoot:整合ElasticSearch 7.2.0 Search API SearchRequest用于与搜索文档, ...
随机推荐
- Linux学习总结(十六)系统用户及用户组管理
先来认识两个文件 /etc/passwd/etc/shadow我们打印出首尾三行,来了解下:每行由:分割为7段,每段含义为:第一段:用户名,比如root 用户,普通用户test,lv,test1第二段 ...
- 如何解决“当前上下文中不存在名称“XXXXXXXX””的问题
如果你是用的Visual Studio 2017,如果你项目中的.cshtml文件出现编译调试一切正常,但是在设计时查看出现下面的提示时: 错误 CS0103 当前上下文中不存在名称“ViewBag” ...
- Coursera机器学习基石 第2讲:感知器
第一讲中我们学习了一个机器学习系统的完整框架,包含以下3部分:训练集.假设集.学习算法 一个机器学习系统的工作原理是:学习算法根据训练集,从假设集合H中选择一个最好的假设g,使得g与目标函数f尽可能低 ...
- jsp页面运行的步骤以及原理
1.jsp页面在服务器端的执行步骤: 1)将jsp页面翻译成java文件 2)编译 java-class 3)执行返回结果(html页面)给客户端. 2.jsp页面运行的原理: jsp在服务器端运行 ...
- vue 方法相互调用注意事项与详解
vue在同一个组件内: methods中的一个方法调用methods中的另外一个方法: 可以直接这样调用:this.$options.methods.test(); this.$options.met ...
- Xcode 9.3 pod install update 错误
[!] Oh no, an error occurred. Search for existing GitHub issues similar to yours: https://github.com ...
- 编译升级至openssh7.6
1.概述 目的:下载源码包(https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-7.6p1.tar.gz),编译升级为openssh为7.6 ...
- 笔记: js构造函数与原型
目录 构造函数与原型介绍 涉及三种引用的操作 有关原型及原型链的一些相关方法总结 @ 构造函数与原型介绍 1.函数与函数的原型对象(prototype object): 在JavaScript中,创建 ...
- JavaScript深入之参数按值传递
在<JavaScript高级程序设计>第三版 4.1.3,讲到传递参数: ECMAscript中所有函数的参数都是按值传递 按值传递 也就是,把函数外部的值复制给函数内部的参数,就和把值从 ...
- 壹度DIY_微信小程序组件_小程序插件开发
开源免费插件,diy特有的页面机制,搭配30+自定义组件,让你的站点每一个页面都可以完全自定义,可无缝对接任意小程序,如有疑问加入qq壹度小程序交流群:302866773:或wx:liu2417301 ...