在不同端口上使用dev_appserver.py运行多个服务

10
我有一个应用程序,其中包含rest端点和web端点。
我想使用dev_appserver.py在本地运行REST和WEB服务。
我尝试了以下操作: dev_appserver.py rest_app.yaml --port=5010 --admin_port=8000 dev_appserver.py web_app.yaml --port=5011 --admin_port=8001 我在我的服务之一(rest服务)上看到了以下错误。
`OperationalError: database is locked`

我需要做些什么特别的事情来确保这两个服务没有条件地读写共享数据库(或类似的坏事情!!)

我的目标是在本地运行多个服务(在这种情况下为rest和web),这些服务应该共享数据。这样做的最佳方法是什么(在本地使用dev_appserver.py),以及在GAE本身中如何实现(当我推送应用程序到GAE时会涉及到这一点:D)


为什么你把它们当作独立的项目呢?为什么不用不同的路径来实现同一个服务呢? - Daniel Roseman
1个回答

14
你收到“OperationalError: database is locked”错误的原因是两个“dev_appserver.py”实例试图访问相同的本地存储目录,这默认基于应用程序名称确定-对于相同应用程序的2个服务是相同的。避免这种冲突的一种方法是使用“dev_appserver.py”的“--storage_path”可选参数指定本地存储目录(可以通过“dev_appserver.py --help”查看)。
--storage_path PATH   path to the data (datastore, blobstore, etc.)
                      associated with the application. (default: None)

然而,使用两个不同的存储路径可能会产生意想不到的结果——如果您的服务引用了应该在该存储中相同的信息,它们可能会看到不同的值。

在使用同一应用程序的多个服务时,正确的方式是通过单个dev_appserver.py实例运行所有服务,该实例将为每个服务分配不同的端口。

例如,我有一个具有3个服务和使用调度文件的应用程序。这是我如何从应用程序目录调用开发服务器的方法,该目录是3个服务目录的父目录(调度文件必须在.yaml文件参数列表的第一个位置,并且我总是在其后跟随默认模块的一个,在我的情况下是main/main.yaml):

/usr/bin/python2.7 /usr/local/google_appengine/dev_appserver.py --host 0.0.0.0 --log_level=debug dispatch.yaml main/main.yaml buildin/buildin.yaml apartci/apartci.yaml

这就是 devserver 自动为每个服务分配监听端口的方式,当服务器启动时会显示:

INFO     2016-11-18 14:20:53,329 api_server.py:205] Starting API server at: http://localhost:40310
INFO     2016-11-18 14:20:53,330 dispatcher.py:185] Starting dispatcher running at: http://0.0.0.0:8080
INFO     2016-11-18 14:20:53,345 dispatcher.py:197] Starting module "default" running at: http://0.0.0.0:8081
INFO     2016-11-18 14:20:53,353 dispatcher.py:197] Starting module "buildin" running at: http://0.0.0.0:8082
INFO     2016-11-18 14:20:53,361 dispatcher.py:197] Starting module "apartci" running at: http://0.0.0.0:8083
INFO     2016-11-18 14:20:53,362 admin_server.py:116] Starting admin server at: http://localhost:8000

--storage_path 在我在开发环境中运行两个不同项目时帮了我很大的忙。但是似乎一个应用程序的日志出现在了另一个应用程序中? - Fakeer
它们不是不同的应用程序,而是同一应用程序的不同服务。或者至少这种方法认为它们是不同的服务。是的,devserver会将日志一起显示,在真正的GAE基础设施中,它们可以按服务进行过滤。 - Dan Cornilescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接