Gun*_*mar 6 java rest spring spring-boot microservices
我正在使用当前的Spring引导版本(1.4.x),想知道它是否对api调用有任何默认超时。我已经通过设置断点对其进行了测试,但是它一直处于等待状态,并且没有超时。我还尝试通过使用一些注释或yml设置为所有spring-boot应用程序配置默认超时。
我发现了几种替代方法(这里是其中一种),但是使用可调用的方法实际上会添加额外的非业务逻辑代码,其中在xml bean中设置某些内容在最新的Spring Boot应用程序中已经过时了。
有几种方法可以做到这一点:
1)ClientHttpRequestFactory与以下一起使用RestTemplate:
public RestTemplate restTemplate() {
return new RestTemplate(clientHttpRequestFactory());
}
private ClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(timeinMillis);
factory.setConnectTimeout(timeinMillis);
return factory;
}
Run Code Online (Sandbox Code Playgroud)
2)第二种方法是使用可调用的,但我想您已经探索过该解决方案。
您可以尝试server.connection-timeout=5000使用application.properties。根据官方文档:
server.connection-timeout =#连接器在关闭连接之前将等待另一个HTTP请求的时间(以毫秒为单位)。未设置时,将使用连接器特定于容器的默认值。使用值-1表示没有(即无限)超时。
更新:刚注意到您使用微服务体系结构,因此,如果在微服务之间进行通信时需要处理超时,我建议在客户端而不是服务器端进行处理。如果您尝试调用的微服务超载,并且其性能下降到严重影响用户体验的程度,那么有时返回一些后备数据比丢弃请求更好。
想象一下,我们有一个具有微服务架构的电子商务网站,而向用户提供建议的微服务之一变得非常慢。在这种情况下,首选解决方案是返回一些后备数据,这些数据可能是本月最受欢迎的10种产品,而不是向客户显示5xx错误页面。此外,如果后续请求因超时而失败,我们可以做出决定,避免将请求发送到“推荐服务”并立即返回后备数据。一段时间后,我们可以尝试再次向“推荐服务”发送请求,如果请求正常,则可以使用它代替后备数据。
这称为断路器模式,并且已经在称为Hystrix的框架中实现了该模式。这是一篇很好的文章,对其进行了深入的解释:http : //www.baeldung.com/spring-cloud-netflix-hystrix。Spring Cloud Feign + Spring Cloud Hystrix看起来非常不错,特别是考虑到它们与现成的发现服务(例如Spring Cloud Eureka)一起使用。
我同意上述所有选项,并在我的 Spring Boot 应用程序中尝试了以下选项。它现在工作得很好。下面是作为 bean 的代码示例。现在只需要到@Autowire RestTemplate任何java class我需要的地方()。
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setConnectTimeout(15000);
((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setReadTimeout(15000);
return restTemplate;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30038 次 |
| 最近记录: |