Elasticsearch Java API 客戶端連接
一個是TransportClient
,一個是NodeClient
,還有一個XPackTransportClient
- TransportClient:
作為一個外部訪問者,請求ES的集群,對于集群而言,它是一個外部因素。
- NodeClient
作為ES集群的一個節(jié)點,它是ES中的一環(huán),其他的節(jié)點對它是感知的。
- XPackTransportClient:
服務(wù)安裝了 x-pack
插件
重要:客戶端版本應(yīng)該和服務(wù)端版本保持一致
TransportClient旨在被Java高級REST客戶端取代,該客戶端執(zhí)行HTTP請求而不是序列化的Java請求。 在即將到來的Elasticsearch版本中將不贊成使用TransportClient,建議使用Java高級REST客戶端。
上面的警告比較尷尬,但是在 5xx版本中使用還是沒有問題的,可能使用rest 客戶端兼容性更好做一些。
Elasticsearch Java Rest API 手冊
Maven Repository
Elasticsearch Java API包已經(jīng)上傳到 Maven Central
在pom.xml
文件中增加:
transport 版本號最好就是與Elasticsearch版本號一致。
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.3</version>
</dependency>
Transport Client
不設(shè)置集群名稱
// on startup
//此步驟添加IP,至少一個,如果設(shè)置了"client.transport.sniff"= true 一個就夠了,因為添加了自動嗅探配置
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));
// on shutdown 關(guān)閉client
client.close();
設(shè)置集群名稱
Settings settings = Settings.builder()
.put("cluster.name", "myClusterName").build(); //設(shè)置ES實例的名稱
TransportClient client = new PreBuiltTransportClient(settings); //自動嗅探整個集群的狀態(tài),把集群中其他ES節(jié)點的ip添加到本地的客戶端列表中
//Add transport addresses and do something with the client...
增加自動嗅探配置
Settings settings = Settings.builder()
.put("client.transport.sniff", true).build();
TransportClient client = new PreBuiltTransportClient(settings);
其他配置
client.transport.ignore_cluster_name //設(shè)置 true ,忽略連接節(jié)點集群名驗證
client.transport.ping_timeout //ping一個節(jié)點的響應(yīng)時間 默認(rèn)5秒
client.transport.nodes_sampler_interval //sample/ping 節(jié)點的時間間隔,默認(rèn)是5s
對于ES Client,有兩種形式,一個是TransportClient,一個是NodeClient。兩個的區(qū)別為:
TransportClient作為一個外部訪問者,通過HTTP去請求ES的集群,對于集群而言,它是一個外部因素。
NodeClient顧名思義,是作為ES集群的一個節(jié)點,它是ES中的一環(huán),其他的節(jié)點對它是感知的,不像TransportClient那樣,ES集群對它一無所知。NodeClient通信的性能會更好,但是因為是ES的一環(huán),所以它出問題,也會給ES集群帶來問題。NodeClient可以設(shè)置不作為數(shù)據(jù)節(jié)點,在elasticsearch.yml中設(shè)置,這樣就不會在此節(jié)點上分配數(shù)據(jù)。
如果用ES的節(jié)點,仁者見仁智者見智。
實例
package name.quanke.es.study;
import name.quanke.es.study.util.Utils;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.After;
import org.junit.Before;
import java.net.InetAddress;
/**
* Elasticsearch 5.5.1 的client 和 ElasticsearchTemplate的初始化
* 作為一個外部訪問者,請求ES的集群,對于集群而言,它是一個外部因素。
* Created by http://quanke.name on 2017/11/10.
*/
public class ElasticsearchClient {
protected TransportClient client;
@Before
public void setUp() throws Exception {
Settings esSettings = Settings.builder()
.put("cluster.name", "utan-es") //設(shè)置ES實例的名稱
.put("client.transport.sniff", true) //自動嗅探整個集群的狀態(tài),把集群中其他ES節(jié)點的ip添加到本地的客戶端列表中
.build();
/**
* 這里的連接方式指的是沒有安裝x-pack插件,如果安裝了x-pack則參考{@link ElasticsearchXPackClient}
* 1. java客戶端的方式是以tcp協(xié)議在9300端口上進(jìn)行通信
* 2. http客戶端的方式是以http協(xié)議在9200端口上進(jìn)行通信
*/
client = new PreBuiltTransportClient(esSettings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.1.10"), 9300));
System.out.println("ElasticsearchClient 連接成功");
}
@After
public void tearDown() throws Exception {
if (client != null) {
client.close();
}
}
protected void println(SearchResponse searchResponse) {
Utils.println(searchResponse);
}
}
本實例代碼已經(jīng)上傳到 Git ElasticsearchClient.java
所有實例 已經(jīng)上傳到Git
XPackTransportClient
如果 ElasticSearch
服務(wù)安裝了 x-pack
插件,需要PreBuiltXPackTransportClient
實例才能訪問
使用Maven管理項目,把下面代碼增加到pom.xml
;
一定要修改默認(rèn)倉庫地址為https://artifacts.elastic.co/maven ,因為這個庫沒有上傳到Maven中央倉庫,如果有自己的 maven ,請配置代理
<project ...>
<repositories>
<!-- add the elasticsearch repo -->
<repository>
<id>elasticsearch-releases</id>
<url>https://artifacts.elastic.co/maven</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
...
</repositories>
...
<dependencies>
<!-- add the x-pack jar as a dependency -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>x-pack-transport</artifactId>
<version>5.6.3</version>
</dependency>
...
</dependencies>
...
</project>
實例
/**
* Elasticsearch XPack Client
* Created by http://quanke.name on 2017/11/10.
*/
public class ElasticsearchXPackClient {
protected TransportClient client;
@Before
public void setUp() throws Exception {
/**
* 如果es集群安裝了x-pack插件則以此種方式連接集群
* 1. java客戶端的方式是以tcp協(xié)議在9300端口上進(jìn)行通信
* 2. http客戶端的方式是以http協(xié)議在9200端口上進(jìn)行通信
*/
Settings settings = Settings.builder()
.put("xpack.security.user", "elastic:utan100")
.put("cluster.name", "utan-es")
.build();
client = new PreBuiltXPackTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.1.10"), 9300));
// final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
// credentialsProvider.setCredentials(AuthScope.ANY,
// new UsernamePasswordCredentials("elastic", "utan100"));
System.out.println("ElasticsearchXPackClient 啟動成功");
}
@Test
public void testClientConnection() throws Exception {
System.out.println("--------------------------");
}
@After
public void tearDown() throws Exception {
if (client != null) {
client.close();
}
}
protected void println(SearchResponse searchResponse) {
Utils.println(searchResponse);
}
}
本實例代碼已經(jīng)上傳到 Git ElasticsearchXPackClient.java
所有實例 已經(jīng)上傳到Git
更多請瀏覽 spring-boot-starter-es 開源項目
如何有任何問題請給我留言
全科龍婷▼升職加薪