首页 > 解决方案 > 我无法通过 sql auth 代理在 GCP 中通过 springboot 应用程序从 cloudrun 连接到 cloud sql。有人有一步一步的例子吗?

问题描述

我可以使用 sql auth 代理从本地机器配置连接,但我不能从使用 hikaricp 的云运行 springboot 应用程序到使用 unix socket 的具有公共 ip 的云 sql。有人有完整的例子吗?我在 gcp doc 中读到,我不需要为从云运行到云 sql 的连接创建一个用于 sql auth 代理的 docker。它是在您在云运行的配置中定义 db 连接时创建的。

POM.xml 添加以下依赖项:

    <dependency>
        <groupId>com.google.cloud.sql</groupId>
        <artifactId>mysql-socket-factory</artifactId>
        <version>1.3.0</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

我设置了它,然后我在应用程序中定义了以下应用程序属性(通过经典 jdbc 可以正常工作,在云 sql 中添加我的 ip 以允许连接,但我需要通过 unix 套接字使用 sql auth 代理以避免添加 vpc,我不会解释对于 hikariCP 来说,推理太长太无聊):

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql:///DBSCHEMA
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.socketFactory=com.google.cloud.sql.mysql.SocketFactory
spring.datasource.cloudSqlInstance=GCP_PROJECT:GCP_REGION:DBNAME
spring.datasource.ipTypes=PUBLIC

logging.level.com.zaxxer.hikari=TRACE

有人可以帮我举一些可以正常工作的例子吗?如果在您的示例中为 sql auth 代理创建了 docker,请解释一下。在互联网上,我找不到明确谈论此配置的资源。

非常感谢。

标签: spring-bootgoogle-cloud-runhikaricpcloud-sql-proxy

解决方案


解决方案:

  1. 为服务帐户典型名称创建 json 键:

    GCP_PROJECT_ID-GCP_ID_SERVICE_ACCOUNT-compute_developer_gserviceaccount_com

    并将 json 密钥文件保存在您拥有的资产目录中(在 java 项目的根目录下) entrypoint.sh

  2. 在 DockerFile 中为 json 服务帐户密钥添加行:

    运行导出 GOOGLE_APPLICATION_CREDENTIALS=assets/GCP_PROJECT_ID-GCP_ID_SERVICE_ACCOUNT-compute_developer_gserviceaccount_com-GCP_KEY.json

  3. pom.xml 添加如下:

用于 sql auth 代理 unix socket

<dependency>
    <groupId>com.google.cloud.sql</groupId>
    <artifactId>mysql-socket-factory</artifactId>
    <version>1.3.0</version>
</dependency>
<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.32.1</version>
</dependency>

连接器mysql:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
  1. 在 application.properties 或 application-test.properties 中(如果您使用 spring profile 部署在 TEST GCP 云运行中):

    spring.datasource.url=jdbc:mysql://google/DB_SCHEMA?cloudSqlInstance=GCP_PROJECT_ID:GCP_REGION:DB_ISTANCE&socketFactory=com.google.cloud.sql.mysql.SocketFactory&useSSL=false

    spring.datasource.username=*****

    spring.datasource.password=*****

  2. 部署解决方案

我将使用 gitlab 变量并传递 url、用户名和密码,但这是其他工作......

注意: com.google.cloud.sql.mysql.SocketFactory 告诉使用 unix 套接字!Cloud Run 在启动时启动 sql auth proxy,如果在连接部分设置数据库中的云运行配置中(如果在同一个项目中,如果在其他项目中,您将看到一个下拉列表,如果在其他项目中,您将手动添加 GCP_PROJECT:GCP_REGION:DB)。您可以定义多个要连接的数据库,但这是另一项工作;)


推荐阅读