ElasticSearch Client 详解
代码 @1:使用空配置。
代码 @2:连接 ElasticSearch 节点,可以通过 addTransportAddress 方法连接多个 Node 节点,这样请求会轮流发送到这些节点上,实现集群节点在接受请求时的负载均衡。
TransportClient 级别的主要参数如下:
| 参数名 | 描述 |
| --- | --- |
| cluster.name | transport node 与服务端节点并不在一个集群中 |
| client.transport.sniff | 是否开启集群嗅探功能,下文会详细介绍。 |
| client.transport.ignore_cluster\ 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 _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)) ;
//Add transport addresses and do something with the client...
2.2、TransportClient API
TransportClient 的核心类继承图如下:
上述 API 的设计要点:
整个客户端 API 提供两个最底层的方法,execute,其关键特征如下:
ActionFuture execute(Action<Request, Response, RequestBuilder> action, Request request);
返回 ActionFuture,根据名称即可知道,该方法是典型的异步调用,Future 模式。
void execute(Action<Request, Response, RequestBuilder> action, Request request, ActionListener listener);
无返回值,但需要传入 ActionListener listener,同样根据名称即可知道,该参数的作用是事件监听器(回调方法),也就是收到服务端响应后,调用回调函数,进行结果处理。
注意:ElasticSearch Client API 其本质是使用异步请求模式。
prepare 开头的方法,例如 IndexRequestBuilder prepareIndex()
这类 API 的设计是使用 Build 模式,先通过 build 构建请求参数,最终会通过调用 get()方法完成接口调用。
TransportClient Api 就先解释到这里了,后续会详细对上述 API 进行分类详解。
2.3 Maven 依懒
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
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 的类图 如下:
评论