【问题标题】:How to connect Google Cloud Library for Datastore to the App Engine development server?如何将 Google Cloud Library for Datastore 连接到 App Engine 开发服务器?
【发布时间】:2020-01-25 21:10:02
【问题描述】:

我们正计划将在 Java 8 的 Google App Engine 标准环境上运行的内部应用从现在被取代的 App Engine APIs 迁移到推荐的 Cloud Firestore in Datastore Mode 客户端库,以便能够移植到其他执行环境。

除了缺少 IN/OR 查询运算符的一系列问题外,我们还在为本地测试设置而苦苦挣扎:根据Using the Java 8 Local Development Server

开发网络服务器使用本地模拟数据存储 文件支持的数据存储在您的计算机上。数据存储名为 local_db.bin,它是在应用程序的 WAR 目录中创建的, 在 WEB-INF /appengine-generated/ 目录中。

但我们不知道如何将 Google Cloud Client Library for Datastore 连接到本地模拟器。

使用

定义默认凭据
gcloud auth application-default login

或在获取服务帐户的凭据后设置GOOGLE_APPLICATION_CREDENTIALS 环境变量

gcloud iam service-accounts keys create key.json \
    --iam-account=project-id@appspot.gserviceaccount.com

正如其他地方所建议的那样,根据ADC 策略,只会导致客户端库连接到实际的云服务器,而不是本地模拟器。

我希望开发服务器自动向客户端库提供连接提示,但显然不是这样。

考虑到我们不能只迁移到独立的Datastore Emulator,因为我们需要目前仅由 App Engine 开发服务器提供的其他服务(例如电子邮件提交),有什么建议设置本地测试环境吗?


编辑 / 经过进一步的修改,我们正在通过使用本地开发服务器和独立的数据存储模拟器来解决这个问题:

gcloud beta emulators datastore start \
  —project=project-id \
  --host-port=localhost:8081 \
  --data-dir=target/war

DATASTORE_EMULATOR_HOST=localhost:8081 java_dev_appserver.sh \
 --port=8080 \
 target/war

但是,该过程非常繁琐且难以自动化:我们正在寻找一种在启动应用程序时自动将 Google 客户端库连接到由 Java 8 本地开发服务器管理的数据存储模拟器的方法 @ 987654326@,例如mvn appengine:run.

【问题讨论】:

    标签: google-app-engine google-cloud-datastore


    【解决方案1】:

    GitHub issue 已关闭,并确认数据存储客户端库与本地 Web 服务器数据存储模拟器不兼容。

    我确实试过了,看看是否可以强制连接到本地 Web 服务器。下面的代码使用所需的主机配置设置自定义构建器:

    DatastoreOptions.Builder builder = DatastoreOptions.newBuilder();
    builder.setHost("http://localhost:8080");
    builder.setProjectId("<PROJECT_ID>");
    
    Datastore ds = builder.build().getService();
    
    Key key = ds.newKeyFactory().setKind("MyEntity").newKey("mykey");
    Entity entity = Entity.newBuilder(key).set("p1", "Hello World!").build();
    
    entity = ds.put(entity);
    System.out.println(entity);
    
    entity = ds.get(key);
    System.out.println(entity);
    

    运行本地 Web 服务器后,我注意到确实可以建立连接,但是 Datastore 客户端库在尝试存储新实体时返回以下错误:

    [INFO] GCLOUD: com.google.cloud.datastore.DatastoreException: Non-protobuf error: <html><head><title>Error 404</title></head>|<body><h2>Error 404</h2></body>|</html>. HTTP status code was 404.
    

    Web 服务器的输出如下:

    Oct 02, 2019 3:05:59 PM com.google.appengine.tools.development.jetty9.LocalResourceFileServlet doGet
    WARNING: No file found for: /v1/projects/<PROJECT_ID>:commit
    

    我相信这增加了对新库与旧模拟器不兼容的确认。

    当您工作/等待完全迁移到数据存储模式模拟器时,您找到的解决方法可能是最佳解决方案。

    【讨论】:

    • 发现……我在公开的 Google 问题跟踪器 FWIW 上打开了 issue
    猜你喜欢
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多