从在 Google Cloud Run 上运行的 Spring Boot 应用程序连接到没有 GCP 启动器的 Cloudsql

Posted

技术标签:

【中文标题】从在 Google Cloud Run 上运行的 Spring Boot 应用程序连接到没有 GCP 启动器的 Cloudsql【英文标题】:Connect from Spring boot app running on Google Cloud Run to a Cloudsql without GCP starter 【发布时间】:2020-02-02 03:30:44 【问题描述】:

我有一个在 Google Cloud Run 上运行的 Spring Boot 应用程序,我想连接到在 Google Cloudsql 上运行的 postgres 实例。我可以使用 Spring Cloud GCP 入门项目进行连接。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-sql-postgresql</artifactId>
</dependency>

但是我不想添加这个依赖。

我能够通过使用 postgressql 插件并在创建云代理后指定 spring.datasource.url=*** 从本地应用程序进行连接。

但是,当我在使用 gcloud beta run deploy --add-cloudsql-instances &lt;INSTANCE-ID&gt; 后尝试从云运行中执行相同操作时,它不起作用。根据https://cloud.google.com/run/docs/configuring/connect-cloudsql,--add-cloudsql-instances会自动创建一个云代理。那么为什么它不起作用呢?

谢谢。

【问题讨论】:

【参考方案1】:

这不起作用,因为 Java 不支持 Unix 域套接字。 Spring Cloud GCP 使用Cloud SQL JDBC Socket Factory 绕过了这一点。

您可以直接使用 Socket Factory,方法是将其添加到您的 pom 中(并按照 README 中的说明更新您的 URL)。

【讨论】:

我已经尝试过这样做,但没有成功。这就是我的 application.properties 在使用 Socket Factory spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.username=$CLOUDSQL_USERNAME spring.datasource.password=$CLOUDSQL_PASSWORD spring.datasource.url=jdbc:postgresql://google/$DB?cloudSqlInstance=$DB_INSTANCE&amp;socketFactory=com.google.cloud.sql.postgres.SocketFactory&amp;user=$CLOUDSQL_USERNAME&amp;password=$CLOUDSQL_PASSWORD 时的样子 是的,这应该是答案,但我也没有让它工作。我正在使用DriverManagerDataSource

以上是关于从在 Google Cloud Run 上运行的 Spring Boot 应用程序连接到没有 GCP 启动器的 Cloudsql的主要内容,如果未能解决你的问题,请参考以下文章

将 env 变量从 Google 的 Secret Manager 加载到在 Google Cloud Run 上运行但未通过 Cloud Build 部署的 Docker 容器中?

Python 线程在 Docker 容器中并行运行,但在容器在 Google Cloud Run 上运行时按顺序运行

输入使用 Google Cloud Run 运行的 docker 容器

如何检查正在运行的 Google Cloud Run 容器的实例数?

Google Cloud Run 一遍又一遍地错误运行

Terraform:Cloud Run 服务上的 Cloud Endpoints?