Java API
使用的客户端名称叫TransportClient
,从7.0.0开始,官方已经不建议使用TransportClient
作为ES的Java客户端了,并且从8.0会被彻底删除。
TransportClient
使用transport
模块(9300端口)远程连接到 Elasticsearch 集群,客户端并不加入集群,而是通过获取单个或者多个transport地址来以轮询的方式与他们通信。TransportClient
使用transport
协议与Elasticsearch节点通信,如果客户端的版本和与其通信的ES实例的版本不同,就会出现兼容性问题。而low-level REST
使用的是HTTP协议,可以与任意版本ES集群通信。high-level REST
是基于low-level REST
的。<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>7.12.1</version>
</dependency>
// 创建客户端连接
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new TransportAddress(InetAddress.getByName("host1"), 9300))
.addTransportAddress(new TransportAddress(InetAddress.getByName("host2"), 9300));
// 关闭客户端
client.close();
Settings settings = Settings.builder()
.put("client.transport.sniff", true).build();
TransportClient client = new PreBuiltTransportClient(settings);
RestClient
是线程安全的,RestClient
使用 Elasticsearch 的 HTTP 服务,默认为9200
端口,这一点和transport client
不同。
第一个 5.0.0 版 Java REST 客户端,之所以称为低级客户端,是因为它几乎没有帮助 Java 用户构建请求或解析响应。它处理请求的路径和查询字符串构造,但它将 JSON 请求和响应主体视为必须由用户处理的不透明字节数组。
Java Low-level REST client
时的ES版本(2016年),不代表其向前只兼容到5.0,Java Low-level REST client
基于Apache HTTP 客户端,它允许使用 HTTP 与任何版本的 Elasticsearch 集群进行通信。<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.12.0</version>
</dependency>
RestClient restClient = RestClient.builder(
new HttpHost("localhost1", 9200, "http"),
new HttpHost("localhost2", 9200, "http")).build();
restClient.close();
允许从正在运行的 Elasticsearch 集群中自动发现节点并将它们设置为现有 RestClient 实例的最小库
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client-sniffer</artifactId>
<version>7.12.1</version>
</dependency>
// 默认每五分钟发现一次
RestClient restClient = RestClient.builder(
new HttpHost("localhost", 9200, "http"))
.build();
Sniffer sniffer = Sniffer.builder(restClient).build();
Sniffer
对象应该与RestClient
具有相同的生命周期,并在客户端之前关闭。
sniffer.close();restClient.close();
RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http")) .build();// 设置嗅探间隔为60000毫秒Sniffer sniffer = Sniffer.builder(restClient) .setSniffIntervalMillis(60000).build();
启用失败时嗅探,也就是在每次失败后,节点列表会立即更新,而不是在接下来的普通嗅探轮中更新。在这种情况下,首先需要创建一个 SniffOnFailureListener 并在 RestClient 创建时提供。此外,一旦稍后创建嗅探器,它需要与同一个 SniffOnFailureListener 实例相关联,它将在每次失败时收到通知,并使用嗅探器执行额外的嗅探轮
SniffOnFailureListener sniffOnFailureListener = new SniffOnFailureListener();RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200)) .setFailureListener(sniffOnFailureListener) //将失败侦听器设置为 RestClient 实例 .build();Sniffer sniffer = Sniffer.builder(restClient) .setSniffAfterFailureDelayMillis(30000) //在嗅探失败时,不仅节点在每次失败后都会更新,而且还会比平常更早安排额外的嗅探轮次,默认情况下是在失败后一分钟,假设事情会恢复正常并且我们想要检测尽快地。可以在 Sniffer 创建时通过 setSniffAfterFailureDelayMillis 方法自定义所述间隔。请注意,如果如上所述未启用故障嗅探,则最后一个配置参数无效。 .build();sniffOnFailureListener.setSniffer(sniffer); //将 Sniffer 实例设置为失败侦听器
生命周期(ES 5.0.0-alpha4至今)
Java 高级 REST 客户端在 Java 低级 REST 客户端之上运行。它的主要目标是公开 API 特定的方法,接受请求对象作为参数并返回响应对象,以便请求编组和响应解组由客户端本身处理。要求Elasticsearch版本为2.0
或者更高。
阅读:https://www.elastic.co/cn/blog/benchmarking-rest-client-transport-client
Transport Client
的批量索引吞吐量比HTTP 客户端大 4% 到 7%(实验室条件)REST API
使用单一的集群入口点,可以通过 HTTPS 保障数据安全性,传输层只用于内部节点到节点的通信。Java API
,但是差距不大Transport Client
接口稳定得多。