2014-07-11 40 views
2

我在客户端使用org.springframework.web.client.RestTemplate来执行针对在Cent OS主机上运行的restful webservice的其余调用。为什么我的HTTP GET请求开始超时?

我看到一个奇怪的现象,其中当一系列这些电话都是由我得到一个连接超时错误说

“java.net.SocketTimeoutException:连接超时”

一这里值得注意的是,至少在进行一次异步http呼叫后,http呼叫总是失败。在发生故障时,http呼叫会尝试多次,修复等待时间为5秒。

以下是得到的HTTP调用传递的标题 -

[Accept: application/json 
, Content-Type: application/json;charset=UTF-8 
, Accept-Language: en_US 
, API-Version: 100 
, X-Request-ID: a99ccd66-5172-4056-a319-4e2e2614aff6 
, X-User-Waiting: false 
, Connection: Close 
, Content-Length: 2015 
] 

HTTP调用不看甚至击中服务器。我在这里错过了什么?是否需要设置不同的标题?

回答

1

一个可能的解释是,服务器通过限制它在一段时间内将从您的IP地址接受的连接数来限制对API的流量限制。线索是你说第请求会在第012个请求神秘失败之前成功。

如果此限速是在防火墙级别完成的,那么HTTP请求在到达Web服务器之前将被丢弃,因此您不会在其日志中看到它。

这听起来像你有一些控制服务器。如果你这样做,尝试运行(作为root):

iptables -vL INPUT

如果你看到在“目的地”列中的条目,看起来像

tcp dpt:http state NEW limit: avg 10/min burst 5 

或对条目的像

tcp dpt:http state NEW recent: UPDATE seconds: 60 hit_count: 10 name: DEFAULT side: source 
tcp dpt:http state NEW recent: SET name: DEFAULT side: source 

那么这很可能是发生了什么事情,您需要接受此限制或修改服务器的防火墙规则。

如果您的不是可以控制服务器,请检查您正在使用的API的文档以查看它是否对客户端强制执行速率限制。它可能是服务器在其响应中返回标头(as Twitter does),以帮助客户预测何时达到其限制。