Spring Cloud Hystrix 在第一次命令调用时失败

Posted

技术标签:

【中文标题】Spring Cloud Hystrix 在第一次命令调用时失败【英文标题】:Spring Cloud Hystrix fails at first command call 【发布时间】:2016-07-04 11:13:17 【问题描述】:

我注意到第一个 Hystrix 命令总是调用我的后备命令,之后以下调用在 Spring Cloud Netflix 中运行良好。

我应该设置任何设置来避免它吗?为什么会这样?

【问题讨论】:

只有在出现异常时才会调用回退。如果你想获得更多的洞察力,我想你需要分享代码。 问题是相同的方法在第二次调用中工作正常,问题仅针对第一个。我读到有关热身的文章,但没有找到任何解决方案。 添加其他详细信息(代码、配置等)以准确突出您需要的内容。 这里是场景:服务启动,eureka server显示dashboard上注册的服务,启动UI客户端,调用hystrix方法时触发fallback方法。在第二次调用 hystrix 方法时,feign 客户端工作正常并从远程服务获取响应。你能试试这个场景看看会发生什么吗? 【参考方案1】:

我通过 fallback 方法再次发送失败的请求来解决这个问题,这次使用DicoveryClient 查找远程 pod 之一的 IP:

private String getNameFallback(int delay) 
    RestTemplate rt = new RestTemplate();
    return rt.getForObject(getUrl(delay), String.class);


private String getUrl(int delay) 
    String url = String.format("http://%s/name?delay=%d", SERVICE_ID, delay);
    if (discoveryClient != null) 
        Optional<ServiceInstance> svc = discoveryClient.getInstances(SERVICE_ID).stream().findFirst();
        if (svc.isPresent()) 
            String host = svc.get().getHost();
            int port = svc.get().getPort();
            url = "http://" + host + ":" + port + "?delay=" + delay;
        
    
    return url;

您可以找到更多详情here

【讨论】:

【参考方案2】:

看起来像基础设施初始化的副作用,并且在它上面超时https://groups.google.com/d/msg/hystrixoss/_jnxAyS20lA/fWo0ZAHoxt8J

【讨论】:

是的,我看到了...但其中没有解释解决方案。我该如何解决? 猜这个问题没有通用的解决方案:(github.com/Netflix/Hystrix/issues/810。当然你可以尝试为“手动预热”设置大多数超时,但不确定这是个好主意。 如何设置此手册预热?为什么不是一个好主意? tks. 理论上,您可以尝试为少数第一次请求设置更大的超时并将其设置为默认值,但这是一个非常糟糕的主意,因为您正在尝试解决应用程序 lvl 上 IO 中的问题。在应用程序启动时跳过几个超时错误或忽略第一次发生的错误呢? 这听起来像是解决第一次异常的解决方法,这在 hytrix 中真的很尴尬。为什么有人会投射这种行为?

以上是关于Spring Cloud Hystrix 在第一次命令调用时失败的主要内容,如果未能解决你的问题,请参考以下文章

解决Spring Cloud中Feign第一次请求失败的问题

Spring Cloud (10) Hystrix-监控面板

Spring Cloud第八篇 | Hystrix集群监控Turbine

spring cloud: Hystrix:Hystrix的断容器监控dashboard

解决Spring Cloud中Feign/Ribbon第一次请求失败的方法

spring cloud 学习 - hystrix 服务熔断处理