我和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将尝试路由1个呼叫并将其用作健康检查。如果呼叫成功,电路应该再次关闭。
然而,这并没有发生在这里。即使将睡眠时间更改为较小的值(比如500ms),电路仍将保持打开状态。我的所有呼叫都没有路由到预订服务,并且每次呼叫都使用了回退。我可以让电路再次关闭的唯一方法是重启预订客户端服务。
我错过了什么吗?这是Hystrix的问题吗?或者使用Spring Integration?
更新
我做了进一步测试,即使睡眠减少,我也可以确认电路将永远保持接近。
但是,如果我在Zuul配置中使用路由,我会得到预期的行为。如果它看到一个没有超时的请求,电路就会自行关闭。
我注意到路由比较转发与在Spring中手动执行它之间的另一个区别。如果我创建了一个过滤器,则客户端上的/ status / call不会触发过滤器。当我设置路线(例如/ foos / status =&gt; / status)时,它将触发过滤器并且Hystrix表现正常。
这是春天的错误吗?