我想在本地调试我的Google App Engine(GAE)应用,但不使用localhost。由于我的应用程序由微服务组成,因此生产环境中的URL将遵循:
https://my-service.myapp.appspot.com/
但是一个服务中的代码可以调用另一个服务,这意味着网址是硬编码的。我当然可以在代码中使用一种机制来确定应用程序是在本地运行还是在GAE上运行并使用不同的网址,尽管我没有看到本地网址如何处理,因为在本地运行应用程序的唯一方法是使用localhost。因此:
http://localhost:8080/some-service
请注意,“some-service”映射到servlet,而“my-service”是在上传应用程序时分配给服务的名称。这些实际上是两回事。
我能找到的唯一可行解决方案是使用反向代理,将一个网址映射到另一个网址。目前尚不清楚GAE开发SDK是否支持这一点。
答案 0 :(得分:1)
这可以通过以下步骤完成:
使用IntelliJ和远程调试连接App Engine Dev服务器。
127.0.0.1 my-service.myapp.com
保存后,您需要重新启动计算机才能进行更改。
dev_appserver.sh --address = 0.0.0.0 --jvm_flag = -Xdebug --jvm_flag = -Xrunjdwp:运输= dt_socket,服务器= Y,暂停= n时,地址= 8000 [path_to_exploded_war_directory]
您可以设置断点并在IntelliJ中运行该应用程序。 IntelliJ将附加到App Engine Dev服务器的运行实例。
因为您在调试期间使用端口并且在生产期间将应用程序上载到GAE时实际上没有使用端口,所以您需要添加代码以识别应用程序何时在本地运行以及何时在GAE上运行。这可以按如下方式完成:
private String mServiceUrl = "my-service.my-app.appspot.com";
...
if (SystemProperty.environment.value() != SystemProperty.Environment.Value.Production) {
mServiceUrl += ":8000";
}
请参阅https://cloud.google.com/appengine/docs/standard/java/tools/using-local-server
改进的解决方案是避免完全包含端口,而不必使用代码来确定您的应用是在本地运行还是在生产服务器上运行。一种方法是使用Charles(一个用于监视和与请求交互的应用程序)并使用一个名为Remote Mapping的功能,它允许您将一个URL映射到另一个URL。启用后,您可以映射如下内容:
到
然后,您将启用该选项以包含原始主机,以便将其传递到本地开发服务器。就你的代码而言,它只看到:
虽然启用远程映射时IP地址为127.0.0.1:8080。但是,要在本地主机上使用https,则需要为Charles启用ssl证书。
有关如何在IntelliJ中为GAE Java应用程序设置和调试微服务的完整概述,请参阅:
答案 1 :(得分:1)
我个人选择检测本地开发与GAE环境并相应地构建我的服务间URL。我觉得这是一项值得付出的努力,我已经(重新)使用它了很多。没有必要的反向代理或任何其他附加操作,它只是有效。
当然,我正在使用Python,所以我不是100%确定存在完整的类似Java解决方案。但也许它可以指出你正确的方向。
构建我使用的每服务网址modules.get_hostname()
(实现在Resolve Discovery path on App Engine Module中展示)。我相信Java等价物来自getInstanceHostname()
com.google.appengine.api.modules
。
此方法在本地服务器上执行时,会自动提供服务器为每个服务侦听的特定端口。
modules.get_hostname()
信息)。见Running multiple services using dev_appserver.py on different ports。这是我不确定的部分:java本地开发服务器是否/如何同时运行多个服务。显然以前曾经支持过这种情况(当services
仍被称为modules
时):