Другое

Руководство по подключению Spring Boot к Google Cloud PostgreSQL

Полное руководство по устранению ошибок подключения Spring Boot к Google Cloud PostgreSQL. Узнайте, как настроить JDBC URL, аутентификацию и сетевые параметры для успешного подключения к базе данных.

Как подключить приложение Spring Boot к экземпляру Google Cloud PostgreSQL? Я мигрирую сервис с Go на Spring Boot и следую официальному руководству GCP. Я настроил зависимости в pom.xml и установил application.properties с необходимыми настройками GCP, но получаю ошибку подключения: ‘Попытка подключения не удалась’ с ‘java.net.SocketException: Connection reset’. Вот моя конфигурация:

pom.xml зависимости:

xml
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>spring-cloud-gcp-dependencies</artifactId>
            <version>4.1.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    ...
    <!-- Database Driver -->
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
    </dependency>
    <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>spring-cloud-gcp-starter-sql-postgresql</artifactId>
    </dependency>

application.properties:

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.sql.init.mode=always
# GCP settings
gcp.project=project_id
gcp.project.region=project_region
gcp.postgres.instance=postgres_instance_id
gcp.postgres.database=database_name
# PostgreSQL connection
spring.cloud.gcp.project-id=${gcp.project}
spring.cloud.gcp.sql.instance-connection-name=${gcp.project}:${gcp.project.region}:${gcp.postgres.instance}
spring.cloud.gcp.sql.database-name=${gcp.postgres.database}

spring.datasource.url=jdbc:postgresql:///${gcp.postgres.database}?cloudSqlInstance=${gcp.project}:${gcp.project.region}:${gcp.postgres.instance}&socketFactory=com.google.cloud.sql.postgres.SocketFactory
spring.datasource.username=db_user
spring.datasource.password=db_pass

Что я делаю неправильно в своей конфигурации Spring Boot для подключения к Google Cloud PostgreSQL?

Подключение Spring Boot приложения к Google Cloud PostgreSQL

Для подключения вашего Spring Boot приложения к Google Cloud PostgreSQL необходимо решить несколько распространенных проблем с конфигурацией, которые вызывают ошибки сброса соединения. На основе вашей конфигурации и результатов исследования, вот основные проблемы и их решения:

Ошибка сброса соединения обычно возникает из-за проблем с аутентификацией, сетью или конфигурацией. В вашей конфигурации есть несколько областей, которые требуют корректировки для успешного подключения.

Содержание

Распространенные проблемы конфигурации

Отсутствие включения API Cloud SQL: Сначала необходимо включить API Cloud SQL в вашем GCP проекте. Согласно официальной документации Spring Cloud GCP, “API Google Cloud SQL должен быть включен в вашем GCP проекте. Для этого перейдите на страницу библиотек API в консоли Google Cloud, найдите ‘Cloud SQL API’ и включите опцию с названием ‘Cloud SQL’.”

Неверная версия Spring Cloud GCP: Вы используете версию 4.1.0, но она может быть устаревшей. Проверьте наличие последней стабильной версии в документации Spring Cloud GCP, так как более новые версии имеют лучшую поддержку PostgreSQL и исправления ошибок.

Проблемы с методом аутентификации: Ваша конфигурация может использовать несовместимый метод аутентификации. Как отмечено в исследовании, “похоже, вы используете аутентификацию caching_sha2_password, которая в настоящее время не поддерживается через Proxy с Unix-сокетами”. Убедитесь, что ваш экземпляр Cloud SQL использует метод аутентификации PostgreSQL по умолчанию.

Настройка аутентификации и разрешений

Конфигурация сервисного аккаунта: Вашему Spring Boot приложению требуются соответствующие разрешения IAM. Убедитесь, что у сервисного аккаунта есть роль “Cloud SQL Client” или хотя бы разрешение “roles/cloudsql.client”.

Аутентификация через IAM базы данных: Если вы хотите использовать аутентификацию через IAM, требуется дополнительная конфигурация:

properties
# Включить аутентификацию через IAM
spring.cloud.gcp.sql.enable-iam-auth=true

# Установить имя пользователя как email сервисного аккаунта IAM
spring.datasource.username=${IAM_SERVICE_ACCOUNT_EMAIL}
spring.datasource.password=""  # Пустой пароль для аутентификации через IAM

Разрешения пользователя базы данных: Убедитесь, что у пользователя базы данных есть необходимые разрешения. Согласно исследованию, вам нужно предоставить разрешения такие как: GRANT ALL ON database_name TO 'username'@'%';

Сетевая конфигурация

Настройки VPC сети: Ваш экземпляр Cloud SQL должен быть настроен на разрешение подключений из сети вашего приложения. В консоли Google Cloud:

  1. Перейдите к вашему экземпляру Cloud SQL
  2. Перейдите в раздел “Подключения”
  3. В разделе “Авторизованные сети” добавьте IP-адрес или VPC сеть вашего приложения
  4. Альтернативно, для производства используйте Private IP или Serverless VPC Access

Правила брандмауэра: Убедитесь, что в вашем GCP проекте есть правила брандмауэра, разрешающие трафик на порту 5432 (порт PostgreSQL по умолчанию).

Конфигурация JDBC URL

Ваш текущий JDBC URL имеет некоторые проблемы. Вот исправленная конфигурация:

properties
# Текущая проблемная конфигурация:
# spring.datasource.url=jdbc:postgresql:///${gcp.postgres.database}?cloudSqlInstance=${gcp.project}:${gcp.project.region}:${gcp.postgres.instance}&socketFactory=com.google.cloud.sql.postgres.SocketFactory

# Исправленная конфигурация:
spring.datasource.url=jdbc:postgresql://google/${gcp.postgres.database}?cloudSqlInstance=${gcp.project}:${gcp.project.region}:${gcp.postgres.instance}&socketFactory=com.google.cloud.sql.postgres.SocketFactory&sslmode=require

Ключевые исправления:

  • Изменено с :/// на ://google/ - ключевое слово “google” обязательно для Google Cloud SQL
  • Добавлен параметр &sslmode=require для безопасных подключений

Альтернативный формат URL (при использовании Unix-сокетов):

properties
spring.datasource.url=jdbc:postgresql:///${gcp.postgres.database}?unixSocketPath=/cloudsql/${gcp.project}:${gcp.project.region}:${gcp.postgres.instance}&socketFactory=com.google.cloud.sql.postgres.SocketFactory&sslmode=require

Шаги по устранению неполадок

1. Включить отладочное логирование Cloud SQL:

properties
logging.level.com.google.cloud.sql=DEBUG
logging.level.org.postgresql=DEBUG

2. Проверить имя подключения экземпляра: Убедитесь, что ${gcp.project}:${gcp.project.region}:${gcp.postgres.instance} точно соответствует формату имени подключения вашего экземпляра Cloud SQL.

3. Проверить подключение с помощью Cloud SQL Proxy: Для разработки используйте Cloud SQL Proxy для изоляции проблемы:

bash
# Скачайте и запустите прокси
./cloud_sql_proxy -instances=${gcp.project}:${gcp.project.region}:${gcp.postgres.instance}=tcp:5432

# Затем протестируйте с упрощенным URL:
spring.datasource.url=jdbc:postgresql://localhost:5432/${gcp.postgres.database}

4. Проверить наличие конфликтов версий: Убедитесь, что у вас нет конфликтующих версий драйвера PostgreSQL. Согласно исследованию, “Ошибки вроде c.g.cloud.sql.core.SslSocketFactory : Re-throwing cached exception due to attempt to refresh instance information too soon after error” могут возникать при несоответствии версий.

5. Конфигурация пула подключений: Добавьте конфигурацию HikariCP для лучшего управления подключениями:

properties
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.connection-timeout=20000
spring.datasource.hikari.connection-test-query=SELECT 1

Альтернативные методы подключения

Использование авто-конфигурации Spring Cloud GCP: Вместо ручной конфигурации JDBC URL, позвольте Spring Cloud GCP обрабатывать это автоматически:

properties
# Включить авто-конфигурацию Spring Cloud GCP
spring.cloud.gcp.sql.enabled=true
spring.cloud.gcp.sql.jdbc.enabled=true

# Базовые настройки GCP
spring.cloud.gcp.project-id=${gcp.project}
spring.cloud.gcp.sql.instance-connection-name=${gcp.project}:${gcp.project.region}:${gcp.postgres.instance}
spring.cloud.gcp.sql.database-name=${gcp.postgres.database}

# Позволить Spring Boot авто-сконфигурировать источник данных
spring.datasource.url=jdbc:postgresql://google/${gcp.postgres.database}

Использование R2DBC для реактивных приложений: Для лучшей производительности в облачных средах:

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-r2dbc</artifactId>
</dependency>
properties
# Конфигурация R2DBC
spring.r2dbc.url=r2dbc:postgresql://google/${gcp.postgres.database}?cloudSqlInstance=${gcp.project}:${gcp.project.region}:${gcp.postgres.instance}
spring.r2dbc.username=${db_user}
spring.r2dbc.password=${db_pass}

Источники

  1. Spring Boot Starter for Google Cloud SQL - R2DBC Support
  2. Cloud SQL | Spring Boot on GCP
  3. Connect a Spring Boot app to Cloud SQL | Google Codelabs
  4. First Steps With GCP SQL
  5. Google Cloud SQL — 4 ways (Spring) | Medium
  6. Bootiful GCP: Relational Data Access with Spring Cloud GCP
  7. Getting Started with Spring Cloud GCP: Cloud SQL

Заключение

Чтобы решить проблему подключения Spring Boot к Google Cloud PostgreSQL:

  1. Включите API Cloud SQL в вашем GCP проекте
  2. Исправьте JDBC URL, используя jdbc:postgresql://google/database вместо jdbc:postgresql:///database
  3. Проверьте разрешения IAM и метод аутентификации
  4. Используйте Cloud SQL Proxy для тестирования в разработке
  5. Рассмотрите возможность использования R2DBC для лучшей облачной производительности
  6. Добавьте правильную конфигурацию пула подключений для предотвращения таймаутов

Ошибка сброса соединения обычно вызвана проблемами с сетевой конфигурацией или неправильными параметрами JDBC URL. Следуя этим шагам и используя исправленную конфигурацию, вы должны установить стабильное соединение между вашим Spring Boot приложением и экземпляром Google Cloud PostgreSQL.

Авторы
Проверено модерацией
Модерация