百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

Es-ElasticsearchClient客户端

yuyutoo 2025-02-26 14:27 11 浏览 0 评论

1、概述

本文关注Elasticsearch与Java相关的API实现。所有Elasticsearch操作都是使用Client对象执行的。Client 定义的所有API都是异步执行的(要么使用事件监听器回调或者使用Future模式)。此外,客户端上的操作可以批量累积和执行。

Elasticsearch官方计划在Elasticsearch 7.0中弃TransportClient,并在8.0中完全删除它。相反,您应该使用Java高级REST client,rest client执行HTTP请求来执行操作,无需再序列化的Java请求。Java高级REST Client API目前支持更常用的api,但还需要添加更多的api。

任何缺失的api都可以通过使用带有JSON请求和响应体的低级Java REST客户机来实现。按照官方的意思,以后ElasticSearch应该不会再为某一种具体语言单独提供客户端API,而是使用通用rest请求(http)来与ElasticSearch服务器进行交互。

接下来我们会从java api开始进入ElasticSearch API的学习。

ElasticSearch Client按照编程语言提供如下实现:

接下来将重点分析JAVA Client与Java REST Client。

2、TransportClient详解

2.1 TransportClient概述

TransportClient 是ElasticSearch(java)客户端封装对象,使用transport模块远程连接到Elasticsearch集群,该transport node并不会加入集群,而是简单的向ElasticSearch集群上的节点发送请求。transport node使用轮询机制进行集群内的节点进行负载均衡,尽管大多数操作(请求)可能是“两跳操作”,其操作如图(引用在Elasticsearch权威指南)。

正如上述图所述,以一个新建操作为例,第一个请求首先发送到NODE1,然后会根据ID进行路由计算(hashcode(id)%主分片个数),例如使用p0(第一个主分片),此时NODE1会将请求转发到Node3,然后客户端发送第二个请求,会发送到NODE2上(上文中的轮询机制)。

默认构建TransportClient的方法如下

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)??? // @1
??????? .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.1.10"), 9300))???? // @2
??????? .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.1.11"), 9300));? ?
?// on shutdown
?client.close();

代码@1:使用空配置。

代码@2:连接ElasticSearch 节点,可以通过addTransportAddress方法连接多个Node节点,这样请求会轮流发送到这些节点上,实现集群节点在接受请求时的负载均衡。

TransportClient级别的主要参数如下:

参数名

参数描述

cluster.name

transport node与服务端节点并不在一个集群中。

client.transport.sniff

是否开启集群嗅探功能,下文会详细介绍。

client.transport.ignore_cluster_name

是否忽略连接节点的集群名称校验,设置为true表示忽略,避免连接的节点并不在同一个集群中。

client.transport.ping_timeout

ping命令的响应超时时间,默认为5s。

client.transport.nodes_sampler_interval

对连接节点发送ping命令的频率,默认为5s,即常说的心跳检测间隔时间。


接下来重点描述一下client.transport.sniff参数,集群群嗅探机制。

在创建TransportClient时可以通过addTransportAddress来静态的增加ElasticSearch集群中的节点,如果开启集群群嗅探机制,即开启节点动态发现机制,允许动态添加和删除节点。当启用嗅探功能时,首先客户端会连接addTransportAddress中的节点上。在此之后,客户端将调用这些节点上的内部集群状态API来发现可用的数据节点。客户端的内部节点列表将仅被发现的数据数据节点替换。默认情况下,这个列表每5秒刷新一次。也就意味着如果该节点不是数据节点,则列表可能不包括它连接的原始节点。例如,如果您最初连接到一个主节点,在嗅探之后,如果发现了有其对应的数据节点,则不会再向该主节点发出请求,而是向任何数据节点发出请求。传输客户端排除非数据节点的原因是为了避免只向主节点发送搜索流量。

使用配置构建Settings构建TransportClient对象代码如下:

Settings settings = Settings.builder()
 ? .put(“cluster.name”, “myClusterName”)
 ? ? ? ?.put(“client.transport.sniff”, “true”).build();
TransportClient client = new PreBuiltTransportClient(settings)
 ? .addTransportAddress(new TransportAddress(InetAddress.getByName(“192.168.1.10”), 9300)) ?

2.2、TransportClient API

TransportClient 的核心类继承图如下:

上述API的设计要点:

整个客户端API提供两个最底层的方法,execute,其关键特征如下:

  • ActionFuture execute(Action action, Request request);

返回ActionFuture,根据名称即可知道,该方法是典型的异步调用,Future模式。

  • void execute(Action action, Request request, ActionListener listener);

无返回值,但需要传入ActionListener listener,同样根据名称即可知道,该参数的作用是事件监听器(回调方法),也就是收到服务端响应后,调用回调函数,进行结果处理。

注意:ElasticSearch Client API 其本质是使用异步请求模式。

  • prepare 开头的方法,例如IndexRequestBuilder prepareIndex()

这类API的设计是使用Build模式,先通过build构建请求参数,最终会通过调用get()方法完成接口调用。

TransportClient Api就先解释到这里了,后续会详细对上述API进行分类详解。

2.3 Maven依懒


 ? ?org.elasticsearch.client
 ? ?transport
 ? ?6.4.1


 ? ?org.apache.logging.log4j
 ? ?log4j-core
 ? ?2.11.1

3、Java Rest Client详解

Java REST客户端有两种风格:

  • Java Low Level REST Client:elasticsearch client 低级别客户端。它允许通过http请求与Elasticsearch集群进行通信。API本身不负责数据的编码解码,由用户去编码解码。它与所有的ElasticSearch版本兼容。
  • Java High Level REST Client:Elasticsearch client官方高级客户端。基于低级客户端,它定义的API,已经对请求与响应数据包进行编码解码。

3.1 Java High Level REST Client

3.1.1 初始化

RestHighLevelClient client = new RestHighLevelClient(
 ? ? ? ?RestClient.builder(
 ? ? ? ? ? ? ? ?new HttpHost("localhost", 9200, "http"),
 ? ? ? ? ? ? ? ?new HttpHost("localhost", 9201, "http")));
// close
client.close();

new HttpHost("localhost", 9200, "http")其机制与TransportClient的addTransportAddress的作用一致。

3.1.2 核心API依懒

RestHighLevelClient 的类图如下:

其API设计具有如下特征:

  • 每个API提供同步与异步调用,方法名以async结尾的方法为异步调用,需要提供对应的ActionListener实现。
  • 每个API都可以提供RequestOptions对象来定制请求选型。

本节将不会对上述API一一介绍,上述API会在后续文章中详细解析。

3.1.3 Maven依懒


 ? ? ? ?org.elasticsearch.client
 ? ? ? ?elasticsearch-rest-client
 ? ? ? ?6.4.0

 
 ? ? ? ?org.elasticsearch.client
 ? ? ? ?elasticsearch-rest-high-level-client
 ? ? ? ?6.4.0
 ? ? ? ? pom

本文就先介绍到这里了,本节详细介绍了Elasticsearch两大客户端 TransportClient与RestHighLevelClient 相关API,后续文章会详细介绍各个API的使用及其内部原理,例如文档的索引、更新、查询、删除、批量查询,Search API等原理讲解与使用示例。

相关推荐

自卑的人容易患抑郁症吗?(自卑会导致抑郁吗)

Filephoto[Photo/IC]Lowself-esteemmakesusfeelbadaboutourselves.Butdidyouknowthatovert...

中考典型同(近)义词组(同义词考题)

中考典型同(近)义词组...

WPF 消息传递简明教程(wpf messagebox.show)

...

BroadcastReceiver的原理和使用(broadcast-suppression)

一、使用中注意的几点1.动态注册、静态注册的优先级在AndroidManifest.xml中静态注册的receiver比在代码中用registerReceiver动态注册的优先级要低。发送方在send...

Arduino通过串口透传ESP 13板与java程序交互

ESP13---是一个无线板子,配置通过热点通信Arduino通过串口透传ESP13板与java程序交互...

zookeeper的Leader选举源码解析(zookeeper角色选举角色包括)

作者:京东物流梁吉超zookeeper是一个分布式服务框架,主要解决分布式应用中常见的多种数据问题,例如集群管理,状态同步等。为解决这些问题zookeeper需要Leader选举进行保障数据的强一致...

接待外国人英文口语(接待外国友人的英语口语对话)

接待外国人英文口语询问访客身份:  MayIhaveyourname,please?  请问您贵姓?  Whatcompanyareyoufrom?  您是哪个公司的?  Could...

一文深入理解AP架构Nacos注册原理

Nacos简介Nacos是一款阿里巴巴开源用于管理分布式微服务的中间件,能够帮助开发人员快速实现动态服务发现、服务配置、服务元数据及流量管理等。这篇文章主要剖析一下Nacos作为注册中心时其服务注册与...

Android面试宝典之终极大招(android面试及答案)

以下内容来自兆隆IT云学院就业部,根据多年成功就业服务经验,以及职业素养课程部分内容,归纳总结:18.请描述一下Intent和IntentFilter。Android中通过Intent...

除了Crontab,Swoole Timer也可以实现定时任务的

一般的定时器是怎么实现的呢?我总结如下:1.使用Crontab工具,写一个shell脚本,在脚本中调用PHP文件,然后定期执行该脚本;2.ignore_user_abort()和set_time_li...

Spark源码阅读:DataFrame.collect 作业提交流程思维导图

本文分为两个部分:作业提交流程思维导图关键函数列表作业提交流程思维导图...

使用Xamarin和Visual Studio开发Android可穿戴设备应用

搭建开发环境我们需要做的第一件事情是安装必要的工具。因此,你需要首先安装VisualStudio。如果您使用的是VisualStudio2010,2012或2013,那么请确保它是一个专业版本或...

Android开发者必知的5个开源库(android 开发相关源码精编解析)

过去的时间里,Android开发逐步走向成熟,一个个与Android相关的开发工具也层出不穷。不过,在面对各种新鲜事物时,不要忘了那些我们每天使用的大量开源库。在这里,向大家介绍的就是,在这个任劳任怨...

Android事件总线还能怎么玩?(android实现事件处理的步骤)

顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity、Fragment、Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码...

Android 开发中文引导-应用小部件

应用小部件是可以嵌入其它应用(例如主屏幕)并收到定期更新的微型应用视图。这些视图在用户界面中被叫做小部件,并可以用应用小部件提供者发布。可以容纳其他应用部件的应用组件叫做应用部件的宿主(1)。下面的截...

取消回复欢迎 发表评论: