本文共 4902 字,大约阅读时间需要 16 分钟。
从本文开始,将与大家进入到Elasticsearch的精妙世界中来,基于当前最新的6.4.x版本。
本文将重点探讨ElasticSearch Client的相关知识,重点关注TransportClient与Rest Client。Elasticsearch client 是我们进入ElasticSearch的大门。
1、概述
所有Elasticsearch操作都是使用Client对象执行的。Client 定义的所有API都是异步执行的。(要么使用事件监听器回调或者使用Future模式)Elasticsearch计划在Elasticsearch 7.0中弃用TransportClient,在8.0中完全删除它。故在实际使用过程中建议您使用Java高级REST client。Rest client执行HTTP请求来执行操作,无需再序列化的Java请求。
按照官方的意思,以后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的方法如下:
// on startupTransportClient 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级别的主要参数如下:
接下来重点描述一下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)) ; //Add transport addresses and do something with the client...
2.2 TransportClient API
TransportClient 的核心类继承图如下:上述API的设计要点:
整个客户端API提供两个最底层的方法,execute,其关键特征如下:注意:ElasticSearch Client API 其本质是使用异步请求模式。
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客户端有两种风格: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")));// closeclient.close();
new HttpHost("localhost", 9200, "http")其机制与TransportClient的addTransportAddress的作用一致。
3.1.2 核心API依懒
RestHighLevelClient 的类图 如下:其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,例如文档的索引、更新、查询、删除、批量查询,Search API等。
关于作者:
《RocketMQ计算内幕:RocketMQ架构设计与实现原理》作者。《RocketMQ技术内幕》已出版上市,目前可在主流购物平台(京东、天猫等)购买,本书从源码角度深度分析了RocketMQ NameServer、消息发送、消息存储、消息消费、消息过滤、主从同步HA、事务消息;在实战篇重点介绍了RocketMQ运维管理界面与当前支持的39个运维命令;并在附录部分罗列了RocketMQ几乎所有的配置参数。本书得到了RocketMQ创始人、阿里巴巴Messaging开源技术负责人、Linux OpenMessaging 主席的高度认可并作序推荐。目前是国内第一本成体系剖析RocketMQ的书籍。
《RocketMQ技术内幕》宣传海报:
转载地址:http://acdox.baihongyu.com/