java - 运行 Google Compute Engine 实例的 GAE 开发服务器 <phew>

标签 java google-app-engine google-compute-engine

我正在尝试在 Google 计算实例上为 Google AppEngine 运行本地开发服务器 (java)。 (我们使用计算引擎实例作为测试服务器)。

当尝试使用 appcfg.sh 启动开发服务器时,我们注意到在 90% 的情况下,服务器不会启动并在最终启动前挂起 10 分钟。

我知道服务器还没有启动,因为当它挂起时,这行永远不会打印到控制台:

Server default is running at http://localhost:8080/

有人见过这样的东西吗?

最佳答案

简而言之:

-App Engine java SDK 使用jetty 作为开发应用服务器的servlet 容器

-Jetty依赖java.security.SecureRandom

-SecureRandom 默认消耗来自/dev/random 的熵

-/dev/random 将在没有足够的熵可供读取时阻塞

GCE 实例在使用较少时(例如,仅用作测试应用引擎服务器)不会快速生成熵。因此,java appengine 服务器的重复启动从/dev/random 中消耗熵的速度比补充熵的速度更快,从而导致启动时出现阻塞行为,如启动时挂起。

您可以通过提高开发应用服务器的日志记录级别来确认挂起是由 SecureRandom 问题引起的。您应该看到类似于“init SecureRandom”的消息,然后是阻止行为。

一些可能的解决方法:

1) 将以下内容添加到 dev_appserver.sh 调用将导致 SecureRandom 使用/dev/urandom 熵源而不是/dev/random:

--jvm_flag="-Djava.security.egd=file:/dev/./urandom"

2) 拥有一个使用率更高的 GCE 实例应该会导致熵数据的收集速度更快,这反过来又会使/dev/random 在随后重新启动开发应用程序服务器时不易受到阻塞。

关于java - 运行 Google Compute Engine 实例的 GAE 开发服务器 <phew>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16804437/

相关文章:

java - 是否有 DayOfWeek::getDisplayName() 的反函数

java - TreeMap 比较器没有给出预期的顺序?

database - 与谷歌应用程序引擎兼容的简单网络应用程序

java - Docker 支持 - Google App Engine (Java)

linux - 如何通过 FileZilla 谷歌计算引擎上传文件

Java Apache POI——创建一个迭代器来查找日期

java - 计算一天中两次之间的小时差

python - css 在除两个页面之外的所有页面上工作

google-compute-engine - 到 VM 的 IAP 隧道

node.js - 我应该向防火墙上的 Google 负载均衡器向我的实例组开放哪些 GCE IP?