SpringCloud(3) 请求熔断、服务降级Hystrix-补充

Hystrix熔断的状态说明:如果服务没有问题即是"关闭"状态,阀值是指请求的次数,比如说阀值是100每10s有<100次的请求那么不会检测,如果请求次数>100那么会进行检测,如果成功比例<50%那么打开开关进入"打开"状态,当熔断器时间窗结束会进入"半开"状态,此时进行请求检测,如果成功则变为"关闭"状态,否则还是恢复为"打开"状态。

可控参数:阀值、检测时间、熔断器时间

请求降级存在的问题:

当请求降级的时候会去执行Fallback方法,那么如果Fallback方法中还存在网络请求,而且该网络请求也失败了该怎么处理?

  可以进行二次降级,给Fallback方法上加上@HystrixCommand注解,这样的话最后一级的Fallback一定不能有网络请求。

当请求降级的时候会去执行Fallback方法异常如何捕获?

  可以给Fallback方法加上Throwable类型参数。

在@HystrixCommand注解中可以配置忽略指定异常的参数。

 

依赖隔离:

@HystrixCommand(groupKey = "",threadPoolKey = "")
在注解中加上这两个参数,第一个是用来分组,每组调用同一个线程池。
第二个参数是每组中的细致划分(组一样但是任务不一样)。

请求缓存:

  Hystrix的缓存是缓存在Request域的,个人感觉有点鸡肋。。。

示例:

还是使用之前写的例子,使用最简单的那个自定义 hystrixServiceCommand 

 

需要在command中重写这个方法

@Override
protected String getCacheKey() {
return "hello";
}

controller层:
@RequestMapping("/hystrix")
public String helloHystrix(){
//初始化上下文,如果不加这个或报错,所以这个缓存是缓存到request域中的
HystrixRequestContext.initializeContext();
hystrixServiceCommand command = new hystrixServiceCommand("hello",restTemplate);
String execute = command.execute();
return execute;
}
然后启动各个服务,访问这个地址,并不断刷新页面,发现并没有使用缓存因为缓存是在Request域中的。
那么为了演示效果,改动代码如下:
注意这里必须要new两个command,一个command只能执行一次execute。代码经过这样改动之后可以看到请求缓存。
@RequestMapping("/hystrix")
public String helloHystrix(){
List<String> list = new ArrayList();
//初始化上下文,如果不加这个或报错,所以这个缓存是缓存到request域中的
HystrixRequestContext.initializeContext();
hystrixServiceCommand command = new hystrixServiceCommand("hello",restTemplate);
String execute = command.execute();
hystrixServiceCommand command1 = new hystrixServiceCommand("hello",restTemplate);
String execute1 = command1.execute();
list.add(execute);
list.add(execute1);
return list.toString();
}
请求合并
=============================未完,待补充==================================
posted @ 2018-08-01 22:45  Gggoblin  阅读(550)  评论(0编辑  收藏  举报