您可以通過Transport Client 5.3.3訪問Elasticsearch 5.x版本的執行個體。本文介紹相關配置說明。
注意事項
建議您使用5.3.3版本的Transport Client來訪問Elasticsearch叢集。使用5.5或5.6版本訪問Elasticsearch叢集會提示NoNodeAvailableException的錯誤。
由於Transport Client通過TCP與Elasticsearch進行通訊,因此當用戶端與不同版本的Elasticsearch通訊時會存在相容性問題,所以官方在高版本叢集中已棄用Transport Client。建議優先使用Java Low Level REST Client來訪問Elasticsearch叢集,以保障版本的相容性。
準備工作
安裝Java,要求JDK版本為1.8及以上。
安裝方法請參見安裝JDK。
建立Elasticsearch執行個體,版本為5.5.3。
建立方法請參見建立Elasticsearch執行個體。
開啟Elasticsearch執行個體的自動建立索引功能。
具體操作步驟請參見配置YML參數。
如果未開啟會提示如下報錯。
配置Elasticsearch執行個體的白名單,確保網路互連。
如果運行Java代碼的伺服器在公網環境下,可通過Elasticsearch執行個體的公網地址進行連通。連通前,需要開啟Elasticsearch執行個體的公網地址,並修改公網地址訪問白名單,將伺服器的公網IP地址加入白名單中。具體操作步驟請參見配置執行個體公網或私網訪問白名單。
重要如果您的用戶端處在家用網路或公司區域網路中,您需要將區域網路的公網出口IP地址添加到白名單中,而非用戶端機器的內網地址。
您也可以將白名單配置為0.0.0.0/0,允許所有IPv4地址訪問Elasticsearch執行個體。此配置會導致執行個體完全暴露在公網中,增加安全風險,配置前請確認您是否可以接受這個風險。
如果未配置白名單或白名單配置錯誤,系統會提示連線逾時報錯(Timeout connecting)。
如果您需要通過用戶端訪問Kibana節點,還需要配置Kibana的訪問白名單,詳細資料請參見配置Kibana公網或私網訪問白名單。
如果運行Java代碼的伺服器與Elasticsearch執行個體在同一Virtual Private Cloud(Virtual Private Cloud)中,可通過Elasticsearch執行個體的私網地址進行連通。連通前,需要確保VPC私網訪問白名單(預設為0.0.0.0/0)中已添加了伺服器的內網IP地址。
建立Java Maven工程,並將下文的pom依賴添加到Java工程的pom.xml檔案中。
pom依賴
<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>
<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>
Log4j可能存在遠程代碼執行漏洞,詳細資料請參見漏洞公告 | Apache Log4j2遠程代碼執行漏洞。
樣本
單擊下載完整範例程式碼。
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 {
TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
.put("cluster.name", "es-cn-n6w1rux8i000w****") //替換為對應阿里雲ES執行個體的ID。
.put("xpack.security.user", "elastic:es_password") //阿里雲ES執行個體的使用者名稱、密碼。
.put("client.transport.sniff", false) //設定sniff為false。
.build())
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("es-cn-n6w1rux8i000w****.public.elasticsearch.aliyuncs.com"), 9300));//指定網域名稱及連接埠,替換為對應阿里雲ES執行個體的網域名稱。
//下面這段代碼可以根據實際情況進行修改,指定index,type及文檔id。
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());
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);
}
}
}
參數 | 描述 |
cluster.name | Elasticsearch執行個體的ID,可在執行個體的基本資料頁面擷取,擷取方法請參見查看執行個體的基本資料。 |
client.transport.sniff | 嗅探,請設定為false。 |
xpack.security.user | 訪問Elasticsearch執行個體的使用者名稱和密碼。使用者名稱預設為elastic。elastic使用者的密碼在建立執行個體時設定,如果忘記可重設。重設密碼的注意事項和操作步驟,請參見重設執行個體訪問密碼。 |
InetAddress.getByName() | 請在此方法的參數中指定訪問Elasticsearch執行個體的網域名稱及連接埠號碼。 重要 網域名稱不能加http。 |