3

我的项目在 App Engine 标准上使用 Python 已经有一段时间了,我们已经能够使用 dev_appserver.py 在本地运行服务。

最近,我们也开始在 Java 8 上开发服务。新服务正在使用 app-gradle-plugin 构建,并且可以使用 gradle 任务 appengineRun 在开发服务器上运行。但是,这些服务需要相互交互,所以我正在寻找一种方法来并行运行它们,尤其是在同一个 dev_appserver 进程上。

我尝试过:
运行 dev_appserver.py 并将其指向 Python 服务和 Java 服务的配置文件。这几乎似乎工作:dev_appserver 没有报告任何错误,它在端口 8080 和 8081 启动 Python 和 Java 应用程序。然后它在随机端口启动似乎是第二个 Jetty 服务器:

$ dev_appserver.py public-api/src/main/appengine/app.yaml api/api.yaml
INFO     2018-02-16 21:23:05,712 devappserver2.py:105] Skipping SDK update check.
INFO     2018-02-16 21:23:05,758 api_server.py:308] Starting API server at: http://localhost:58551
INFO     2018-02-16 21:23:05,764 dispatcher.py:255] Starting module "public-api" running at: http://localhost:8080
WARNING  2018-02-16 21:23:05,764 dispatcher.py:316] Your python27 micro version is below 2.7.12, our current production version.
INFO     2018-02-16 21:23:05,775 dispatcher.py:255] Starting module "api" running at: http://localhost:8081
INFO     2018-02-16 21:23:05,781 admin_server.py:146] Starting admin server at: http://localhost:8000
WARNING  2018-02-16 21:23:05,781 devappserver2.py:176] No default module found. Ignoring.
Feb 16, 2018 9:23:07 PM com.google.appengine.tools.development.AbstractContainerService configure
WARNING: Null value for containerConfigProperties.get(devappserver.portMappingProvider)
2018-02-16 21:23:07.343:INFO::main: Logging initialized @521ms
2018-02-16 21:23:07.553:INFO:oejs.Server:main: jetty-9.3.18.v20170406
2018-02-16 21:23:07.667:INFO:oeja.AnnotationConfiguration:main: Scanning elapsed time=0ms
2018-02-16 21:23:07.865:INFO:oejsh.ContextHandler:main: Started c.g.a.t.d.j.DevAppEngineWebAppContext@5fbe4146{/,file:///Users/gmiller/workspace/skynet/public-api/src/main/appengine/,AVAILABLE}{/Users/gmiller/workspace/skynet/public-api/src/main/appengine}
2018-02-16 21:23:07.878:INFO:oejs.AbstractConnector:main: Started NetworkTrafficSelectChannelConnector@45b4c3a9{HTTP/1.1,[http/1.1]}{localhost:58560}
2018-02-16 21:23:07.888:INFO:oejs.Server:main: Started @1065ms
Feb 16, 2018 9:23:07 PM com.google.appengine.tools.development.AbstractModule startup
INFO: Module instance public-api is running at http://localhost:58560/
Feb 16, 2018 9:23:07 PM com.google.appengine.tools.development.AbstractModule startup
INFO: The admin console is running at http://localhost:58560/_ah/admin
Feb 16, 2018 9:23:07 PM com.google.appengine.tools.development.devappserver2.DevAppServer2Impl doStart
INFO: Dev App Server is now running

现在服务已经启动,我希望能够联系到任何一个。Python 服务按我的预期运行,但对 Java 服务使用任一端口只会从 Jetty 返回 404:

Feb 16, 2018 9:30:01 PM com.google.appengine.tools.development.jetty9.LocalResourceFileServlet doGet
WARNING: No file found for: /public-api/docs/view
INFO     2018-02-16 21:30:01,667 module.py:833] public-api: "GET /public-api/docs/view HTTP/1.1" 404 83

是否在本地运行 Python 和 Java 服务并同时支持/可能?我是否缺少任何类型的配置?

编辑: 我试过像这样使用 dev_appserver.py 运行 Java 应用程序: dev_appserver.py public-api/build/exploded-public-api/ 然后我能够访问服务中的静态文件,但没有使用 Spring Boot 配置的路径。似乎没有调用 SpringBootServletInitializer 。我是否需要添加 web.xml 或其他配置才能正确加载服务器?

4

2 回答 2

0

问题是对于 Java 与 Python 模块应该使用不同的本地服务器可执行文件(具有不同的调用参数),请参阅 Python Using the Local Development ServerLocal Development Server Options vs Using the Java Local Development Server

您尝试为 Java 应用程序使用 Python 开发服务器,这可能解释了为什么它只能部分工作(它可能能够理解一些配置,但不是全部)。

我对 Java 方面不够熟悉,无法说出它是否确实可行,但我会首先尝试通过 java devserver 单独运行 Java 服务并使其正常工作。

然后我会尝试将它们与处理 python 服务的 python 服务器并排运行,专注于解决即时端口冲突等。

另一种可能的调查路径(也许首先尝试?)是深入研究从<gcloud_sdk>/bin目录中实际调用的包装器的内部结构,看看它们最终在幕后执行的内容是否可以在两种语言之间以某种方式协调,以便单核进程同时服务于两种环境。

如果无法实现单个核心,恐怕您将无法同时正确执行所有服务 - 单独的核心意味着不同的服务可能看不到单个、一致的 GAE 应用程序“沙盒”(例如,每个核心都有自己的自己的数据存储/内存缓存数据的版本/副本),违背了目的。

理想情况下,Google 应该在 SDK 中提供一种混合使用任何支持的语言编写的任何组合标准和/或灵活环境服务的方式——以其他方式正确模拟真正的 GAE 基础设施支持的内容。没有它,就无法在本地开发/测试具有此类混合的应用程序。

于 2018-02-22T18:05:11.290 回答
0

我相信你应该能够在本地运行

尝试访问 localhost:8000 的管理服务器并单击其中每个服务的链接?

https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed#routing_in_the_development_server

另外,您是否使用了dispatch.yaml可能会拦截请求的设备? https://cloud.google.com/appengine/docs/standard/python/config/dispatchref

如果没有,dispatch.yaml您通常必须在 url 中指定服务(尽管我认为这不适用于本地开发服务器):

https://SERVICE_ID-dot-MY_PROJECT_ID.appspot.com

https://cloud.google.com/appengine/docs/standard/python/how-requests-are-routed#routing_via_url

于 2018-02-16T23:11:25.823 回答