从我所做的研究来看,这两者似乎不能一起工作,因为 HTTP 只支持 Amazon Elasticsearch。
希望有人能澄清一下,Spring Data Elasticsearch 是否无法做到这一点。
从我所做的研究来看,这两者似乎不能一起工作,因为 HTTP 只支持 Amazon Elasticsearch。
希望有人能澄清一下,Spring Data Elasticsearch 是否无法做到这一点。
看起来 3.2.0 版的 Spring 数据弹性搜索适用于 http rest 客户端,因此可以通过 Rest API 和端口 443 连接到 aws 弹性实例。不知何故,他们将 spring-data-jest 方法集成到 spring 数据中。我使用 RestHighLevelClient:
@Bean
public RestHighLevelClient client() {
return new RestHighLevelClient(RestClient.builder(HttpHost.create(awsUrl)));
}
awsUrl 格式为:https ://some_aws_generated_address.us-east-n.es.amazonaws.com:443
注意:如果您使用带有默认 bom.xml 的 spring boot,则需要将 spring boot 升级到 2.2.1.RELEASE 或更高版本
来自不同的讨论:
- Spring data ES 和 searchly
-传输协议的端口
以及关于 ES 服务限制的 AWS 文档;转到底部,最后一行说:
该服务支持端口 80 上的 HTTP,但不支持 TCP 传输。
尚无法使用使用 Java API 的 Spring Data ES,以及只能通过 REST 获得的 Amazon 服务。
有一个很好的项目提供了 Spring Data ES 的 Jest 实现,它与 AWS 托管的 ES 服务一起使用。
可以将 Spring Data Elasticsearch 与 Amazon Elasticsearch 一起使用
摘自 Spring-data 弹性搜索文档
TransportClient 自 Elasticsearch 7 起已弃用,并将在 Elasticsearch 8 中删除。这有利于 Java High Level REST Client。只要在 Elasticsearch 中可用,Spring Data Elasticsearch 就会支持 TransportClient。
Java High Level REST Client 现在是 Elasticsearch 的默认客户端,它提供了对 TransportClient 的直接替代,因为它接受并返回完全相同的请求/响应对象,因此依赖于 Elasticsearch 核心项目
Spring Data ElasticSearch已经根据ElasticSearch的最新标准进行了精简,因此spring-data-elasticsearch:3.2.X
它提供了一种灵活的方式来实现自定义RestHighLevelClient
。(链接) 即使可以使用基于 HTTP 的弹性搜索 API 调用,无论是否有身份验证,它都无法解决与 AWS 弹性搜索 API 调用相关的问题。
因为任何对AWS 服务或 APIGW 支持的服务的HTTP 请求都必须遵循,最终将身份验证信息添加到由 HTTP 发送的 AWS 请求中。为了安全起见,大多数对 AWS 的请求都必须使用访问密钥进行签名,该密钥由和组成。因此,我们在调用 AWS ElasticSearch 服务时必须遵循标准。"Signature Version 4 Signing Process(SigV4)"
accesskey ID
secret access key
让我们动手编写代码并深入研究实现
请按照以下步骤操作:
第 1 步:添加所需的依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-elasticsearch</artifactId>
<version>1.11.346</version>
</dependency>
步骤 2:添加 AWS CredentialsProvider
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AWSCredentialsConfiguration {
@Value("${aws.es.accessKey}")
private String esAccessKey = null;
@Value("${aws.es.secretKey}")
private String esSecretKey = null;
@Bean
public AWSStaticCredentialsProvider awsDynamoCredentialsProviderDevelopment() {
return new AWSStaticCredentialsProvider(new BasicAWSCredentials(
esAccessKey, esSecretKey));
}
}
或者,如果您的应用程序在 AWS 实例上运行并且您不想使用属性驱动/硬编码的 AccessKey 和 SecretKey,那么您必须将IAM 角色分配给您的Amazon ECS 任务 以获得更多信息。
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AWSCredentialsConfiguration {
@Bean
public AWSCredentialsProvider amazonAWSCredentialsProvider() {
return new EC2ContainerCredentialsProviderWrapper();
}
}
第 3 步:添加 ElasticSearchRestClientConfiguration
**RestHighLevelClient**
抽象方法的自定义实现**AbstractElasticsearchConfiguration#elasticsearchClient()**
。这样,我们将合并的 customRestHighLevelClient "elasticsearchOperations"
bean"elasticsearchTemplate"
注入到 spring 容器中。HttpRequestInterceptor
是另一个需要注意的重要事项。特别感谢AWSRequestSigningApacheInterceptor.java提供的示例实现,AWSLabs
帮助我们通过AWS4Signer
机制将拦截器添加到 RestClient。@EnableElasticsearchRepositories
注释有助于启用弹性搜索数据存储库。import com.amazonaws.auth.AWS4Signer;
import com.amazonaws.auth.AWSCredentialsProvider;
import org.apache.http.HttpHost;
import org.apache.http.HttpRequestInterceptor;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.demo.aws.elasticsearch.data.repository")
public class ElasticSearchRestClientConfiguration extends AbstractElasticsearchConfiguration {
@Value("${aws.es.endpoint}")
private String endpoint = null;
@Value("${aws.es.region}")
private String region = null;
@Autowired
private AWSCredentialsProvider credentialsProvider = null;
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
AWS4Signer signer = new AWS4Signer();
String serviceName = "es";
signer.setServiceName(serviceName);
signer.setRegionName(region);
HttpRequestInterceptor interceptor = new AWSRequestSigningApacheInterceptor(serviceName, signer, credentialsProvider);
return new RestHighLevelClient(RestClient.builder(HttpHost.create(endpoint)).setHttpClientConfigCallback(e -> e.addInterceptorLast(interceptor)));
}
}
布拉沃祖鲁!而已。我们已经完成了配置部分。现在有了这个解决方案,您可以利用 spring-data 弹性优势以及 Amazon 弹性搜索服务。完整的解决方案已记录在Medium Post
如果有任何与访问索引的权限相关的问题(例如:刷新),您可以使用答案添加权限
Error creating bean with name 'supplierContacts' defined in file ... Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'supplierContactListDaoImpl' defined in file [SupplierContactListDaoImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'supplierContactListRepository': Cannot resolve reference to bean 'elasticsearchTemplate' while setting bean property 'elasticsearchOperations'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'elasticsearchOperations' defined in class path resource [ElasticSearchConfig.class]: Unsatisfied dependency expressed through method 'elasticsearchOperations' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'elasticsearchEntityMapper' defined in class path resource [ElasticSearchConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter]: Factory method 'elasticsearchEntityMapper' threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/data/mapping/model/EntityInstantiators