【问题标题】:Unable to connect Java Spring Boot application to Amazon Keyspaces无法将 Java Spring Boot 应用程序连接到 Amazon Keyspaces
【发布时间】:2021-07-21 05:13:02
【问题描述】:

我正在尝试将我的 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:在类路径资源 [com/envase/connect/config/CassandraSetup.class] 中定义名称为“cassandraSession”的 bean 创建错误:调用 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, 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 毫秒后超时] 在 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.getUninterruptibly(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=3.0.0, DRIVER_NAME=DataStax Java 驱动程序对于 Apache Cassandra(R),DRIVER_VERSION=4.8.0,CLIENT_ID=f943143d-48b5-40ce-9d3c-f12123f3d687}):发送请求失败(javax.net.ssl.SSLHandshakeException:没有主题替代名称匹配 IP 地址 3.12.23.155找到))

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', version: '4.8.0'
    implementation group: 'com.datastax.oss', 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();
    }
}

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

【问题讨论】:

  • 您的问题找到解决方案了吗?
  • 我没有。我们的团队最终离开了 KeySpaces

标签: java spring-boot spring-data-cassandra amazon-keyspaces


【解决方案1】:

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

这是线索:

"javax.net.ssl.SSLHandshakeException: No subject alternative names matching IP address 3.12.23.15"

检查一下: Java CertificateException "No subject alternative names matching IP address ... found"

【讨论】:

    【解决方案2】:

    来自 AWS Keyspaces 的错误消息会误导超时。真正的问题是驱动程序的 ssl-engine-factory 配置为默认值 - 无。 见:https://docs.datastax.com/en/developer/java-driver/4.13/manual/core/ssl/

    当使用弹簧配置AbstractReactiveCassandraConfiguration 时,datastax configuration standard behavior 被覆盖并且不起作用。

    AbstractSessionConfiguration 类(由 AbstractReactiveCassandraConfiguration 扩展)中的方法 getSessionBuilderConfigurerWrapper 仅将驱动程序类型安全配置定义为 defaultOverrides(它们是系统属性)和 defaultReference( 是“reference.conf”)。

    因此,为了应用您的配置,您应该覆盖 AbstractSessionConfiguration 类中的 getDriverConfigurationResource 并将其返回为 Resource

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 2018-05-22
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 2020-03-22
      • 2020-06-16
      相关资源
      最近更新 更多