【问题标题】:Running Java and Python standard together locally在本地同时运行 Java 和 Python 标准
【发布时间】:2018-07-27 20:34:33
【问题描述】:

我的项目在 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 或其他配置才能正确加载服务器?

【问题讨论】:

    标签: java python google-app-engine dev-appserver


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      我相信你应该可以同时在本地运行

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

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

      另外,您是否使用了可能拦截请求的dispatch.yamlhttps://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

      【讨论】:

      • 在这个例子中我没有使用 dispatch.yaml,所以不应该有任何路由妨碍请求。当我向 java 服务发出请求时,如果我执行 gradle appengineRun 命令,在一个有效的路径上,我得到一个 404:WARNING: No file found for: /public-api/locations/list/
      猜你喜欢
      • 2019-09-14
      • 2019-11-02
      • 1970-01-01
      • 2020-05-02
      • 2021-12-26
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多