如何在Google App Engine上查找域名的IP地址?
我需要弄清楚我的应用程序在向一个指定的域名发送请求时,实际上连接的是哪个IP地址。我的应用在生产服务器上连接某个域名时遇到了问题,但在我电脑上的SDK上连接却完全没问题。我正在调试这个问题,突然想到,Google App Engine可能把这个域名解析成了一个和我本地电脑不同的IP地址。
如果我能使用socket库,那就简单了,只需用socket.gethostbyname('thedomainiwant.com')就能得到结果,但可惜的是,Google不允许在App Engine上使用socket库。
有没有什么办法呢?
如果有需要在App Engine上使用Java或Go的解决方案,我也愿意尝试。
更新 2011年6月26日:
我直接修改了生产代码,立刻使用IP地址来解决这个问题(这样做确实有效),但这并不是一个好的长期解决方案,因为我无法控制我请求的服务器,所以IP地址可能会随时改变。
返回的头信息在这种情况下也没什么帮助,因为生产实例解析的域名对应的IP根本没有响应,请求超时了。
如果我请求的服务器在屏蔽App Engine,那么通过IP地址进行请求也不会成功……但实际上是成功的。而且,我和管理这个服务器的团队沟通过,他们确认没有屏蔽App Engine。我还在继续向他们询问更多信息,但看起来这边并没有问题。
更新 2011年7月7日:
Google确认他们那边出现了一个问题,影响了我的应用。他们已经采取了临时解决办法,并正在修复中。详情请见: http://code.google.com/p/googleappengine/issues/detail?id=5244
3 个回答
你可以使用一些网络服务来进行DNS查询。你可以把地址放在网址里,像这样:
http://www.dnswatch.info/dns/dnslookup?la=en&host=HOST_HERE&type=A&submit=Resolve
(把HOST_HERE替换成你要查询的地址),然后解析结果。不过结果是HTML格式的,但即使是简单的正则表达式也能处理。你也可以找找有没有提供XML输出的服务之类的——这样的服务有很多,只要在谷歌上搜索“dnslookup”,就能找到一些。
看看响应头,你可能会收到一个包含这些信息的 HOST 头。
否则,为什么在排查问题时不直接使用原始的 IP 地址来进行连接呢?
现在在App Engine上没有办法进行名称解析。如果你想要实现这个功能,就得通过HTTP调用一个外部服务。