Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java连接到Appengine托管VM的第二代云SQL_Java_Mysql_Google App Engine_Google Cloud Sql_Google Managed Vm - Fatal编程技术网

Java连接到Appengine托管VM的第二代云SQL

Java连接到Appengine托管VM的第二代云SQL,java,mysql,google-app-engine,google-cloud-sql,google-managed-vm,Java,Mysql,Google App Engine,Google Cloud Sql,Google Managed Vm,正在尝试为具有托管VM的Java Appengine设置与Clond SQL第二代的连接 我得到的是: VM正在使用Appengine Compat模式(来自gcr.io/google\u Appengine/java Compat) 我在主机上看到一个MySQL管道(SSHed,我可以看到/cloudsql/**socket),但是默认的MySQL Java驱动程序不支持unix套接字 托管VM上似乎不支持Google驱动程序(java.lang.ClassNotFoundException

正在尝试为具有托管VM的Java Appengine设置与Clond SQL第二代的连接

我得到的是:

  • VM正在使用Appengine Compat模式(
    来自gcr.io/google\u Appengine/java Compat
  • 我在主机上看到一个MySQL管道(SSHed,我可以看到
    /cloudsql/**
    socket),但是默认的MySQL Java驱动程序不支持unix套接字
  • 托管VM上似乎不支持Google驱动程序(
    java.lang.ClassNotFoundException:com.mysql.jdbc.GoogleDriver
  • 我无法通过IP连接到MySQL
    • 没有驱动程序它是
      找不到合适的驱动程序
      用于
      jdbc:google:mysql://__IP__:3306/__db__
    • jdbc的超时:mysql://__IP__:3306/__db__
      (我已将MVM外部IP添加到MySQL上的授权网络中)
    • 但有趣的是,我可以从MVM机器连接到这个端口,至少这个端口是打开的。无论如何,我不喜欢通过公开的IP:PORT连接的想法。MVM每次都有一个新的IP,所以我甚至不能添加防火墙规则来指定仅从我的项目访问

我应该如何配置ManagedVM应用程序以连接到云SQL?

我无法使用Java启动托管VM应用程序,因此我现在无法亲自尝试,但看起来您应该能够利用Java连接到Unix套接字。在一个示例中,您只需更改套接字的路径:

props.put("junixsocket.file", "/cloudsql/project-id:region:instance-id");

其中,
project id
是您的项目名称,
region
是您的云SQL实例所在的区域(例如,
us-east1
),而
实例id
是您的云SQL实例的名称。字符串将位于第二代实例的属性中的“实例连接名称”下。

我发现的最佳方法是从ManagedVM配置SSL连接

你应该做两件事

首先,使用您将从云SQL控制台(文件
server-ca.pem
client-cert.pem
client-key.pem
)获得的SSL准备Java密钥库:

您将得到两个文件:
truststore
keystore
,您需要将它们放入目标VM中

其次,您应该使用自定义的
Dockerfile
,其中包含上一步中的文件:

FROM gcr.io/google_appengine/java-compat

RUN mkdir /keys
ADD keystore /keys/
ADD truststore /keys/
ENV JAVA_OPTS -Djavax.net.ssl.keyStore=/keys/keystore -Djavax.net.ssl.keyStorePassword=123456 -Djavax.net.ssl.trustStore=/keys/truststore -Djavax.net.ssl.trustStorePassword=123456

ADD .  /app/
当然,不要忘记告诉MySQL驱动程序始终使用SSL:

dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://__CLOUD_SQL_IP__:3306/__CLOUD_SQL_DB__?useSSL=true&requireSSL=true");

请注意,我正在使用密码123456来保护我的密钥。这只是一个例子。不要在你的项目中使用它。已经完成了。

我们有一个新的Java库,用于从托管虚拟机和其他环境连接到云SQL实例:


它仍然非常新,所以通常的警告适用,但我们在测试中没有发现任何问题。

您可能无法进行内部连接,因为Cloud SQL第二代目前不支持应用程序引擎。如果您能够从托管VM连接mysql客户端,那么您应该能够连接外部ip+用户+密码。但也许你必须安装一个没有谷歌补丁的驱动程序?App Engine也不支持连接到外部SQL…据我所知,在我的MVM上启用了CloudSQL代理(),它支持代理到
localhost:3306
。目前,它只创建一个unix套接字,而不是端口。我猜这是默认配置,我可能还需要添加一些配置到OpenPort。仍在研究如何做到这一点,我不确定CloudSQL代理如何工作,但正如我所说的,云SQL第二代目前在Appengine上不可用,因此您必须使用常规MySQL驱动程序连接到云SQL实例的公共IP。云SQL第二代通过Unix管道工作,请参阅。公共IP的问题是我需要将私有SSL密钥安装到JVM中。我想可以使用自定义mvm映像,但这太多了,迫使我将密钥置于源代码版本控制之下。所以我认为,如果我们已经有了由google支持的云sql代理,并且已经部署到MVM中,那么对于Python MVM来说,它工作得很好,并且与Java兼容,正如我在源代码中看到的那样,因此最好也从Java使用它,作为一个标准工具。现在的问题是如何使用适当的参数运行它,因为mvm脚本已经阻止了所有为sql proxy启用端口转发的方法,而sql proxy可以轻松地解决这个问题。也许是故意的,也许只是一个错误,也许作者只是在反对Java,但希望它能很快得到修复。似乎目前唯一的方法是使用SSL密钥定制docker映像,mysql向所有google IP开放:(是的,我考虑过这一点。但它需要在VM中安装二进制
。因此
,我还担心lib许可证类型。我决定改用SSL,但仍然需要自定义VM,尽管许可证似乎是Apache 2,这通常被认为是相对许可的。我不是律师,但我的门外汉理解是,你不能使用他在服务器环境中运行的软件没有任何问题。(如果这是用于商业用途,你应该先与一些真正的律师核实。)哦,我明白了。对不起,我的错误。我在你的答案之前找到了类似的库(看起来很相似,所以我把它们弄糊涂了)。该库是GPL/LGPL许可的。很抱歉造成混淆。仅供参考,我们有一个小型库的beta版,可以更方便地从Java应用程序进行连接。我知道您已经有了一些工作,但如果您感兴趣,请尝试一下:只需尝试一下,它对我来说运行正常。也许您应该在文档中提及它?目前他们正在java应用程序不支持y cloud sql谢谢。我们肯定会将其添加到文档中!在向更广泛的受众发布之前,我们一直在收集早期客户的反馈。有解决方案吗?:/
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://__CLOUD_SQL_IP__:3306/__CLOUD_SQL_DB__?useSSL=true&requireSSL=true");