下游服务恢复后Hystrix电路未关闭

时间:2016-05-10 14:56:21

标签: spring-boot spring-cloud hystrix spring-cloud-netflix circuit-breaker

我和Josh Long一起玩bootiful-microservice project。 (Brixton子项目)

在预订服务上,我添加了一个简单的状态方法,可以在一段可配置的时间内模拟负载:

@RequestMapping(method = RequestMethod.GET, value = "/status")
public String status(){
    System.out.println("Checking status");
    try {
        Thread.sleep((long) (rand.nextDouble()*sleepTime));
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "All is good";
}

从{Spring}配置服务器

中提取sleepTime变量

在预订客户端,我在网关中添加了一个入口点:

@FeignClient("reservation-service")
interface ReservationReader {

    @RequestMapping(method = RequestMethod.GET, value = "/reservations")
    Resources<Reservation> readReservations();

    @RequestMapping(method = RequestMethod.GET, value = "/status")
        String status();
    }
}

我正在使用HystrixCommand

@HystrixCommand(fallbackMethod = "statusFallback")
@RequestMapping(method = RequestMethod.GET, value = "/status")
public String status(){
    return reader.status();
}

public String statusFallback(){
    return "Bad";
}

这一切都运作良好。

我将休眠时间设置为1500毫秒,以便某些请求高于Hystrix默认阈值(1000毫秒)。

当我开始点击API时,由于超时而导致一些失败。如果我打得足够长(50次似乎工作),断路器触发器和电路就会打开:

Hystrix Dashboard

我的理解是,当下游服务再次变得健康时,Hystrix将尝试路由1个呼叫并将其用作健康检查。如果呼叫成功,电路应该再次关闭。

然而,这并没有发生在这里。即使将睡眠时间更改为较小的值(比如500ms),电路仍将保持打开状态。我的所有呼叫都没有路由到预订服务,并且每次呼叫都使用了回退。我可以让电路再次关闭的唯一方法是重启预订客户端服务。

我错过了什么吗?这是Hystrix的问题吗?或者使用Spring Integration?

更新

我做了进一步测试,即使睡眠减少,我也可以确认电路将永远保持接近。

但是,如果我在Zuul配置中使用路由,我会得到预期的行为。如果它看到一个没有超时的请求,电路就会自行关闭。

我注意到路由比较转发与在Spring中手动执行它之间的另一个区别。如果我创建了一个过滤器,则客户端上的/ status / call不会触发过滤器。当我设置路线(例如/ foos / status =&gt; / status)时,它将触发过滤器并且Hystrix表现正常。

这是春天的错误吗?

0 个答案:

没有答案