迁移到 Cloud Datastore 模拟器

Cloud Datastore 模拟器可在本地模拟 Datastore 生产环境。我们正逐步在更大范围内推出 Cloud Datastore 模拟器,它将是 dev_appserver 的默认 Datastore 实现。

迁移到 Datastore 模拟器的优势

Datastore 模拟器可以在 App Engine 标准环境客户端库(如 DB 和 NDB)与 Cloud Datastore 客户端库之间共享。

您可以使用 Datastore 模拟器在运行于 App Engine 标准环境和 App Engine 柔性环境的服务之间共享本地数据。

前期准备

  1. 下载并安装 Java 运行时环境 (JRE) 版本 11 或更高版本。

  2. google-cloud-sdk/bin 目录运行 dev_appserver。

选择模拟环境

Cloud Datastore 模拟器是一部分 dev_appserver 用户的默认模拟器。如果您使用的是 Cloud Datastore 模拟器,dev_appserver 将显示:

... Using Cloud Datastore Emulator.

您可以通过在启动 dev_appserver 时将“--support_datastore_emulator”标志设置为 true 来强制 dev_appserver 使用 Cloud Datastore 模拟器:

dev_appserver.py --support_datastore_emulator=[true|false] app.yaml

将 dev_appserver 与 Datastore 模拟器搭配使用

Dev_appserver 会根据 DATASTORE_EMULATOR_HOST 环境变量决定是否启动模拟器。

  • 如果存在此环境变量,dev_appserver 将与在 DATASTORE_EMULATOR_HOST 上运行的现有模拟器进程进行通信。

  • 如果不存在此环境变量,dev_appserver 将启动新的模拟器进程。您可以在启动 dev_appserver.py 时设置 --datastore_emulator_port,以指定 Datastore 模拟器端口。

行为变化

本地数据格式转换

目前,本地 Datastore 模拟器将数据存储在 sqlite3 中,而 Cloud Datastore 模拟器将数据存储为 Java 对象。

如果 dev_appserver 是通过旧版 sqlite3 数据启动的,该数据将转换为 Java 对象。系统会使用文件名 {original-data-filename}.sqlitestub 来备份原始数据。

本地数据文件位置

您可以使用 --datastore_path 标志指定本地数据文件。

  • 如果 dev_appserver 启动模拟器,该位置将保持不变。

  • 如果 dev_appserver 使用现有的 Cloud Datastore 模拟器,该标志将被忽略,取而代之的是模拟器的设置。

本地 index.yaml

  • 空白 index.yaml 将被视为无效。index.yaml 的语法采用 YAML 格式。index.yaml 文件包含单个名为 indexes 的列表元素。

  • 如果 dev_appsever 启动模拟器,index.yaml 将保留在应用项目目录中。

  • 如果 dev_appserver 使用现有的 Cloud Datastore 模拟器,index.yaml 将由该模拟器管理。

其他本地 Datastore 服务器功能将保持不变。

问题排查

获取模拟器输出

默认情况下,dev_appserver 以静默模式运行 Datastore 模拟器。要查看 Datastore 模拟器的输出,请使用 --dev_appserver_log_level=debug 运行 dev_appserver。

gRPC 导入失败

dev_appserver 使用 gRPC 与 Cloud Datastore 模拟器进行通信。gcloud CLI 会打包 gRPC,但打包的版本与某些操作系统不兼容,因而导致导入失败。

要修复导入失败的问题,您可以在 gcloud CLI 219.0.0 或更高版本中使用 pip 单独安装 gRPC:

pip install grpcio