1.与其他client的特性对比
transport连接方式:
tcp连接方式,长连接
作为一个node节点的形式访问服务端(9300端口)
性能最佳
拓展性较差,无法向下兼容
经常出现长连接断开的问题
ES7.x不支持
RestLowLevelClient连接方式:
http连接,通过keepalive实现长连接
内置连接池
性能较transport略差一些
拓展性好,兼容性高
封装的不够完善
ES7.x支持
RestHighLevelClient连接方式:
是对RestLowLevelClient做的封装
内置连接池
http连接,通过keepalive实现长连接
拓展性兼容性都很好
使用方式对用户友好
性能较transport略差一些
ES7.x支持
2.实现逻辑
- client内置连接池,所以new一个client(加载一个连接池)给spring管理(单例模式)即可
- 上层service通过@Autowired注入该bean即可使用,每个service里面注入的bean是容器中client的一个引用
- 多个service同时通过注入的引用调用client时,实际上是client里面的多线程分别处理(client对象实例只有一个),连接池有着自己的线程安全和拒绝策略
3.使用demo
注入spring,单例模式
@Configuration
public class ClientConfig {
@Bean
public RestHighLevelClient createClient(){
return new RestHighLevelClient(
RestClient.builder(new HttpHost("xxxxxx", 80, HttpHost.DEFAULT_SCHEME_NAME))
.setRequestConfigCallback( builder->builder.setConnectTimeout(1000)
.setSocketTimeout(40000).setConnectionRequestTimeout(3000) ).setHttpClientConfigCallback(
httpClientBuilder -> httpClientBuilder.setKeepAliveStrategy((httpRequest,httpResponse)-> 50000)
.setDefaultCredentialsProvider(getCredProvider())));
}
private CredentialsProvider getCredProvider(){
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
AuthScope.ANY, new UsernamePasswordCredentials("user", "password"));
return credentialsProvider;
}
}
service层:
@Autowired
private RestHighLevelClient client;
public void searchTest() throws IOException {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
boolQuery.must(QueryBuilders.termQuery("name", "java"));
sourceBuilder.query(boolQuery);
System.out.println("sourceBuilder = " + sourceBuilder.toString());
SearchRequest searchRequest = new SearchRequest();
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
RestStatus status = searchResponse.status();
System.out.println("status = " + status.getStatus());
System.out.println("res = " + JSON.toJSONString(searchResponse));
}