【问题标题】:AppEngine Managed VM with Java and Cloud SQL使用 Java 和 Cloud SQL 的 AppEngine 托管虚拟机
【发布时间】:2016-02-28 20:12:46
【问题描述】:

我希望 Java Appengine 托管 VM 应用程序连接到第二代云 SQL 实例。文档中存在差异 - 我无法确定 Google 是否真的支持它!

https://cloud.google.com/appengine/docs/managed-vms/java/using-cloud-sql 状态:

4:在控制台中,授予您的 App Engine 应用程序访问 Google Cloud SQL 实例的权限。

但我认为没有办法做到这一点。在 Cloud SQL 管理控制台中,在实例的属性下,有:

授权申请:无

似乎没有办法授权应用程序?

然后在此页面https://cloud.google.com/sql/docs/dev-access 上声明:

Java App Engine 应用程序

Java 不支持使用 Cloud SQL 代理。

所以您似乎无法使用 Cloud SQL 代理。我让它全部工作的唯一方法是向全世界开放 SQL 端口,以便托管 VM 实例可以通过其公共 IP 地址连接到它,但这是一个可怕的解决方案!

是否有实际支持的方式来执行此操作?谷歌的任何人都可以回答吗?

【问题讨论】:

    标签: java google-app-engine google-cloud-sql google-managed-vm


    【解决方案1】:

    2016 年 4 月更新

    我们有一个新的 Java 库,用于从托管 VM 和其他环境连接到 Cloud SQL 实例:https://github.com/GoogleCloudPlatform/cloud-sql-mysql-socket-factory

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


    旧答案:

    我认为现在最好的选择是使用 junixsocket 库,如本文所述:https://stackoverflow.com/a/34820600

    如果你使用maven-war-plugin打包你的应用,那么添加以下两个依赖就足够了:

    <dependency>
      <groupId>com.kohlschutter.junixsocket</groupId>
      <artifactId>junixsocket-mysql</artifactId>
      <version>2.0.4</version>
    </dependency>
    <dependency>
      <groupId>com.kohlschutter.junixsocket</groupId>
      <artifactId>junixsocket-native-common</artifactId>
      <version>2.0.4</version>
    </dependency>
    

    对于 Play Framework,添加以下依赖项:

    libraryDependencies += "com.kohlschutter.junixsocket" % "junixsocket-mysql" % "2.0.4"
    libraryDependencies += "com.kohlschutter.junixsocket" % "junixsocket-native-common" % "2.0.4"
    

    如下配置您的 Play application.conf

    db.default.url="jdbc:mysql:///mydb?socketFactory=org.newsclub.net.mysql.AFUNIXDatabaseSocketFactory&junixsocket.file=/cloudsql/PROJECT_ID:REGION:INSTANCE_NAME"
    

    我们希望在未来提供一些不需要使用 junixsocket 或类似库的东西。

    我们将审查/修复https://cloud.google.com/appengine/docs/managed-vms/java/using-cloud-sql 的文档,因为它存在一些问题。感谢您提请我们注意。

    【讨论】:

    • 感谢您的快速回复。我是否正确地说 junixsocket 解决方案意味着必须将二进制 blob 下载到托管 VM 并开始在该级别进行黑客攻击?听起来像是兔子洞的开始!
    • 您现在无法使用 Java 中的托管虚拟机连接到 Cloud SQL 真是太疯狂了!
    • 是和否,如果您的应用程序已设置/打包“hello world”应用程序是如何设置的,那么您需要做的就是添加 junixsocket 作为依赖项,并且本机依赖项也将被打包,并且事情应该“正常工作”。如果您的设置更加自定义,那么您可能需要做更多工作才能找到本机库。我们知道这不是最优的,并且我们对如何使它变得更好有一些想法,但是我们必须克服 Java 是少数不支持开箱即用的 UNIX 套接字的语言之一的限制。
    • 了解 Vadim - 谢谢。我在谷歌方面看不到任何关于这个的文档——对吗?是什么在打包本机依赖项? maven 插件是否将此与托管 VM 配置相协调?
    • maven-war-plugin 负责在战争中包含所有依赖的 jar。 junixsocket-native-common jar 包含本机库。 junixsocket 使用 native-lib-loader (github.com/scijava/native-lib-loader) 从打包的 jar 中加载原生库。
    【解决方案2】:

    我终于让它在带有这个 xml 的托管 VM 上运行:

    <?xml version="1.0" encoding="utf-8"?>
    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
        <application>thmadmin-ben</application>
        <version>master</version>
    
        <threadsafe>true</threadsafe>
        <vm>true</vm>
        <precompilation-enabled>false</precompilation-enabled>
    
        <manual-scaling>
            <instances>1</instances>
        </manual-scaling>
    
        <beta-settings>
            <setting name="cloud_sql_instances" value="xxx-ben:us-east1:yyy"/>
        </beta-settings>
    </appengine-web-app>
    

    但是在跟随兔子洞之后,我认为在我正在使用的框架(播放框架)中将 TCP 数据库连接器换成基于套接字的连接器并不容易。

    真的很想能够在 Cloud SQL 实例设置中定义“允许”的 AppEngine 项目 - 如果没有这个能力,我将不得不在 AWS 上运行......

    【讨论】:

    • 我已经用 Play Framework 的说明更新了上面的答案,这有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2016-05-22
    • 1970-01-01
    • 2016-05-16
    • 2022-01-24
    • 2020-08-14
    相关资源
    最近更新 更多