我有两个Spring Boot服务A和B。还有一个外部服务C。
这是请求路径:
Web浏览器服务A 服务B 外部服务C
外部服务返回的资源将返回到前端。为了在A,B和C之间进行通信,我使用了Rest Template。
进入Web应用程序时一切正常,但是一旦我运行并行(9个线程)运行的BDD测试,则在调用外部服务C时在服务B中会收到NoHttpResponseException。
org.apache.http.NoHttpResponseException Service_C failed to respond
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:141)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
这是我的Rest Template配置:
@Bean
public RestTemplate restTemplateExternal() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
HttpComponentsClientHttpRequestFactory requestFactory = getRequestFactoryWithDisabledSSLValidation();
RestTemplate restTemplate = new RestTemplate(requestFactory);
return restTemplate;
}
private HttpComponentsClientHttpRequestFactory getRequestFactoryWithDisabledSSLValidation() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(null, acceptingTrustStrategy)
.build();
SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.setSSLSocketFactory(csf)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
return requestFactory;
}
我已经尝试调用
connectionManager.setValidateAfterInactivity(0);
,但没有帮助。让我补充一点,从服务B到外部服务C的所有请求都到同一端点。仅参数(x)更改:
/resource?param={x}
老实说,我不确定100%是否要为每个服务请求创建HttpClient(RestTemplate bean为Singleton)还是每个服务仅一个实例?
也许我需要在连接管理器中设置“setDefaultMaxPerRoute”?如果是,那么我该如何区分正确的数字?我非常感谢在这种情况下如何正确配置RestTemplate的简要说明。
最佳答案
看起来这是一个类似的问题:get NoHttpResponseException for load testing
尝试使用clientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));
,成功了。如果有人可以更深入地解释问题,我仍然很感激。