Руководство по подключению 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 зависимости:
<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 необходимо решить несколько распространенных проблем с конфигурацией, которые вызывают ошибки сброса соединения. На основе вашей конфигурации и результатов исследования, вот основные проблемы и их решения:
Ошибка сброса соединения обычно возникает из-за проблем с аутентификацией, сетью или конфигурацией. В вашей конфигурации есть несколько областей, которые требуют корректировки для успешного подключения.
Содержание
- Распространенные проблемы конфигурации
- Настройка аутентификации и разрешений
- Сетевая конфигурация
- Конфигурация JDBC URL
- Шаги по устранению неполадок
- Альтернативные методы подключения
Распространенные проблемы конфигурации
Отсутствие включения 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, требуется дополнительная конфигурация:
# Включить аутентификацию через 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:
- Перейдите к вашему экземпляру Cloud SQL
- Перейдите в раздел “Подключения”
- В разделе “Авторизованные сети” добавьте IP-адрес или VPC сеть вашего приложения
- Альтернативно, для производства используйте Private IP или Serverless VPC Access
Правила брандмауэра: Убедитесь, что в вашем GCP проекте есть правила брандмауэра, разрешающие трафик на порту 5432 (порт PostgreSQL по умолчанию).
Конфигурация JDBC URL
Ваш текущий JDBC URL имеет некоторые проблемы. Вот исправленная конфигурация:
# Текущая проблемная конфигурация:
# 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-сокетов):
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:
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 для изоляции проблемы:
# Скачайте и запустите прокси
./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 для лучшего управления подключениями:
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 обрабатывать это автоматически:
# Включить авто-конфигурацию 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 для реактивных приложений: Для лучшей производительности в облачных средах:
<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>
# Конфигурация 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}
Источники
- Spring Boot Starter for Google Cloud SQL - R2DBC Support
- Cloud SQL | Spring Boot on GCP
- Connect a Spring Boot app to Cloud SQL | Google Codelabs
- First Steps With GCP SQL
- Google Cloud SQL — 4 ways (Spring) | Medium
- Bootiful GCP: Relational Data Access with Spring Cloud GCP
- Getting Started with Spring Cloud GCP: Cloud SQL
Заключение
Чтобы решить проблему подключения Spring Boot к Google Cloud PostgreSQL:
- Включите API Cloud SQL в вашем GCP проекте
- Исправьте JDBC URL, используя
jdbc:postgresql://google/databaseвместоjdbc:postgresql:///database - Проверьте разрешения IAM и метод аутентификации
- Используйте Cloud SQL Proxy для тестирования в разработке
- Рассмотрите возможность использования R2DBC для лучшей облачной производительности
- Добавьте правильную конфигурацию пула подключений для предотвращения таймаутов
Ошибка сброса соединения обычно вызвана проблемами с сетевой конфигурацией или неправильными параметрами JDBC URL. Следуя этим шагам и используя исправленную конфигурацию, вы должны установить стабильное соединение между вашим Spring Boot приложением и экземпляром Google Cloud PostgreSQL.