如何将GCP Cloud Run Java Spring连接到Cloud SQL SQL Server

时间:2020-05-15 01:41:53

标签: sql-server spring-boot google-cloud-platform google-cloud-sql google-cloud-run

我有一个小问题,我想将Java Spring App部署到Cloud RUN并从CLOUD SQL SQL SERVER建立连接,我知道可以通过unix套接字连接MySQL和Postgresql(https://cloud.google.com/sql/docs/mysql/connect-run?hl=es-419),但对于SQL Server没有驱动程序。

另一种方法是连接以代理方式(https://medium.com/@petomalina/connecting-to-cloud-sql-from-cloud-run-dcff2e20152a) 我尝试过,但是我却做不到,即使在部署脚本时,它也告诉我正在侦听实例ID的127.0.0.1,但是尝试连接时却听不到。

这是我的docker文件

# Use the official maven/Java 8 image to create a build artifact.
# https://hub.docker.com/_/maven
FROM maven:3.5-jdk-8-alpine as builder

# Copy local code to the container image.
WORKDIR /app
COPY pom.xml .
COPY src ./src
COPY ohJpo-2.1.0.jar .

# download the cloudsql proxy binary
# RUN wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O ./build/cloud_sql_proxy
# RUN chmod +x ./build/cloud_sql_proxy

COPY cloud_sql_proxy /build/cloud_sql_proxy
RUN chmod +x /build/cloud_sql_proxy

# copy the wrapper script and credentials
COPY run.sh /build/run.sh
COPY credentials.json /build/credentials.json

# Build a release artifact.
RUN mvn install:install-file -Dfile=/app/ohJpo-2.1.0.jar -DgroupId=ovenfo -DartifactId=ohJpo -Dversion=2.1.0 -Dpackaging=jar
RUN mvn package -DskipTests


# Use AdoptOpenJDK for base image.
# It's important to use OpenJDK 8u191 or above that has container support enabled.
# https://hub.docker.com/r/adoptopenjdk/openjdk8
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM adoptopenjdk/openjdk8:jdk8u202-b08-alpine-slim



RUN /build/cloud_sql_proxy -instances=idInstanceID=tcp:1433 -credential_file=/build/credentials.json & sleep 10

COPY --from=builder /app/target/helloworld-*.jar /helloworld.jar

# Run the web service on container startup.
CMD ["java","-Djava.security.egd=file:/dev/./urandom","-Dserver.port=${PORT}","-jar","/helloworld.jar"]

我的Java应用程序具有这种连接方式,可以在本地PC中找到具有机密性的代理

            @GetMapping("/pruebacuatro")
        String pruebacuatro() {

            Map<String, String> config = new HashMap<String, String>();

            config.put("type", "SQLSERVER");
            config.put("url", "127.0.0.1");
            config.put("db", "bd");
            config.put("username", "user");
            config.put("password", "pass");

            Object data = null;
            Jpo miJpo = null;
            try {
                miJpo = new Jpo(config);
                Procedure store = miJpo.procedure("seg.menu_configuraciones");
                data = store.ejecutar();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if(miJpo != null) {
                    try {
                        miJpo.finalizar();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }

            return "Contents  json: "+(new Gson().toJson(data));

        }

我想从我的SQL Server连接到我的公共IP或私有IP,但是我也找不到有关此信息,您有什么建议吗?

1 个答案:

答案 0 :(得分:2)

Cloud SQL代理在2 modes中工作:Unix套接字和TCP

在计算机上使用它时,应使用TCP模式,并且可以在本地主机IP中连接到它。但是,使用Cloud Run时,使用的是unix套接字模式,没有SQL Server客户端可以使用此连接模式。

因此,您必须使用Cloud SQL IP将Cloud SQL实例连接到Cloud Run。

对于您的本地测试,请继续以TCP模式使用Cloud SQL代理

对于Cloud Run,我建议您使用SQL Server的专用IP。

  1. Expose your instance in your VPC
  2. Create a serverless VPC connector在正确的区域
  3. 附加Serverless VPC connector to your Cloud Run service
  4. 在代码中使用Cloud SQL专用IP连接数据库。