Transport Client telah ditinggalkan (deprecated) dalam Elasticsearch open source. Untuk proyek baru, gunakan Java Low Level REST Client, yang menyediakan kompatibilitas versi lintas semua rilis Elasticsearch.
Topik ini menjelaskan cara menggunakan Transport Client 5.3.3 untuk terhubung ke kluster Alibaba Cloud Elasticsearch V5.x melalui TCP.
Prasyarat
Sebelum memulai, pastikan Anda telah:
-
Menginstal JDK 1.8 atau versi yang lebih baru. Lihat Instal JDK.
-
Memiliki kluster Alibaba Cloud Elasticsearch V5.5.3. Lihat Buat kluster Alibaba Cloud Elasticsearch.
-
Mengaktifkan Auto Indexing untuk kluster tersebut. Lihat Konfigurasi file YML.
Jika Auto Indexing tidak diaktifkan, error akan muncul saat Anda mengindeks dokumen. 
Konfigurasi akses jaringan
Pilih metode koneksi berdasarkan lokasi eksekusi client Java Anda.
Internet (titik akhir publik)
Jika client Java Anda berada di luar virtual private cloud (VPC):
-
Aktifkan Public Network Access untuk kluster Anda.
-
Tambahkan alamat IP publik client Anda ke daftar putih alamat IP publik kluster. Lihat Konfigurasi daftar putih alamat IP publik atau privat untuk kluster Elasticsearch.
-
Jika client Anda berada di jaringan rumahan atau LAN kantor, tambahkan alamat IP egress Internet ke daftar putih, bukan alamat IP privat client tersebut.
-
Menambahkan
0.0.0.0/0ke daftar putih memungkinkan semua alamat IPv4 mengakses kluster. Evaluasi risiko keamanan sebelum menggunakan pengaturan ini. -
Jika daftar putih tidak ada atau salah, koneksi akan gagal dengan error
Timeout connecting. -
Untuk mengakses node Kibana dari client, konfigurasikan daftar putih Kibana secara terpisah. Lihat Konfigurasi daftar putih alamat IP publik atau privat untuk Kibana.
VPC yang sama (titik akhir internal)
Jika client Java Anda berjalan di VPC yang sama dengan kluster Elasticsearch, gunakan titik akhir internal kluster tersebut. Daftar putih IP privat secara default adalah 0.0.0.0/0.
Tambahkan dependensi POM
Tambahkan dependensi berikut ke file pom.xml Anda:
<repositories>
<!-- Elasticsearch Maven repository -->
<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>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>x-pack-transport</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7.1</version>
</dependency>
</dependencies>
Kerentanan eksekusi kode remote (RCE) mungkin ada pada Apache Log4j. Lihat Pemberitahuan kerentanan | Kerentanan RCE pada Apache Log4j 2 untuk detail dan langkah mitigasi.
Terhubung ke kluster
Kode berikut menunjukkan cara menginisialisasi koneksi Transport Client. Ganti placeholder dengan nilai aktual kluster Anda.
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
import java.net.InetAddress;
// Inisialisasi Transport Client
TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
.put("cluster.name", "<cluster-id>") // ID kluster Anda
.put("xpack.security.user", "elastic:<password>") // Username dan password
.put("client.transport.sniff", false) // Harus bernilai false
.build())
.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName("<endpoint>"), 9300)); // Titik akhir (tanpa http://) dan port
// Tutup client setelah selesai
client.close();
| Parameter | Deskripsi |
|---|---|
cluster.name |
ID kluster Elasticsearch Anda. Dapatkan dari halaman Basic Information. Lihat Lihat informasi dasar kluster. |
xpack.security.user |
Username dan password dalam format username:password. Username default adalah elastic. Untuk mengatur ulang password, lihat Atur ulang password akses kluster Elasticsearch. |
client.transport.sniff |
Atur ke false. |
InetAddress.getByName() |
Titik akhir kluster dan port 9300. Titik akhir tidak boleh diawali dengan http://. |
Ganti placeholder berikut:
| Placeholder | Deskripsi | Contoh |
|---|---|---|
<cluster-id> |
ID kluster Elasticsearch Anda | es-cn-n6w1rux8i000w**** |
<password> |
Password untuk pengguna elastic |
— |
<endpoint> |
Titik akhir publik atau internal kluster | es-cn-n6w1rux8i000w****.public.elasticsearch.aliyuncs.com |
Contoh
Contoh berikut terhubung ke kluster, menulis dokumen ke indeks, lalu mengambilnya kembali. Unduh kode contoh lengkap.
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;
import static org.elasticsearch.common.xcontent.XContentFactory.*;
import java.net.InetAddress;
public class TransportClientDemo {
public static void main(String[] args) {
try {
// Inisialisasi client
TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
.put("cluster.name", "es-cn-n6w1rux8i000w****")
.put("xpack.security.user", "elastic:es_password")
.put("client.transport.sniff", false)
.build())
.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName("es-cn-n6w1rux8i000w****.public.elasticsearch.aliyuncs.com"), 9300));
// Menulis dokumen ke indeks
IndexResponse idxResp3 = client.prepareIndex("test_index", "test_type", "333")
.setSource(jsonBuilder()
.startObject()
.field("user_id", "333")
.field("email", "a***@aliyun.com")
.endObject()
)
.get();
System.out.println(idxResp3.toString());
// Mengambil dokumen
GetResponse getResp = client.prepareGet()
.setIndex("test_index")
.setType("test_type")
.setId("333")
.execute()
.get();
System.out.println(getResp.getSourceAsString());
client.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
Pemecahan Masalah
`NoNodeAvailableException`
Error ini terjadi ketika Anda menggunakan Transport Client 5.5 atau 5.6 untuk terhubung ke kluster Elasticsearch V5.x. Gunakan Transport Client 5.3.3 sebagai gantinya.
`Timeout connecting`
Kluster tidak dapat dijangkau. Periksa bahwa:
-
Alamat IP client Anda ada dalam daftar putih kluster (publik atau privat, tergantung jaringan Anda).
-
Anda menggunakan titik akhir yang benar (publik vs. internal) sesuai lingkungan jaringan Anda.
-
Entri daftar putih menggunakan alamat IP egress Internet, bukan IP privat, untuk client di jaringan rumahan atau LAN kantor.
Error Auto Indexing saat menulis dokumen
Jika muncul error saat menulis dokumen, kemungkinan Auto Indexing dinonaktifkan. Aktifkan fitur tersebut dalam konfigurasi YML kluster. Lihat Konfigurasi file YML.
Langkah Berikutnya
-
Java Low Level REST Client — client yang direkomendasikan untuk proyek baru, dengan kompatibilitas versi penuh.