我从GET方法调用到另一个服务时收到504网关超时错误。 最近,我通过增加超时时间来添加修复程序,但这没有帮助。
这是我尝试过的
public void getUserInformation(final Integer userId) {
HttpClient httpClient = getBasicAuthDefaultHttpClient();
HttpGet httpGet = new HttpGet("http://xxxx/users/"+userId);
httpGet.addHeader("userid", userid);
httpGet.addHeader("secret", secret);
try {
HttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
if (entity != null && HttpStatus.OK.value() ==
response.getStatusLine().getStatusCode()) {
ObjectMapper objectMapper = new ObjectMapper();
userInfo = objectMapper.readValue(entity.getContent(),
UserInfo.class);
} else {
logger.error("Call to the service failed: response code:
{}", response.getStatusLine().getStatusCode());
}
} catch (Exception e) {
logger.error("Exception: "+ e);
}
}
public HttpClient getBasicAuthDefaultHttpClient() {
CredentialsProvider provider = new BasicCredentialsProvider();
UsernamePasswordCredentials creds = new
UsernamePasswordCredentials(user, password);
provider.setCredentials(AuthScope.ANY, creds);
//Fix to avoid HTTP 504 ERROR (GATEWAY TIME OUT ERROR) for ECM calls
RequestConfig.Builder requestBuilder = RequestConfig.custom();
requestBuilder.setConnectTimeout(30 * 1000);
requestBuilder.setConnectionRequestTimeout(30 * 1000);
HttpClientBuilder builder = HttpClientBuilder.create();
builder.setDefaultRequestConfig(requestBuilder.build());
builder.setDefaultCredentialsProvider(provider).build();
return builder.build();
}
我正在循环处理此记录的过程中调用此过程,该过程适用于大多数记录,但其中的少数userId失败。 但是我注意到的是,当我只运行失败的记录时,一切都会正常运行,不确定这种情况下的问题是什么。
我想到当我收到504时再次调用该方法,以期再次接收到200。
不确定这是个好主意。任何建议将不胜感激。
答案 0 :(得分:1)
根据504 Gateway Timeout状态码的描述,当您有一连串可通信以处理请求的服务器和一个节点(不是正在呼叫的服务器,但稍后再呼叫的一个)时,将返回此状态代码无法及时处理请求。
我想您所处的情况可以描述如下。
CLIENT -> USERS SERVICE -> SOME OTHER SERVICE
问题是SOME OTHER SERVICE
花费的时间太长,无法处理您的请求。 USERS SERVICE
会在某个时间点放弃,并向您返回此特定状态代码以表明这一点。
据我所知,您几乎无济于事。您需要与USERS SERVICE
的所有者联系,并要求他们增加超时时间,或者与SOME OTHER SERVICE
的所有者联系,并要求他们改善性能。
关于为什么有时会发生这种错误。您和其他客户端一起可能正在传递SOME OTHER SERVICE
,从而导致它越来越慢地处理请求。也可能是SOME OTHER SERVICE
已启用限制或速率限制以防止拒绝服务攻击。通过对USERS SERVICE
的请求过多,您可能正在消耗其拥有的配额。
当然,所有这些都是猜测,而并不知道您的实际情况。
答案 1 :(得分:0)
有时候我也面临同样的问题,以下是我为解决此问题所做的检查。我将在上述类比中添加更多细节。
客户端->用户服务->其他服务
客户检查:
“其他服务”检查: 如果设置了节流/速率限制以避免DOS攻击。然后,您需要增加“其他服务”的超时时间。我在AWS上使用过tomcat服务器:更改了yaml文件中的空闲超时
metadata:
annotations:
#below for openshift which worked for me
haproxy.router.openshift.io/timeout:20000
#below for kubernetes timeout in ELB
service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout:20000
还更改了tomcat上的连接器超时
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
Voila!它对我有用。