spring-cloud with ribbon / eureka / hystrix使用restTemplate无法设置连接/读取超时

时间:2014-10-09 18:20:53

标签: spring-cloud

我使用spring-cloud构建了一个spring boot应用程序,并希望在我的客户端应用程序(也是一个微服务)中使用RestTemplate,这样我就可以继续使用mockMvc进行集成测试。我正在使用我正在调用的服务中的客户端微服务和eureka客户端的默认ribbon / eureka / hystrix客户端设置。这是有效的(一旦我发现serviceIds是标识restTemplate中的服务端点的东西)。我的问题是,我似乎无法更改restTemplate读取和连接超时,似乎默认为300毫秒。

电话详情:

`@Configuration
 @EnableAutoConfiguration
 @ComponentScan
 @EnableConfigurationProperties
 @EnableHystrix
 @EnableEurekaClient
public class Application { ... public static void main(String[] args) {} ... }

@Component
class EricComponentToDoHystrix {   // apparently this has to be a component for hystrix to work btw
    @Autowired
    RestTemplate restTemplate;
    ..
    @HystrixCommand(fallbackMethod="defaultRestTemplateCall")
    public void doRestTemplateCall() 
        ResponseEntity<String> result = restTemplate.getForEntity("http://someservice/doSomething", String.class);  // actually make a call
    ..
    }
}`

使用包含以下内容的application.properties:

spring:
  cloud:
    client:
      serviceIds:
        - someservice

someservice:
  ribbon:
    #listOfServers: localhost:7080
    #NIWSServerListClassName: com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList

    # the eureka vipAddress of the target service (Disabled)
    DeploymentContextBasedVipAddresses: someservice

    # Interval to refresh the server list from the source
    ServerListRefreshInterval: 1000

    # Connect timeout used by Apache HttpClient.. apparently not by restTemplate 
    ConnectTimeout: 30000

    # Read timeout used by Apache HttpClient.. apparently not by restTemplate
    ReadTimeout: 30000

eureka:
  client:
    #Region where eureka is deployed -For AWS specify one of the AWS regions, for other datacenters specify a arbitrary string
    #indicating the region.This is normally specified as a -D option (eg) -Deureka.region=us-east-1
    region: default

    #For eureka clients running in eureka server, it needs to connect to servers in other zones
    preferSameZone: false

    us-east-1:
      availabilityZones: default

  instance:
    #Virtual host name by which the clients identifies this service
    virtualHostName: ${spring.application.name}
    appGroupName: ericGroup


# disable Ribbon's cicruit breaker and rely soley on Hystrix.
# this helps to avoid confusion.
# see https://github.com/Netflix/ribbon/issues/15
niws:
  loadbalancer:
    availabilityFilteringRule:
      filterCircuitTripped: false

有人知道我需要什么属性,所以设置修改restTemplate的默认超时?关于这个主题的文档非常清楚,最近的代码似乎甚至允许restTemplate用于对比ribbon / eureka spring boot默认值。也许这还没有建成。

2 个答案:

答案 0 :(得分:6)

您注入的RestTemplate完全是普通的,除了RibbonInterceptor为您选择URI中的物理主机(请参阅https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonAutoConfiguration.java)。超时和其他属性由RestTemplateClientHttpRequest控制。您可能应该将RibbonInterceptor注入您自己的RestTemplate并设置ClientHttpRequestFactory来执行超时,例如

@Component
class EricComponentToDoHystrix {
    private RestTemplate restTemplate;
    @Autowired
    public EricComponentToDoHystrix(RibbonInterceptor interceptor) {
         restTemplate = new RestTemplate();
         restTemplate.setInterceptors(Arrays.asList(interceptor));
         restTemplate.setRequestFactory(...);
    }
}

答案 1 :(得分:1)

由于我无法评论,我会回答。 RestTemplate集成仅使用Ribbon LoadBalancer,而不是RestClient或NFHttpClient。

你不再需要spring.cloud.client.serviceIds,顺便说一句。如果是在docs中,我将删除它。