我有一个小问题,我想将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,但是我也找不到有关此信息,您有什么建议吗?
答案 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。