jest连接AWS版本的es

jest怎么连es?

可参考https://blog.csdn.net/mingover/article/details/82941506

情况一,需要有key和secret

这边要连 aws 的es,在使用jest去连es的时候,抛了一个错

Caused by: com.amazonaws.AmazonClientException: Unable to load AWS credentials from any provider in the chain
        at com.amazonaws.auth.AWSCredentialsProviderChain.getCredentials(AWSCredentialsProviderChain.java:117)
        at vc.inreach.aws.request.AWSSigner.getSignedHeaders(AWSSigner.java:104)
        at vc.inreach.aws.request.AWSSigningRequestInterceptor.process(AWSSigningRequestInterceptor.java:32)
        at org.apache.http.protocol.ImmutableHttpProcessor.process(ImmutableHttpProcessor.java:133)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:183)

跟踪后发现是和 AWS_ACCESS_KEY_ID 有关.

https://github.com/awslabs/amazon-kinesis-connectors/issues/42

在这里插入图片描述

在这里插入图片描述

https://www.youtube.com/watch?v=tgb_MRVylWw

export AWS_ACCESS_KEY_ID=…
export AWS_SECRET_ACCESS_KEY=…

情况二,请求的时候es的路径错了,显示localhost:9200

如果用aws,发现会自己去new一个bean,如JestClientFactory ,如果自定义了es的配置,记得做好逻辑.

增加pom配置

在pom中加上配置 (https://github.com/VanRoy/spring-data-jest

        <dependency>
            <groupId>com.github.vanroy</groupId>
            <artifactId>spring-boot-starter-data-jest</artifactId>
            <version>3.0.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>vc.inreach.aws</groupId>
            <artifactId>aws-signing-request-interceptor</artifactId>
            <version>0.0.21</version>
        </dependency>
断点查看

在ElasticsearchRepositoryFactory的L73打断点,如下的栈. 这个 elasticsearchOperations中的client,是 localhost:9200
同时发现,这个elasticsearchOperations并不是我们在config中配置的…

在这里插入图片描述

在这里插入图片描述

打个断点,相应的栈为:
查看里面的对象elasticsearchOperations中的对象,url是localhost:9200

getTargetRepository:73, ElasticsearchRepositoryFactory (org.springframework.data.elasticsearch.repository.support)
getRepository:298, RepositoryFactorySupport (org.springframework.data.repository.core.support)
lambda$afterPropertiesSet$3:287, RepositoryFactoryBeanSupport (org.springframework.data.repository.core.support)
get:-1, 1227859754 (org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport$$Lambda$418)
getNullable:141, Lazy (org.springframework.data.util)
get:63, Lazy (org.springframework.data.util)
afterPropertiesSet:290, RepositoryFactoryBeanSupport (org.springframework.data.repository.core.support)
afterPropertiesSet:67, ElasticsearchRepositoryFactoryBean (org.springframework.data.elasticsearch.repository.support)
invokeInitMethods:1767, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1704, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:581, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:503, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:317, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 696165690 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$117)
getSingleton:222, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:315, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:199, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:251, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1138, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1065, DefaultListableBeanFactory (org.springframework.beans.factory.support)
inject:584, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:91, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessPropertyValues:373, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1350, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:580, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:503, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:317, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 696165690 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$117)
getSingleton:222, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:315, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:199, AbstractBeanFactory (org.springframework.beans.factory.support)
resolveCandidate:251, DependencyDescriptor (org.springframework.beans.factory.config)
doResolveDependency:1138, DefaultListableBeanFactory (org.springframework.beans.factory.support)
resolveDependency:1065, DefaultListableBeanFactory (org.springframework.beans.factory.support)
inject:584, AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement (org.springframework.beans.factory.annotation)
inject:91, InjectionMetadata (org.springframework.beans.factory.annotation)
postProcessPropertyValues:373, AutowiredAnnotationBeanPostProcessor (org.springframework.beans.factory.annotation)
populateBean:1350, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:580, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:503, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
lambda$doGetBean$0:317, AbstractBeanFactory (org.springframework.beans.factory.support)
getObject:-1, 696165690 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$117)
getSingleton:222, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:315, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:199, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:760, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:869, AbstractApplicationContext (org.springframework.context.support)
refresh:550, AbstractApplicationContext (org.springframework.context.support)
refresh:140, ServletWebServerApplicationContext (org.springframework.boot.web.servlet.context)
refresh:759, SpringApplication (org.springframework.boot)
refreshContext:395, SpringApplication (org.springframework.boot)
run:327, SpringApplication (org.springframework.boot)
run:1255, SpringApplication (org.springframework.boot)
run:1243, SpringApplication (org.springframework.boot)
main:18, busiApplication (com.sasa.degaa.busi)
这个localhost:9200是哪里来的?

在类的 JestClientFactory中,我们发现

public JestClient getObject() {

JestHttpClient client = new JestHttpClient();
if (httpClientConfig == null) {
    log.debug("There is no configuration to create http client. Going to create simple client with default values");
    httpClientConfig = new HttpClientConfig.Builder("http://localhost:9200").build();
}
....
为什么httpClientConfig为null?

进一步跟踪,我在自定义的esconfig中发现这段不走依赖?,那这个jestClientFactory对象哪来的?

@Bean
public JestClient jestClient(@Qualifier("jestClientFactory")JestClientFactory jestClientFactory) {
    return jestClientFactory.getObject();
}

我去找了下哪里引用了JestClientFactory,后来
我在 ElasticsearchJestAWSAutoConfiguration类中找到

@Bean
public JestClientFactory jestClientFactory(AWSCredentialsProvider credentialsProvider) {

    final AWSSigner awsSigner = new AWSSigner(credentialsProvider, getRegion(), AWS_SERVICE, CLOCK);

    final AWSSigningRequestInterceptor requestInterceptor = new AWSSigningRequestInterceptor(awsSigner);
    return new JestClientFactory() {
        @Override
        protected HttpClientBuilder configureHttpClient(HttpClientBuilder builder) {
            builder.addInterceptorLast(requestInterceptor);
            return builder;
        }
        @Override
        protected HttpAsyncClientBuilder configureHttpClient(HttpAsyncClientBuilder builder) {
            builder.addInterceptorLast(requestInterceptor);
            return builder;
        }
    };
}

这里有一个bean名字为jestClientFactory的对象。。。。。。。

所以,是ElasticsearchJestAWSAutoConfiguration自己定义了这个bean.

解决办法就是把bean的名字给改了,如改成projectJestClientFactory

@Bean
public JestClient jestClient(@Qualifier("projectJestClientFactory")JestClientFactory jestClientFactory) {
    return jestClientFactory.getObject();
}

当然,相应的依赖也要改!!!

特别提醒

JestElasticsearchTemplate会有一些不支持操作,即会 throw new UnsupportedOperationException();
执行的时候会抛错, 记得处理。

发现spring-boot-starter-data-jest的3.1.5.RELEASE版本
createIndexBuilder.payload(String.valueOf(settings)); 这一行 payload没实现 (搞不懂为什么)
后来换成3.0.0.RELEASE 是OK的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值