Запуск стандарта Java и Python вместе локально

В моем проекте уже некоторое время используется стандарт Python в App Engine, и мы смогли локально запустить службы с помощью dev_appserver.py.

Недавно мы начали разрабатывать сервисы и на Java 8. Новый сервис создается с помощью плагина app-gradle и может быть запущен на сервере разработки с помощью задачи appengineRun. Однако эти службы должны взаимодействовать друг с другом, поэтому я ищу способ запускать их параллельно, особенно в одном и том же процессе dev_appserver.

Что я пробовал:
Запуск dev_appserver.py и указание его на файлы конфигурации как для служб Python, так и для службы Java. Похоже, это почти работает: dev_appserver не сообщает об ошибках и запускает приложения Python и Java на портах 8080 и 8081. Затем он запускает второй сервер 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 просто возвращает 404 от Jetty:

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 локально и одновременно? Я пропустил какую-либо конфигурацию?

Редактировать: я попытался запустить только приложение Java с помощью dev_appserver.py, например так: dev_appserver.py public-api/build/exploded-public-api/, после чего я смог получить доступ к статическим файлам в службе, но ни один из путей, настроенных с помощью Spring Boot. Похоже, что SpringBootServletInitializer не вызывается. Нужно ли мне добавлять файл web.xml или какую-либо другую конфигурацию для правильной загрузки сервера?


person Gavin Miller    schedule 16.02.2018    source источник


Ответы (2)


Я считаю, что вы должны иметь возможность запускать оба локально

Попробуйте зайти на сервер администратора по адресу 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

person Alex    schedule 16.02.2018
comment
В этом примере я не использую dispatch.yaml, поэтому никакая маршрутизация не должна мешать запросам. Когда я делаю запрос к службе Java, по пути, который работает, если я выполняю команду gradle appengineRun, вместо этого я получаю 404: WARNING: No file found for: /public-api/locations/list/ - person Gavin Miller; 21.02.2018

Проблема в том, что для модулей Java и Python следует использовать другой исполняемый файл локального сервера (с разными аргументами вызова), см. Python Использование локального сервера разработки и Параметры локального сервера разработки и Использование локального сервера разработки Java.

Вы пытались использовать сервер разработки Python для приложения Java, что, вероятно, объясняет, почему он работает лишь частично (вероятно, он может понять некоторые конфигурации, но не все).

Я недостаточно знаком со стороной Java, чтобы сказать, действительно ли это возможно, но я бы сначала попытался запустить только службы Java через сервер разработки java и заставить его работать правильно.

Затем я попытался бы запустить их бок о бок с сервером python, обрабатывающим службы python, сосредоточив внимание на разрешении немедленных конфликтов портов и т. д.

Еще один возможный путь исследования (может быть, стоит попытаться сначала?) — погрузиться во внутренности оболочек, фактически вызываемых из каталога <gcloud_sdk>/bin, и посмотреть, можно ли каким-то образом согласовать то, что они в конечном итоге выполняют под капотом, на обоих языках, чтобы единый основной процесс для одновременного обслуживания обеих сред.

Если одно ядро ​​не может быть достигнуто, я боюсь, что вы не сможете должным образом выполнять все свои службы одновременно - отдельные ядра означают, что разные службы могут не видеть единую, непротиворечивую «песочницу» приложения GAE (например, каждое ядро ​​будет иметь свою собственную версию/копию данных хранилища данных/memcache), что противоречит цели.

В идеале Google должен предоставить в SDK способ смешивания любых комбинированных стандартных и/или гибких сервисов среды, написанных на любом поддерживаемом языке, другими способами должным образом эмулируя то, что поддерживает реальная инфраструктура GAE. Без этого нет достойного способа разработки/тестирования приложений с такими миксами локально.

person Dan Cornilescu    schedule 22.02.2018