簡體   English   中英

Google Cloud Platform - Cloud SQL 上 MySQL 的 Spring Boot 應用程序連接問題

[英]Google Cloud Platform - Spring Boot application connection issues with MySQL on Cloud SQL

所以,我有一個最小的 Spring Boot 應用程序,它應該連接到 GCP-Cloud SQL 上的 MySQL 數據庫。

當我在本地 Google App Engine 上運行我的應用程序時,它設法連接到 GCP 上托管的遠程 MySQL 數據庫。 當我在 GAE 標准上部署完全相同的應用程序時,該應用程序(顯然在 GCP 上成功部署)無法連接到 MySQL 數據庫。

這正是我的 application.properties 文件的樣子:

文本

查看 GCP 日志記錄部分,我看到以下嚴重錯誤:

Uncaught exception from servlet\njava.lang.RuntimeException:
org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'userRepository' defined in com.winery.backend.services.UserRepository 
defined in @EnableJpaRepositories declared onJpaRepositoriesRegistrar.
EnableJpaRepositoriesConfiguration: Cannot resolve reference to bean 'jpaMappingContext' 
while setting bean property 'mappingContext'; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext':

等等幾千行。 userRepository 恰好是我的自定義 @Repository 注釋界面。 同樣,它就像從本地到雲的魅力。

我看到有一些類似的線程,但實際上沒有一個提供有效的解決方案。

當您嘗試使用 Cloud SQL 的公共 IP 地址進行連接時,您需要確定應用程序的公共 IP 並授權其連接到您的實例。 這不適用於 App Engine,因為它不提供靜態 IP 地址。

最佳做法是使用 Cloud SQL 連接器並將此依賴項包含在 pom.xml 中:

<dependency>
    <groupId>com.google.cloud.sql</groupId>
    <artifactId>mysql-socket-factory-connector-j-8</artifactId>
    <version>1.1.0</version>
</dependency>

然后像這樣創建一個 JDBC URL:

jdbc:mysql:///<DATABASE_NAME>?cloudSqlInstance=<INSTANCE_CONNECTION_NAME>&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=<MYSQL_USER_NAME>&password=<MYSQL_USER_PASSWORD>

在 GCP 控制台中查看 Cloud SQL 上的實例連接名稱。 格式應為“project-id:region:instance-name”。

您還可以通過創建連接池來改進這一點:


private static final String CLOUD_SQL_CONNECTION_NAME = System.getenv("CLOUD_SQL_CONNECTION_NAME");
private static final String DB_USER = System.getenv("DB_USER");
private static final String DB_PASS = System.getenv("DB_PASS");
private static final String DB_NAME = System.getenv("DB_NAME");

private DataSource createConnectionPool() {
    HikariConfig config = new HikariConfig();

    config.setJdbcUrl(String.format("jdbc:mysql:///%s", DB_NAME));
    config.setUsername(DB_USER); // e.g. "root", "postgres"
    config.setPassword(DB_PASS); // e.g. "my-password"
    config.addDataSourceProperty("socketFactory", "com.google.cloud.sql.mysql.SocketFactory");
    config.addDataSourceProperty("cloudSqlInstance", CLOUD_SQL_CONNECTION_NAME);
    DataSource pool = new HikariDataSource(config);
    return pool;
  }

要查看完整上下文, 請參閱本指南

也許是范圍,如果(數據庫和應用程序)都在同一主機中,則可能無法通過 https 連接,因為無法解析主機。

是否在同一個主機/公共 IP 中?

如果您使用的是碼頭工人:

  • 嘗試使用替代配置文件 application-gcp.yml() 將 public_ip 替換為 docker 服務名稱(並確保創建網絡類型橋接器)

如果你不是:

  • 嘗試使用 localhost 而不是公共 IP

暫無
暫無

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

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