无法将 Java Spring Boot 应用程序连接到 Amazon Keyspaces

问题描述

我正在尝试将我的 java spring boot 应用程序连接到我的 AWS Keyspaces 键空间。 我已经关注亚马逊文档,了解如何使用 DataStax Java Driver for Apache Cassandra (https://docs.aws.amazon.com/keyspaces/latest/devguide/using_java_driver.html) 设置和配置此连接。我还查看了以下内容

  1. Unsupported partitioner with Amazon Keyspaces (for Apache Cassandra)
  2. Connect to AWS keyspaces with Spring reactive data autoconfiguration
  3. https://docs.spring.io/spring-data/cassandra/docs/3.2.0/reference/html/#cassandra.connectors

这是我收到的错误

org.springframework.beans.factory.BeanCreationException:创建名为“cassandraSession”的 bean 在类路径资源 [com/envase/connect/config/CassandraSetup.class] 中定义时出错:调用 init 方法失败;嵌套异常是 com.datastax.oss.driver.api.core.AllNodesFailedException:无法到达任何联系点,请确保您提供了有效地址(显示前 1 个节点,使用 getAllErrors() 获取更多):Node(endPoint= cassandra.us-east-2.amazonaws.com:9142,hostId=null,hashCode=3fcfeaa9): [com.datastax.oss.driver.api.core.DriverTimeoutException: [s5|control|id: 0x19776100,L:/ 192.168.1.105:53683 - R:cassandra.us-east-2.amazonaws.com/3.12.23.181:9142] 协议初始化请求,第 1 步(选项):5000 毫秒后超时] 在 org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.initializeBean(AbstractAutowireCapablebeanfactory.java:1786) ~[spring-beans-5.3.6.jar:5.3.6] 在 org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.doCreateBean(AbstractAutowireCapablebeanfactory.java:602) ~[spring-beans-5.3.6.jar:5.3.6] 在 org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.createBean(AbstractAutowireCapablebeanfactory.java:524) ~[spring-beans-5.3.6.jar:5.3.6] 在 org.springframework.beans.factory.support.Abstractbeanfactory.lambda$doGetBean$0(Abstractbeanfactory.java:335) ~[spring-beans-5.3.6.jar:5.3.6] 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.6.jar:5.3.6] 在 org.springframework.beans.factory.support.Abstractbeanfactory.doGetBean(Abstractbeanfactory.java:333) ~[spring-beans-5.3.6.jar:5.3.6] 在 org.springframework.beans.factory.support.Abstractbeanfactory.getBean(Abstractbeanfactory.java:208) ~[spring-beans-5.3.6.jar:5.3.6] 在 org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.6.jar:5.3.6] 在 org.springframework.beans.factory.support.DefaultListablebeanfactory.doResolveDependency(DefaultListablebeanfactory.java:1380) ~[spring-beans-5.3.6.jar:5.3.6] 在 org.springframework.beans.factory.support.DefaultListablebeanfactory.resolveDependency(DefaultListablebeanfactory.java:1300) ~[spring-beans-5.3.6.jar:5.3.6] 在 org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:887) ~[spring-beans-5.3.6.jar:5.3.6] 在 org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-5.3.6.jar:5.3.6] ... 省略了 25 个常用帧 引起:com.datastax.oss.driver.api.core.AllNodesFailedException:无法到达任何联系点,请确保您提供了有效地址(显示前 1 个节点,使用 getAllErrors() 获取更多):Node(endPoint= cassandra.us-east-2.amazonaws.com:9142,L:/ 192.168.1.105:53683 - R:cassandra.us-east-2.amazonaws.com/3.12.23.181:9142] 协议初始化请求,第 1 步(选项):5000 毫秒后超时] 在 com.datastax.oss.driver.api.core.AllNodesFailedException.copy(AllNodesFailedException.java:141) ~[java-driver-core-4.8.0.jar:na] 在 com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures.getUninterruptably(CompletableFutures.java:149) ~[java-driver-core-4.8.0.jar:na] 在 com.datastax.oss.driver.api.core.session.SessionBuilder.build(SessionBuilder.java:674) ~[java-driver-core-4.8.0.jar:na] 在 org.springframework.data.cassandra.config.CqlSessionfactorybean.buildSystemSession(CqlSessionfactorybean.java:498) ~[spring-data-cassandra-3.1.8.jar:3.1.8] 在 org.springframework.data.cassandra.config.CqlSessionfactorybean.afterPropertiesSet(CqlSessionfactorybean.java:451) ~[spring-data-cassandra-3.1.8.jar:3.1.8] 在 org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.invokeInitMethods(AbstractAutowireCapablebeanfactory.java:1845) ~[spring-beans-5.3.6.jar:5.3.6] 在 org.springframework.beans.factory.support.AbstractAutowireCapablebeanfactory.initializeBean(AbstractAutowireCapablebeanfactory.java:1782) ~[spring-beans-5.3.6.jar:5.3.6] ...省略了36个常用帧 抑制:com.datastax.oss.driver.api.core.DriverTimeoutException: [s5|control|id: 0x19776100,L:/192.168.1.105:53683 - R:cassandra.us-east-2.amazonaws.com/3.12。 23.181:9142] 协议初始化请求,第 1 步(选项):5000 毫秒后超时 在 com.datastax.oss.driver.internal.core.channel.ChannelHandlerRequest.onTimeout(ChannelHandlerRequest.java:108) ~[java-driver-core-4.8.0.jar:na]

它还会一遍又一遍地打印以下警告,直到抛出上述错误

2021-04-27 15:04:48.106 WARN 17664 --- [s4-admin-0] cdodinternal.core.pool.ChannelPool : [s4|/3.12.23.155:9142] 打开新频道时出错( ConnectionInitException: [s4|id: 0x0e9e0986,L:/192.168.1.105:53764 - R:3.12.23.155/3.12.23.155:9142] 协议初始化请求,第 1 步(STARTUP {CQL_VERSION NAME0 driver,DtaxRIVER00对于 Apache Cassandra(R),DRIVER_VERSION=4.8.0,CLIENT_ID=f943143d-48b5-40ce-9d3c-f12123f3d687}):未能发送请求(javax.net.ssl.SSLHandshakeException:没有主题替代名称匹配.1552IP地址找到))

build.gradle:

plugins {
    id 'org.springframework.boot' version '2.4.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.envase.connect'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation group: 'com.datastax.oss',name: 'java-driver-core',version: '4.8.0'
    implementation group: 'com.datastax.oss',name: 'java-driver-query-builder',name: 'java-driver-mapper-runtime',version: '4.8.0'
    implementation group: 'org.springframework.boot',name: 'spring-boot-starter-data-cassandra-reactive',version: '2.4.5'

对于 com.datastax.oss 依赖项,我还尝试了 4.9.0 和 4.11.0 版

应用程序.conf

datastax-java-driver {
     basic.contact-points = ["cassandra.us-east-2.amazonaws.com:9142"]
     advanced.auth-provider {
         class = PlainTextAuthProvider
         username = "******"
         password = "******"
     }
     basic.load-balancing-policy {
         local-datacenter = "us-east-2"
     }
     advanced.connection {
         timeout = 30 seconds
         connect-timeout = 30 seconds
         init-query-timeout = 30 seconds
      }

     advanced.Metadata {
         schema.enabled = "false"
         token-map.enabled = "false"
     }

     advanced.ssl-engine-factory {
         class = DefaultSslEngineFactory
         cipher-suites = [ "TLS_RSA_WITH_AES_128_CBC_SHA","TLS_RSA_WITH_AES_256_CBC_SHA" ]
         truststore-path = "./src/main/resources/cassandra_truststore.jks"
         truststore-password = "****"
     }
 }

cassandra 配置类:

import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.config.DriverConfigLoader;
import com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.cassandra.config.AbstractReactiveCassandraConfiguration;
import org.springframework.data.cassandra.config.SchemaAction;
import org.springframework.data.cassandra.repository.config.EnableReactiveCassandraRepositories;

@Configuration
@EnableReactiveCassandraRepositories
public class CassandraSetup extends AbstractReactiveCassandraConfiguration {


  @Value("${cassandra.contact-points}")
  private String contactPoints;

  @Value("${cassandra.port}")
  private int port;

  @Value("${cassandra.keyspace}")
  private String keyspace;

  @Value("${cassandra.data.local-datacenter}")
  private String dataCenter;

  @Override
  protected String getKeyspaceName() {
    return keyspace;
  }

  @Override
  protected String getContactPoints() {
    return contactPoints;
  }

  @Override
  protected int getPort() {
    return port;
  }

  @Override
  public SchemaAction getSchemaAction() {
    return SchemaAction.NONE;
  }

    @Override
    protected CqlSession getrequiredSession() {
        DriverConfigLoader loader = DriverConfigLoader.fromClasspath("application.conf");
        return CqlSession.builder().withConfigLoader(loader).withLocalDatacenter(dataCenter).build();
    }
}

无论我尝试什么,我都继续遇到相同的错误。任何和所有帮助将不胜感激。

解决方法

问题看起来与您使用的证书有关

这是线索:

my_data <- data.frame( stringsAsFactors = FALSE,ID = c(1L,2L,3L,4L,5L,NA),X = c("1 sandwich 2 hamburger","1 sandwich 4 salad 5 soda 7 soup","0 chicken wings",NA,NA) )

看看这个: Java CertificateException "No subject alternative names matching IP address ... found"