4. 与ES通信的两种方式

【ElasticSearch系列连载】4. 与ES通信的两种方式

1 使用客户端

以java为例,ElasticSearch提供了两种client使用模式。

1.1 节点客户端-Node Client

使用这种模式的话,你的程序会作为一个不存储数据的节点加入ES集群,换句话说,虽然它不会持有任何的数据,但是它作为集群的节点就可以时刻知道不同的数据此时此刻存储在哪个节点上,进而可以直接与存储目标数据的节点进行通信。

1.2 传输客户端-Transport Client

是一种更加轻量的通信方式,使用这种模式你的程序不会加入集群,只是简单的与集群中的代表节点进行通信。

这两种通信方式使用的都是9300端口,使用ES原生的传输协议。如前面的文章所述,9300也是集群中各个节点之间的通信端口,如果这个端口没有对你的程序打开的话你将无法建立ES集群。
同时,你的客户端版本也需要与ES的版本相匹配。

1.3 如何选型

你可能想知道何时使用传输客户端(注:Transport Client,下同)与节点客户端(注:Node Client,下同)。

传输客户端作为一个集群和应用程序之间的通信层。它知道 API 并能自动帮你在节点之间轮询,帮你嗅探集群等等。但它是集群 外部的 ,和 REST 客户端类似。

而另一方面,节点客户端,实际上是一个集群中的节点(但不保存数据,不能成为主节点)。因为它是一个节点,它知道整个集群状态(所有节点驻留,分片分布在哪些节点,等等)。 这意味着它可以执行 APIs 但少了一个网络跃点。

这里有两个客户端案例的使用情况:

  • 如果要将应用程序和 Elasticsearch 集群进行解耦,传输客户端是一个理想的选择。例如,如果您的应用程序需要快速的创建和销毁到集群的连接,传输客户端比节点客户端”轻”,因为它不是一个集群的一部分,类似地,如果您需要创建成千上万的连接,你不想有成千上万节点加入集群。传输客户端( TC )将是一个更好的选择。
  • 另一方面,如果你只需要有少数的、长期持久的对象连接到集群,客户端节点可以更高效,因为它知道集群的布局。但是它会使你的应用程序和集群耦合在一起,所以从防火墙的角度,它可能会构成问题。

2 使用RESTful API通信

任何的程序、语言都可以使用RESTful API通过9200端口与ES集群进行通信。

2.1 使用curl

正如前文看到的,你可以直接在命令行中使用curl命令与ES通信。

curl语法如下

1
curl -H '<请求头>' -X<请求方式> '<协议>://<主机地址>:<端口号>/<请求路径>?<参数>' -d '<请求体>'

上述 < > 之间的内容说明如下

1 请求头

传递附加信息的字段,如果在请求时需要json格式的请求体,则需要通过消息头告诉ES请求体是json格式,如

1
-H "Content-Type: application/json"

2 请求方式

即HTTP method,如GET,POST,PUT,DELETE

3 协议

http或者https

4 主机地址

你的ES集群地址信息

5 端口号

提供ES服务的端口号,默认是9200。

6 请求路径与请求参数

根据不同的API,可能会需要不同的请求路径与请求参数。

7 请求体

如果API需要的话,填写json格式的请求体,同时搭配上面的请求头一起使用。

2.2 样例

查询ES中数据总量

执行如下命令

1
2
3
4
5
6
curl -H "Content-Type: application/json" -XGET 'http://localhost:9200/_count?pretty' -d '
{
"query": {
"match_all": {}
} }
'

可以看到返回中count=0的信息

1
2
3
4
5
6
7
8
9
{
"count" : 0,
"_shards" : {
"total" : 0,
"successful" : 0,
"skipped" : 0,
"failed" : 0
}
}