做家教中介网站赚钱吗?,做网站需要学什么软件,济南营销网站制作公司哪家好,做网站学什么语言好文章目录 依赖初始化客户端发起请求请求参数请求头设置超时时间设置线程数设置用户名密码结果解析节点选择器配置嗅探器整体示例问题参考 OpenSearch开发环境安装Docker和Docker-Compose两种方式 依赖
dependencygroupIdorg.elasticsearch.client/groupId… 文章目录 依赖初始化客户端发起请求请求参数请求头设置超时时间设置线程数设置用户名密码结果解析节点选择器配置嗅探器整体示例问题参考 OpenSearch开发环境安装Docker和Docker-Compose两种方式 依赖
dependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-client/artifactIdversion7.13.4/version !-- 建议就是这个版本 --
/dependency
!-- 或者 --
dependencygroupIdorg.opensearch.client/groupIdartifactIdopensearch-java/artifactIdversion2.8.1/version
/dependency初始化客户端
// 构建客户端
RestClient restClient RestClient.builder(new HttpHost(localhost, 9200, http),new HttpHost(localhost, 9201, http)).build();发起请求
performRequest 是同步请求方法: 将阻塞调用线程并在请求成功时返回响应或在请求失败时引发异常performRequestAsync: 是异步方法接收一个ResponseListener对象作为参数。如果请求成功则该参数使用响应进行调用如果请求失败则使用异常进行调用
// 同步请求Request request new Request(GET,/posts/_search);Response response restClient.performRequest(request); // 执行同步请求response.toString();// 异步请求Request request new Request(GET, /posts/_search);restClient.performRequestAsync(request, new ResponseListener() {Overridepublic void onSuccess(Response response) {log.info(异步请求成功! response.toString());}Overridepublic void onFailure(Exception e) {log.error(异步请求失败!);e.printStackTrace();}});请求参数
// 第一种
request.addParameter(pretty,true);
// 第二种
request.setEntity(new NStringEntity({\json\:\text\},ContentType.APPLICATION_JSON));
// 第三种
request.setJsonEntity({\json\:\text\});请求头
RequestOptions.Builder builder RequestOptions.DEFAULT.toBuilder();builder.addHeader(Authorization, Bearer my-token);builder.setHttpAsyncResponseConsumerFactory(new HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));COMMON_OPTIONS builder.build();
Request request new Request(GET, /);
request.setOptions(COMMON_OPTIONS);设置超时时间 RestClientBuilder builder RestClient.builder(new HttpHost(localhost, 9200, http));builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {Overridepublic RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder builder) {return builder.setConnectTimeout(50000) // 连接超时默认1s .setSocketTimeout(10000); // 套接字超时默认30s.setConnectionRequestTimeout(10000);}});设置线程数
Apache HTTP异常客户端默认启动一个调度程序线程连接管理器使用多个工作线程。 RestClientBuilder builder RestClient.builder(new HttpHost(localhost, 9200)).setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {Overridepublic HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {return httpAsyncClientBuilder.setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(threadNumber).build());}});设置用户名密码
// 创建凭证提供程序设置用户名和密码
final CredentialsProvider credentialsProvider new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(admin, admin));// 使用 RestClient 构建器连接到 OpenSearch
RestClient restClient RestClient.builder(new HttpHost(localhost, 9200, http)).setHttpClientConfigCallback(httpClientBuilder - {// 配置连接超时连接建立后两个节点之间数据传输的套接字超时和连接请求超时// 连接超时客户端和服务器建立连接的最长时间RequestConfig.Builder requestConfigBuilder RequestConfig.custom().setConnectTimeout(5000) // 连接超时为5秒.setSocketTimeout(10000) // 套接字超时为10秒.setConnectionRequestTimeout(10000); // 连接请求超时为10秒httpClientBuilder.setDefaultRequestConfig(requestConfigBuilder.build());// 设置凭证提供程序httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);return httpClientBuilder;}).build();
结果解析 Response response restClient.performRequest(new Request(GET, /));// 已执行请求的信息RequestLine requestLine response.getRequestLine();// Host返回的信息HttpHost httpHost response.getHost();// 响应状态行从中解析状态代码int statusCode response.getStatusLine().getStatusCode();// 响应头可以通过getHeader(string)按名称获取Header[] headers response.getHeaders();String responseBody EntityUtils.toString(response.getEntity());
节点选择器
在默认情况下客户端以轮询的方式将每个请求发送到配置的各个节点中 ES允许用户自由选择要连接的节点通过初始化客户端来配置节点选择器以便筛选节点。该功能在启用嗅探器时可以用来防止HTTP请求只命中专用的主节点。 配置后对于每个请求客户端都通过节点选择器来筛选备选节点。 RestClientBuilder builder RestClient.builder(new HttpHost(localhost,9200,http));builder.setNodeSelector(new NodeSelector(){Overridepublic void select(IterableNode nodes){boolean foundOne false;for(Node node : nodes){String rackId node.getAttributes().get(rack_id).get(0);if(targetId.equals(rackId)){foundOne true;break;}}if(foundOne){IteratorNode nodesIt nodes.iterator();while(nodesIt.hasNext()){Node node nodesIt.next();String rackId node.getAttributes().get(rack_id).get(0);if(targetId.equals(rackId) false){nodesIt.remove();}}}}
配置嗅探器
嗅探器允许自动发现运行中ES集群中的节点并将其设置为现有的RestClient实例 默认i情况下嗅探器使用nodes info API检索属于集群的节点并采用jackson解析获得JSON响应 dependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-client-sniffer/artifactIdversion${elasticsearch.version}/version/dependency创建RestClient实例就可以采用嗅探器与其互联。嗅探器利用RestClient提供的定期机制默认定期时间为5min)从集群中获取当前节点的列表通过调用RestClient类中的setNodes方法来更新。
整体示例
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.client.Request;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.ResponseException;
import org.elasticsearch.client.RestClient;import java.io.IOException;public class OpenSearchExample {public static void main(String[] args) throws IOException {// Connect to OpenSearchfinal CredentialsProvider credentialsProvider new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(admin, admin));RestClient restClient RestClient.builder(new HttpHost(10.12.23.1, 9200, http)).setHttpClientConfigCallback(httpClientBuilder - {RequestConfig.Builder requestConfigBuilder RequestConfig.custom().setConnectTimeout(5000).setSocketTimeout(10000).setConnectionRequestTimeout(10000);httpClientBuilder.setDefaultRequestConfig(requestConfigBuilder.build());httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);return httpClientBuilder;}).build();try {// Delete IndexdeleteIndex(restClient, my_index);// Create IndexcreateIndex(restClient, my_index);// Index DocumentindexDocument(restClient, {\index\:{\_index\:\my_index\,\_id\:1}}\n{ \field\: \value\ }\n);// Get DocumentgetDocument(restClient, my_index);// Delete DocumentdeleteDocument(restClient, my_index, 1);// Delete IndexdeleteIndex(restClient, my_index);} catch (ResponseException e) {e.printStackTrace();// Handle response exceptionSystem.err.println(Error: e.getResponse().getStatusLine().getReasonPhrase());} finally {// Close the clientrestClient.close();}}private static void createIndex(RestClient restClient, String index) throws IOException {// Create Index requestRequest request new Request(PUT, / index);// Execute the requestrestClient.performRequest(request);}private static void indexDocument(RestClient restClient, String s ) throws IOException {// Index Document requestRequest request new Request(POST, /_bulk );request.setJsonEntity(s);// Execute the requestrestClient.performRequest(request);}private static void getDocument(RestClient restClient, String index) throws IOException {// Get Document requestRequest request new Request(GET, / index /_search);// Execute the requestResponse response restClient.performRequest(request);// Handle the responseSystem.out.println(Document found: EntityUtils.toString(response.getEntity()));}private static void deleteDocument(RestClient restClient, String index, String id) throws IOException {// Delete Document requestRequest request new Request(DELETE, / index /_doc/ id);// Execute the requestrestClient.performRequest(request);}private static void deleteIndex(RestClient restClient, String index) throws IOException {// Delete Index requestRequest request new Request(DELETE, / index);// Execute the requestrestClient.performRequest(request);}
}
问题
异常如下
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat java.base/sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:439)at java.base/sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:306)at java.base/sun.security.validator.Validator.validate(Validator.java:264)at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:285)at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:144)at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(CertificateMessage.java:1335)... 19 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetat java.base/sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:146)at java.base/sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:127)解决方案
因为证书问题我们用的是测试环境就不要费劲的去下载私有证书再安装了直接配置opensearch支持http即可。
opensearch.yml
plugins.security.ssl.http.enabled: false或者直接禁用安全插件。
参考
https://www.cnblogs.com/openmind-ink/p/13951767.html