Java 如何添加修复以避免504网关超时错误
我对另一个服务的GET方法调用出现504网关超时错误。 最近,我通过增加超时时间添加了一个修复程序,但这没有帮助 这就是我尝试过的Java 如何添加修复以避免504网关超时错误,java,http-status-code-504,Java,Http Status Code 504,我对另一个服务的GET方法调用出现504网关超时错误。 最近,我通过增加超时时间添加了一个修复程序,但这没有帮助 这就是我尝试过的 public void getUserInformation(final Integer userId) { HttpClient httpClient = getBasicAuthDefaultHttpClient(); HttpGet httpGet = new HttpGet("http://xxxx/users/"+us
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();
}
我在一个循环中调用这个进程来处理记录,这对大多数记录都有效,但对其中的少数用户ID无效。
但我注意到,当我只运行失败的记录时,一切都会正常工作,不确定在这种情况下会出现什么问题
当我收到504时,我想再次调用该方法,希望下次能收到200
不确定这是不是个好主意。如果您有任何建议,我们将不胜感激。根据状态代码的描述,当您有一系列服务器进行通信以处理请求,并且其中一个节点(不是您正在呼叫的服务器,而是稍后的某个)无法及时处理请求时,将返回该建议 我想你现在的处境可以描述如下
CLIENT -> USERS SERVICE -> SOME OTHER SERVICE
问题是,其他一些服务
处理您的请求花费的时间太长。USERS服务
会在某个时间点放弃,并返回此特定的状态代码以指示此情况
据我所知,你几乎无法缓解这个问题。您需要联系用户服务的所有者
并要求他们增加超时时间,或者联系其他服务的所有者
并要求他们提高性能
至于为什么会不时发生这样的错误。您可能与其他客户端一起,正在传递性地重载其他服务,导致它处理请求的速度越来越慢。或者可能是某些其他服务
启用了节流或速率限制,以防止拒绝服务攻击。通过向用户服务
发出过多请求,您可能正在使用它的配额
当然,所有这些都是推测,而不知道您的实际情况。根据状态代码的描述,当您有一系列服务器进行通信以处理请求和其中一个节点(不是您正在调用的服务器,而是稍后的某个服务器)时,会返回状态代码无法及时处理请求 我想你现在的处境可以描述如下
CLIENT -> USERS SERVICE -> SOME OTHER SERVICE
问题是,其他一些服务
处理您的请求花费的时间太长。USERS服务
会在某个时间点放弃,并返回此特定的状态代码以指示此情况
据我所知,你几乎无法缓解这个问题。您需要联系用户服务的所有者
并要求他们增加超时时间,或者联系其他服务的所有者
并要求他们提高性能
至于为什么会不时发生这样的错误。您可能与其他客户端一起,正在传递性地重载其他服务,导致它处理请求的速度越来越慢。或者可能是某些其他服务
启用了节流或速率限制,以防止拒绝服务攻击。通过向用户服务
发出过多请求,您可能正在使用它的配额
当然,所有这些都是猜测,不知道你的实际情况。我以前也遇到过同样的情况,下面是我为解决这个问题所做的检查。我将为上述类比添加更多细节 客户端->用户服务->其他服务 客户端检查:
- httpclient-我看到您正在使用RequestConfig.Builder设置客户端超时。(在您的情况下就可以了)
- jersey客户端-如果有人使用jersey客户端,可以将其配置为
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"/>
瞧!这对我很有效。我以前也遇到过同样的问题,下面是我为解决这个问题所做的检查。我将为上述类比添加更多细节 客户端->用户服务->其他服务 客户端检查:
- httpclient-我看到您正在使用RequestConfig.Builder设置客户端超时。(在您的情况下就可以了)
- jersey客户端-如果有人使用jersey客户端,可以将其配置为
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"/>
瞧!这对我很有用。我想到了一个想法。。。每次超时都不同吗?我的猜测是,另一个网站正在限制他们将从特定ip地址处理的请求数量。也许你可以尝试限制你对网站的请求数量。也许半秒钟的延迟就足够了…@hooknc:Timeout并不是每次都不同,传入的请求也没有任何限制。对于那些失败的请求,我在日志中看到的是,只花了10秒,就返回了504个错误!确保代理URL是正确的,并且没有任何拼写错误。有时候,像这样愚蠢的错误会让你头疼好几个小时。一个想到的想法。。。每次超时都不同吗?我的猜测是,另一个网站正在限制他们将从特定ip地址处理的请求数量。也许你可以试试老鼠