簡體   English   中英

無法將 Java Spring 引導應用程序連接到 Amazon Keyspaces

[英]Unable to connect Java Spring Boot application to Amazon Keyspaces

我正在嘗試將我的 java spring 引導應用程序連接到我的 AWS Keyspaces 密鑰空間。 I've followed amazons docs on how to setup and configure this connection using the DataStax Java Driver for Apache Cassandra ( https://docs.aws.amazon.com/keyspaces/latest/devguide/using_java_driver.html ). 我還查看了以下內容:

  1. 不支持使用 Amazon Keyspaces 的分區程序(對於 Apache Cassandra)
  2. 使用 Spring 反應數據自動配置連接到 AWS 鍵空間
  3. https://docs.spring.io/spring-data/cassandra/docs/3.2.0/reference/html/#cassandra.connectors

這是我收到的錯誤:

org.springframework.beans.factory.BeanCreationException:在 class 路徑資源 [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: [s7610|id:/019] 192.168.1.105:53683-R:Z121C60DF0C03083D2693C2693C251F1F1F15FDFB2Z.US-EAST-2.AMAZONAW STERPRINID OUSTIGTION 5000; .support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786)~[spring-beans-5.3.6.jar:5.3.6] at org.bspringframework stractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602) ~[spring-beans-5.3.6.jar:5.3.6] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring -beans-5.3.6.jar:5.3.6] at 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.36A9D2AC40Z] .AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.6.Z6899 5FCBF432492D15484D04A9D2AC40Z:5.3.6] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.6.jar:5.3.6] at org.springframework.beans. factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.6.jar:5.3.6] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1380 ) ~[spring-beans-5.3.6.jar:5.3.6] at 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.Z93F725 A07423FE1C889F448B33D21F46Z:887) ~[spring-beans-5.3.6.jar:5.3.6] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-5.3.6 .jar:5.3.6]... 25 common frames omitted Caused by: com.datastax.oss.driver.api.core.AllNodesFailedException: Could not reach any contact point, make sure you've provided valid addresses (showing first 1節點,使用 getAllErrors() 獲取更多信息):節點(endPoint=cassandra.us-east-2.amazonaws.com:9142,hostId=null,hashCode=3fcfeaa9):[com.datastax.oss.driver.Z8A5DA52ED126447D359E70C05721AA.core. DriverTimeOutException:[S5 |控制| ID:0x19776100,L:/192.168.1.105:53683-ZE1E1D3D3D3D3D40573127E9EE0480CAF1大約 tep 1 (OPTIONS): timed out after 5000 ms] at com.datastax.oss.driver.api.core.AllNodesFailedException.copy(AllNodesFailedException.java:141) ~[java-driver-core-4.8.0.jar:na ] at com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures.getUninterruptibly(CompletableFutures.java:149) ~[java-driver-core-4.8.0.jar:na] at com.datastax.oss .driver.api.core.session.SessionBuilder.build(SessionBuilder.java:674) ~[java-driver-core-4.8.0.jar:na] at org.springframework.data.cassandra.config.CqlSessionFactoryBean.buildSystemSession( CqlSessionFactoryBean.java:498) ~[彈簧 -data-cassandra-3.1.8.jar:3.1.8] at org.springframework.data.cassandra.config.CqlSessionFactoryBean.afterPropertiesSet(CqlSessionFactoryBean.java:451) ~[spring-data-cassandra-3.1.8.jar: 3.1.8] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845) ~[spring-beans-5.3.6.jar:5.3.6] at org.springframework.beans.factory. support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782) ~[spring-beans-5.3.6.jar:5.3.6]... 36 common frames omitted Suppressed: com.datastax.oss.driver.api.core.DriverTimeoutException : [s5|control|id: 0x19776100, L:/192.168.1.105:53683 - ZE1E1D3D 40573127E9EE0480CAF1283D6Z:cassandra.us-east-2.amazonaws.com/3.12.23.181:9142] Protocol initialization request, step 1 (OPTIONS): timed out after 5000 ms at 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] c.dodinternal.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] Protocol initialization request, step 1 (STARTUP {CQL_VERSION=3.0.0, DRIVER_NAME=DataStax Java driver for Apache Cassandra(R), DRIVER_VERSION=4.8.0, CLIENT_ID=f943143d-48b5-40ce-9d3c-f12123f3d687}): failed to send request (javax.net.ssl.SSLHandshakeException: No subject alternative names matching IP address 3.12.23.155 found) )

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 配置 class:

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();
    }
}

無論我嘗試什么,我都會繼續遇到同樣的錯誤。 任何和所有的幫助將不勝感激。

該問題看起來與您使用的證書有關

這是線索:

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

看看這個: Java CertificateException“沒有與 IP 地址匹配的主題替代名稱......找到”

來自 AWS Keyspaces 的錯誤消息會誤導超時。 真正的問題是驅動程序的 ssl-engine-factory 配置為默認值 - 無。 請參閱: https://docs.datastax.com/en/developer/java-driver/4.13/manual/core/ssl/

當使用 spring 配置AbstractReactiveCassandraConfiguration時, datastax 配置標准行為被覆蓋並且不起作用。

AbstractSessionConfiguration class(由AbstractReactiveCassandraConfiguration擴展)中的方法getSessionBuilderConfigurerWrapper僅將驅動程序類型安全配置定義為 defaultOverrides(它們是系統屬性)和 defaultReference(它是“reference.conf”)。

因此,為了應用您的配置,您應該覆蓋AbstractSessionConfiguration class 中的getDriverConfigurationResource並將其作為Resource返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM