Hystrix熔断的状态说明:如果服务没有问题即是"关闭"状态,阀值是指请求的次数,比如说阀值是100每10s有<100次的请求那么不会检测,如果请求次数>100那么会进行检测,如果成功比例<50%那么打开开关进入"打开"状态,当熔断器时间窗结束会进入"半开"状态,此时进行请求检测,如果成功则变为"关闭"状态,否则还是恢复为"打开"状态。
可控参数:阀值、检测时间、熔断器时间
请求降级存在的问题:
当请求降级的时候会去执行Fallback方法,那么如果Fallback方法中还存在网络请求,而且该网络请求也失败了该怎么处理?
可以进行二次降级,给Fallback方法上加上@HystrixCommand注解,这样的话最后一级的Fallback一定不能有网络请求。
当请求降级的时候会去执行Fallback方法异常如何捕获?
可以给Fallback方法加上Throwable类型参数。
在@HystrixCommand注解中可以配置忽略指定异常的参数。
依赖隔离:
@HystrixCommand(groupKey = "",threadPoolKey = "")在注解中加上这两个参数,第一个是用来分组,每组调用同一个线程池。第二个参数是每组中的细致划分(组一样但是任务不一样)。
请求缓存:
Hystrix的缓存是缓存在Request域的,个人感觉有点鸡肋。。。
示例:
还是使用之前写的例子,使用最简单的那个自定义 hystrixServiceCommand
需要在command中重写这个方法
@Overrideprotected 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();}请求合并
原文地址:https://www.cnblogs.com/sleepy-goblin/p/9404440.html
时间: 2024-10-07 14:50:13