当前位置: 首页 > 知识库问答 >
问题:

使用restTemplate的带Ribbon/Eureka/Hystrix的spring-cloud无法设置连接/读取超时

姬捷
2023-03-14

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

电话详情:

`@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默认值。也许这还没有建成。

共有1个答案

桂志诚
2023-03-14

您正在注入的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/ribbonautocomfiguration.java)。超时和其他属性通过ClienthtPrequestRestTemplate中控制。您可能只需将RibbonInterceptor插入到自己的RESTTemplate中,并设置ClienthtPrequestFactory来执行超时操作,例如。

@Component
class EricComponentToDoHystrix {
    private RestTemplate restTemplate;
    @Autowired
    public EricComponentToDoHystrix(RibbonInterceptor interceptor) {
         restTemplate = new RestTemplate();
         restTemplate.setInterceptors(Arrays.asList(interceptor));
         restTemplate.setRequestFactory(...);
    }
}
 类似资料:
  • introduction 在上一篇中阐述了ribbon的基本用法,但是可以发现服务列表是通过配置得来的,实际 情况通常是由负载均衡+服务发现来实现的,通过服务发现获取服务列表,负载均衡通过rule选择要调用的服务。服务发现可以通过eureka来实现,后期会讲解利用consul做服务发现。 eureka discovery service eureka服务发现在前面的文章中已经提供到,这里直接给出代

  • 我正在使用Tomcat JDBC连接池和MariaDB JDBC驱动程序在Cloud Foundry上运行的Spring Boot/Spring Cloud Connectors项目中设置数据源,如下所示: 出于某种原因,DataSource bean只接收引用池大小和maxWait的属性,而不接收connectionProperties-请参见日志输出: 注意:试图通过Spring的Connec

  • 我成功地使用Eureka让我的RestTemplate客户端发现远程服务,并使用Ribbon将调用转发给它,如文档中所述。基本上,只需为我的应用程序类添加以下注释,然后让Spring Boot的魔力完成其余部分: (注:您注意到我使用的是spring云:1.0.0-SNAPSHOT-BUILD,而不是1.0.0.M3-但这似乎不会影响我的问题)。 当两个服务实例启动时,rest模板客户端成功地在两

  • 我有一个API返回一个json,它是GET方法类型的。因为它是GET,所以当我在浏览器中打开URL时,它可以正常工作并呈现json,但是,当使用RestTemplate检索json时,它失败了。 能否请您提供一种阅读以下API的方法。 API URL:https://www.nseindia.com/API/option-chain-indexs?symbol=nifty Spring BootR

  • 当使用包含Ribbon客户端的Hystrix命令时,您需要确保您的Hystrix超时配置为长于配置的Ribbon超时,包括可能进行的任何潜在的重试。例如,如果您的Ribbon连接超时为一秒钟,并且Ribbon客户端可能会重试该请求三次,那么您的Hystrix超时应该略超过三秒钟。 如何包含Hystrix仪表板 要在项目中包含Hystrix仪表板,请使用组org.springframework.cl

  • 问题内容: 在jersey 1中,我们在类中具有一个函数setConnectTimeout。 在球衣2中,缺少此功能的地方使用该类。 如何在jersey 2.x中设置连接超时并读取超时? 问题答案: 下面的代码在Jersey 2.3.1中对我有用(灵感在这里找到:https :