【发布时间】:2018-07-17 11:02:31
【问题描述】:
我有两个 Spring Boot 服务 A 和 B。还有一个外部服务 C。 那是请求路径:
Web 浏览器 服务 A 服务 B 外部服务 C
外部服务正在返回一个返回到前端的资源。对于 A、B 和 C 之间的通信,我使用的是 Rest Template。 进入 Web 应用程序时一切正常,但一旦我运行并行运行的 BDD 测试(9 个线程),我在调用外部服务 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 是单例)还是每个服务只有一个实例?
也许我需要在连接管理器中设置“setDefaultMaxPerRoute”?如果是,那么我如何区分正确的数字是什么?我真的很感激在这种情况下如何正确配置 RestTemplate 的简要说明。
【问题讨论】:
标签: java spring spring-boot resttemplate