ES中的RestHighLevelClient学习——TransportClient迁移

由于TransportClient已经都学习过了,所以直接学习迁移指南就可以。
迁移指南官方给的很简单,有的地方需要动一下脑子,举一反三,因为官网给的都是例子,不过只要知道一个变化的情况,举一反三也不是很难。


Rest里值得一体的也多了很多新的功能,因为可以直接使用low-level rest client去模拟访问,相当于封装了kibana的dev tools直接构建的json表达式,所以可以灵活构建出各种Request对象,包括各种原来没见过的ListTasksRequest、MainResponse、PutRepositoryRequest等待,暂时我不需要深究,先熟练基本操作。

原因

官方说的对于TransportClient,7.0不建议使用,8.0删除
原因大概就是ES一直版本在更新,TransportClient对es版本的匹配要求比较高,而Rest服务要求不高,兼容能力强

迁移

Client初始化和关闭

这个区别主要在于端口,一个TCP,一个HTTP
还有就是Rest不需要Settings,Rest考虑的就是http地址

Transport

Settings settings = Settings.builder()
        .put("cluster.name", "prod").build();

TransportClient transportClient = new PreBuiltTransportClient(settings)
        .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300))
        .addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9301));

transportClient.close();      

Rest

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http"),
                new HttpHost("localhost", 9201, "http")));
client.close();

Request和Response对象

这方面,两者的请求和响应(包括index、delete、update的upsert、bulk、bulkProcessor等等)因为他们都是使用导入的是(以index为例):
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
两者在一个包里,所以具体里面的东西没有什么区别,区别在于如何使用和返回这几个对象

但是Rest可以构建更多样的

以IndexResponse为例

IndexRequest构建情况是相同的,区别在于构建IndexResponse,transport使用RequestBuilder的相关prepare遗留方法去构建Response,rest直接使用client的对应方法去返回一个对应的Response。
比如transportClient.prepareBulk().get()直接变成client.bulk()得到的同样都是BulkResponse;
prepareSearch变成了search方法

IndexResponse response = transportClient.index(indexRequest).actionGet();

IndexResponse response = client.index(request, RequestOptions.DEFAULT);

不用Builder怎么执行——直接client执行

DeleteRequest request = new DeleteRequest("index", "doc", "id"); 
//同步
DeleteResponse response = transportClient.delete(request).actionGet();

DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
//异步
transportClient.delete(request, new ActionListener<DeleteResponse>() { // 
    @Override
    public void onResponse(DeleteResponse deleteResponse) {
        // 
    }

    @Override
    public void onFailure(Exception e) {
        // 
    }
});

client.deleteAsync(request, new ActionListener<DeleteResponse>() { 
    @Override
    public void onResponse(DeleteResponse deleteResponse) {

    }

    @Override
    public void onFailure(Exception e) {

    }
});

管理用low-level Rest client

transport直接可以使用client.admin()来管理查看cluster状态

ClusterHealthResponse response = client.admin().cluster().prepareHealth().get(); // 

ClusterHealthStatus healthStatus = response.getStatus(); // 
if (healthStatus != ClusterHealthStatus.GREEN) {
    // 
}

而Rest可以用low-level Rest client模拟请求返回

Request request = new Request("GET", "/_cluster/health");
request.addParameter("wait_for_status", "green"); 
Response response = client.getLowLevelClient().performRequest(request); 

ClusterHealthStatus healthStatus;
try (InputStream is = response.getEntity().getContent()) { 
    Map<String, Object> map = XContentHelper.convertToMap(XContentType.JSON.xContent(), is, true); 
    healthStatus = ClusterHealthStatus.fromString((String) map.get("status")); 
}

if (healthStatus != ClusterHealthStatus.GREEN) {

}

发表评论

电子邮件地址不会被公开。