暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于Google Cloud SDK的本地Datastore数据导出实践

小码王技术 2020-11-27
650


01

引言

 App  Inventor平台中数据导出操作方案讲解,方便对于数据内容二次处理加工。


02

背景

某日领导大大希望查看App  Inventor已使用学员数据信息,可是本地开发服务器内置的Datastore viewer只能浏览数据,无法导出,为了应急,就把数据爬了下来:

但是这种方式只能获取页面展示数据,无法对数据进行分析,聚合计算等复杂操作,无法满足领导日后潜在需求。

因此计划开发一个Datastore数据导出导入工具,也便于以后数据的备份与迁移。在开发前,先介绍下需要使用的Google产品。


03

概念介绍


1、App Engine

App Engine是google的一种产品,提供全代管式无服务器平台,开发者只需使用擅长的开发语言,专注代码编写即可,不需要管理基础架构,部署配置,服务器维护等。另外App Engine可以自动扩缩以应对突发的流量激增,而无需进行预配、修补或监控。


2、 Datastore

Datastore 是一个 NoSQL 文档数据库,能够自动扩缩、具备出色的性能,并且易于进行应用开发。

Datastore 特性包括:

  • 原子化事务。Datastore 在执行一组操作时,可以确保这些操作要么全部成功、要么全部不发生。

  • 读取和写入的高可用性。Datastore 在 Google 数据中心中运行,这些数据中心使用冗余来最大限度地降低故障点产生的影响。

  • 高性能的大规模可扩缩性。Datastore 使用分布式架构来自动管理扩缩。Datastore 混合使用多种索引和查询约束机制,因此可让查询性能随着结果集而非数据集的大小而扩缩。

  • 灵活的数据存储和查询。Datastore 可自然地映射到面向对象的语言和脚本语言,并可通过多个客户端向应用提供服务。它还提供了一种类似于 SQL 的查询语言。

  • 在高度一致性与最终一致性之间取得平衡。Datastore 会确保祖先查询和以键为依据的实体查找始终能够获得高度一致的数据。所有其他查询则保证最终一致性。这样的一致性模型让您的应用可以在自如处理大量数据和用户的同时,提供出色的用户体验。

  • 静态加密。Datastore 会在所有数据写入磁盘之前自动对其加密,并在已获授权的用户读取数据时自动将其解密。

  • 完全托管,无计划内停机时间。Google 负责管理 Datastore 服务,以便您可以专注于自己的应用。在服务进行计划内升级时,您的应用仍然可以使用 Datastore。


Datastore 与关系型数据库在概念方面的简要对比:

与关系型数据库表中的行不同,相同种类的 Datastore 实体可以具有不同的属性,并且不同的实体可以具有名称相同但值类型不同的属性。由于这些独有的特点,为了充分利用 Datastore 的自动扩缩能力,您需要以不同的方式来设计和管理数据。

具体来说,Datastore 在以下几个重要方面与传统关系型数据库不同:

1.Datastore 的设计能够自动扩容来承载超大数据集,因而应用在收到更多流量时也能保持高性能:

  • Datastore 会根据需要自动进行数据分布,实现写入规模的扩缩。

  • Datastore 只支持性能随结果集而非数据集的大小而扩缩的查询,因此也能实现读取能力的扩缩。这意味着,如果一个查询的结果集包含 100 个实体,无论它搜索的是一百个实体还是一百万个实体,其性能始终相同。这一属性是某些类型的查询不受支持的关键原因。

2.由于所有查询都由预先构建的索引提供结果,因此可以执行的查询种类比支持 SQL 的关系型数据库所允许的查询种类更有限。具体来说,Datastore 不支持联接操作、对多个属性的不等性过滤,也不支持基于子查询的结果对数据进行过滤。


3.与强制执行某种架构的传统关系型数据库不同,Datastore 是无架构的。它不要求相同种类的实体拥有一致的属性集(但您可以选择在自己的应用代码中强制执行这样的要求)。


Datastore Emulator

Datastore 模拟器是 Google Cloud SDK 的 gcloud 工具的一个组件。用户可在本地模拟 Datastore 生产环境。您可以使用该模拟器在本地开发和测试应用。此外,该模拟器有助于为 Datastore 模式 Firestore 生产实例生成索引,以及删除不必要的索引。


04

环境准备

Part 01

开发环境准备

1. 安装Google Cloud SDK。

2. 登录Google Cloud Platform,创建一个project。

3. 初始化SDK  gcloud init。

4.安装组件gcloud components install app-engine-java。

Part 02

IDE配置

如果使用Eclipse,可以安装Cloud Tools 插件 https://cloud.google.com/eclipse/docs。
使用IntelliJ IDEA,需要安装Cloud Code 插件。

Part 03

构建工具

App Engine项目支持Maven和Gradle构建,配置如下:
Maven在pom.xml文件中添加配置:

Part 04

开发与调试

Cloud SDK Java版本包含一个本地开发服务器,本地开发服务器能够模拟 App Engine的Java 运行时环境及其所有服务,包括 Datastore。
启动开发服务器命令:

比较有用的2个参数:
--disable_update_check 禁用sdk版本检查,由于服务器没配"科学上网",这样可以缩短服务启动时间。
--jvm_flag 设置jvm参数。

Part 05

使用本地开发环境

Java版本的本地开发服务器会模拟App Engine的java运行环境及其所有服务(包含Datastore),Datastore 的数据存储是以文件的方式实现,文件名为 local_db.bin,该文件一般在应用的 WAR 目录(WEB-INF /appengine-generated/ 目录)中创建的。部署的时候,该local_db.bin文件不会随应用一起上传。要清除 Datastore 的内容,请关闭服务器,然后删除该文件。

用户可以通过web浏览器访问,查看本地Datastore的数据:http://localhost:8080/_ah/admin


05

开发框架选型

一、使用 Spring Cloud GCP

对于习惯使用Spring生态的java开发来说,使用Spring Cloud GCP绝对是一个很不错的选择,和平时的开发没什么区别,创建一个Spring boot应用即可,借助丰富的starters,通过简单的配置即可使用丰富的Google Cloud产品和服务。

我这边只做了简单的尝试,没有深入研究下去。因为Spring Cloud GCP使用的是Google Cloud Datastore API,只能使用Datastore模拟器本地调试,生成的local_db.bin数据文件和App Inventor的数据文件不兼容,无法读取,可能是数据存储的模式有差别,另外Spring Cloud GCP依赖Cloud SDK, 必须得“科学上网”去GCP创建项目,配置凭据等,操作过程比较繁琐。

下面就调试官方书架管理例子的步骤做简要说明:

1.下载官方源码:https://github.com/spring-cloud/spring-cloud-gcp。


2.配置Datastore模拟器。

安装命令:gcloud components install cloud-datastore-emulator

启动命令:gcloud beta emulators datastore start [flags]

其中 [flags] 是提供给 gcloud 工具的可选命令行参数。


例如:

     --data-dir=[DATA_DIR] 用于更改模拟器的数据目录。模拟器在 [DATA_DIR] 内创建 /WEB-INF/appengine-generated/local_db.bin 文件,或者使用现有文件。

     --no-store-on-disk 用于将模拟器配置为不在磁盘上持久保留模拟器会话的任何数据。

      默认情况下,模拟器数据存储目录位于~/.config/gcloud/emulators/datastore/


    3. 创建客户端凭据。

创建完凭据后,需要下载到本地,是一个json文件。

有关google身份验证具体操作步骤可以参考:https://cloud.google.com/docs/authentication/end-user


   4. 运行Sample。

导入项目后,修改项目配置如下,然后就可以本地调试了。

二、使用原生的App Engine API

由于我们使用的是Java8,只能使用旧式App Engine服务,因此开发的应用只能在App Engine上运行。后续我们也可以考虑升级到Google Cloud API,这样我们的应用不仅能在App Engine上运行,也可以在其他Java8的环境中运行。当然如需使用最新版本的运行环境,就需要将应用迁移到Java11。

下面我们使用旧版App Engine API来实现本地Datastore数据导出到CSV,大致步骤如下:


1. 使用Cloud Code插件创建项目。

2. 修改POM.xml,引入依赖,配置插件。

3. 编码实现。

4. 导出效果:


06

结语

目前这个项目实现还比较粗糙,有许多细节待完善,比如实体属性过滤,属性值数据类型转换,按实体分别生成CSV,打包下载等。另外也可以考虑实现数据导入到Datastore,这样就能够实现数据的迁移。


PS:如果对Google Cloud感兴趣的同学,也可以考虑弄一个Google Cloud证书认证:https://webassessor.com/googlecloud


源码Demo地址:

https://github.com/zhangyuan324/appinventor-datastore.git

07

参考资料

Google App Engine

https://cloud.google.com/appengine/docs/standard/java

Java8 App Engine API

https://cloud.google.com/appengine/docs/standard/java/javadoc

Datastore介绍

https://cloud.google.com/datastore/docs

Spring Cloud GCP

https://docs.spring.io/spring-cloud-gcp/docs/1.2.5.RELEASE/reference/html/#introduction

Google Cloud Datastore API

https://googleapis.dev/java/google-cloud-datastore/latest/index.html

Spring-Cloud-GCP源码

https://github.com/spring-cloud/spring-cloud-gcp



扫码关注我们

微信号|xmw-tech

“搜一搜” 搜索 小码王技术  


文章转载自小码王技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论