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

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

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

【问题讨论】:

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

标签: java spring spring-boot spring-cloud hystrix


【解决方案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 中真的很尴尬。为什么有人会投射这种行为?
    猜你喜欢
    • 2019-01-21
    • 2015-12-05
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多