首页 > 解决方案 > 谷歌云代理 r2dbc mysql 驱动程序在谷歌上连接 mysql 一段时间后遇到关闭的连接与错误的证书

问题描述

我正在为 MySql 编写一个带有 spring webflux 和 google r2dbc cloud sql 代理连接器的 POC。在我进行长时间的压力测试之前,一切都很顺利。大约 40 分钟左右后,由于证书错误,我不断关闭连接,因为我在连接 url 中有 useSSL=true。

即使我使用了 useSSL=false,我也遇到了这个问题。

这是我的设置:

在 Gradle 中指定对 spring boot 2.4.0 的依赖:

implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.boot:spring-boot-starter-jetty'
implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive'
implementation 'com.google.cloud.sql:cloud-sql-connector-r2dbc-mysql:1.2.0'
implementation 'org.springframework:spring-aspects:5.2.8.RELEASE'
implementation 'com.zoominfo:secretutil:1.0.2'

runtimeOnly 'dev.miku:r2dbc-mysql:0.8.2.RELEASE'
runtimeOnly 'mysql:mysql-connector-java:8.0.22'

在 mySQL 配置中:

@Configuration
@EnableR2dbcRepositories(basePackages = { "com.myorg.repo" })
public class MySQLConfig {

    @Bean
    @Primary
    public ConnectionPool connectionPool() {
        String r2dbcURL = String.format("r2dbc:gcp:mysql://%s:%s@%s/%s?useSSL=true",
            "username",
            "password",
            "project name:us-east1:host name",
            "database name");

        ConnectionFactory connectionFactory = ConnectionFactories.get(r2dbcURL);

        ConnectionPoolConfiguration configuration = 
            ConnectionPoolConfiguration.builder(connectionFactory)
                    .maxIdleTime(Duration.ofSeconds(60))
                    .maxLifeTime(Duration.ofSeconds(300))
                    .initialSize(10)
                    .maxSize(20)
                    .maxCreateConnectionTime(Duration.ofSeconds(5))
                    .validationQuery("SELECT 1")
                    .build();
        return new ConnectionPool(configuration);
    }
} 

大约 60 分钟后:

2020-12-16 14:46:28.149  WARN 93687 --- [ctor-tcp-nio-10] reactor.netty.channel.FluxReceive        : [id: 0xedad2630, L:0.0.0.0/0.0.0.0:58027] An exception has been observed post termination, use DEBUG level to see the full stack: io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
2020-12-16 14:46:28.149  WARN 93687 --- [ctor-tcp-nio-10] d.m.r.mysql.client.ReactorNettyClient    : Connection has been closed by peer
2020-12-16 14:46:28.149 ERROR 93687 --- [ctor-tcp-nio-10] reactor.core.publisher.Operators         : Operator called default onErrorDropped

dev.miku.r2dbc.mysql.client.MySqlConnectionClosedException: Connection unexpectedly closed
    at dev.miku.r2dbc.mysql.client.ClientExceptions.unexpectedClosed(ClientExceptions.java:32) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]

...
2020-12-16 14:46:28.150 ERROR 93687 --- [ctor-tcp-nio-10] d.m.r.mysql.client.ReactorNettyClient    : Error: Received fatal alert: bad_certificate

javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131) ~[na:na]
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117) ~[na:na]
...
2020-12-16 14:46:28.150 ERROR 93687 --- [ctor-tcp-nio-10] reactor.core.publisher.Operators         : Operator called default onErrorDropped
...
dev.miku.r2dbc.mysql.client.MySqlConnectionClosedException: Connection closed
    at dev.miku.r2dbc.mysql.client.ClientExceptions.expectedClosed(ClientExceptions.java:36) ~[r2dbc-mysql-0.8.2.RELEASE.jar:0.8.2.RELEASE]

标签: mysqlgoogle-cloud-sqlr2dbc

解决方案


推荐阅读