如何从同一应用项目中的 python2.7 微服务访问谷歌应用引擎 ndb 数据存储

Posted

技术标签:

【中文标题】如何从同一应用项目中的 python2.7 微服务访问谷歌应用引擎 ndb 数据存储【英文标题】:How to access the google app engine ndb datastore from a python2.7 microservice in the same app project 【发布时间】:2019-03-18 08:16:28 【问题描述】:

我一直在寻找这个,但似乎找不到一个简单的示例来说明如何从与其他非服务模块位于同一应用程序中的 python 微服务访问 ndb 数据存储。

我想要做的是访问数据存储的实际模型类,即用户......然后从微服务中查询该类。

我知道您不能在应用引擎标准中使用 google cloud datastore api,但肯定还有其他方法吗?

这同样适用于共享内存缓存,如果我从微服务对模块(无服务)中的端点进行 API 调用,并在端点的内存缓存中设置某些内容,我在微服务中看不到。因此,当 Google 谈到跨同一应用程序中的所有内容(包括微服务)共享数据存储和内存缓存时,他们建议您如何访问它?

我确定我错过了什么,只是找不到。

【问题讨论】:

你的问题有点不清楚。 “非服务模块”是什么意思?你看过这个文档吗:cloud.google.com/appengine/docs/standard/python/ndb? 是的,我已经看过了。它只是描述了如何在应用引擎中使用 ndb 数据存储客户端库。我所说的没有服务模块是指普通的应用程序引擎模块,它们不是微服务。通过 ndb 客户端导入和定义的模型访问 ndb 很简单,但是,没有明确的文档说明我如何从同一个应用程序引擎项目中的微服务中执行 ndb.query(Users).fetch() 之类的操作,如果我无权从模型访问用户类。 【参考方案1】:

澄清一下:microservice 术语在 GAE 中并不意味着在数据存储交互(或其他方面)方面有任何特别之处 - 从这个角度来看,所有 GAE 服务/模块都是平等的。使 GAE 服务/模块成为 microservice 的原因仅仅是它执行的功能,而不是它的实现或它如何使用基础设施,请参阅 Microservices Architecture on Google App Engine。

默认情况下,使用ndb 库访问数据存储的同一 GAE 项目/应用程序的所有服务都可以这样做,没有任何限制或额外的服务配置。

唯一的技巧是所有引用特定实体类型的服务必须对该实体的模型定义具有一致的视图。这是来自ndb 客户端库的特定实现的要求,而不是来自数据存储本身。

获得这种一致视图的最简单方法是恕我直言,通过共享相同的 ndb 模型定义源文件,这可以通过符号链接相同的实际源文件(或保存它们的目录)来实现多个服务/模块目录,如Sharing entities between App Engine modules 中所述。

换句话说,您需要以一种或另一种方式查询/访问/引用Users 实体的所有服务/模块实际上都具有相同的Users 模型定义可供这样做。

在部署对模型定义的更改(无论是在不同的服务中,还是在同一服务的不同版本之间)时,必须小心:

确保与迁移策略的向后兼容性 正确的部署编排 - 即确保不兼容的版本/服务永远不会同时运行

同样的技术可以用于 memcache,以类似的方式:共享源代码文件将导出 memcache 键的定义,用于需要跨服务共享的 memcached 值。或者,更好的是,为相应的数据提供实际的读/写功能,以确保数据不仅存储在正确的键下,而且还具有匹配的格式。

有了这样的共享代码,代表某些信息的 memcached 数据将在同一个应用的服务/模块之间共享(同样,无论它们是否是微服务)。几乎与通过数据存储共享的信息一样好,只是没有事务支持来保证一致性。

【讨论】:

嗨,丹,谢谢。你能提供一个models.yaml的简短例子吗?我不清楚你是指完整的定义还是只是文件名。 更新解决了吗?如果没有 - 请再问一次,因为我没有得到它:) 是的,明白了,谢谢,你真的为我节省了很多时间。 要查看开发中所有服务的相同数据存储(和内存缓存)内容,您需要通过同一开发服务器运行所有服务,请参阅***.com/a/40679959/4495081。或者使用相同的数据存储模拟器(不适用于内存缓存):***.com/a/50860147/4495081

以上是关于如何从同一应用项目中的 python2.7 微服务访问谷歌应用引擎 ndb 数据存储的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 2.7 中从同一个列表中打印两个数字

微服务架构中的数据库位置

Linux服务器上python2升为python3.6

NodeJS 中的微服务架构

如何从 Django 发送异步 HTTP 请求并在 python2.7 中等待结果?

如何从同一 WPF 应用程序托管的 WCF 服务调用 WPF 应用程序中的方法?