摘要:还提供来对线程池进行设置,通过它可以实现更细粒度的线程池划分。通常情况下,我们尽量使用来指定线程池的划分。注解使用注解时只需要设置注解的以及属性即可,他分别表示了命令名称分组以及线程池划分。
异常处理 异常传播
在HystrixCommand实现的run()方法中抛出异常时,除了HystrixBadRequestException之外,其他异常均会被Hystrix认为命令执行失败并触发服务降级的处理逻辑,所以当需要在命令执行中抛出不触发服务降级的异常时来选择它。
在使用注解配置实现Hystrix命令时,可以忽略指定的异常类型,只需要通过设置@HystrixCommand注解的ignoreExceptions参数,如下:
@HystrixCommand(fallbackMethod = "getDefaultUser", ignoreExceptions = NullPointerException.class) public User findUserById(Long id) { return restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id); }
当上述方法抛出NullPointerException的异常时,不会触发后续的fallback逻辑。
异常获取在传统的继承实现Hystrix命令时,可以在getFallback()方法中通过getExecutionException()方法来获取具体的异常,然后通过判断来进入不同的处理逻辑。
在注解配置方式中,只需要在fallback实现方法的参数中增加Throwable e对象的定义,这样在方法内部就可以获取触发服务降级的具体异常内容。
命令名称、分组和线程池划分 继承实现自定义命令public UserCommand(RestTemplate restTemplate, Long id) { super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("GroupName")).andCommandKey(HystrixCommandKey.Factory.asKey("CommandName"))); this.restTemplate = restTemplate; this.id = id; }
从上面的代码中可以看出,我们并没有直接设置命令名称,而是先调用了withGroupKey来设置命令组名,然后才通过调用andCommandKey来设置命令名。
在Setter中只有withGroupKey静态函数可以创建Setter的实例,因此GroupKey是每个Setter必须的参数,而CommandKey则是一个可选参数。
通过设置命令组,Hystrix会根据组来组织和统计命令的告警、仪表盘等信息。除了上述可以统计信息之外,Hystrix命令默认的线程划分也是根据命令分组来实现的。默认情况下,Hystrix会让相同组名的命令使用同一个线程池,所以我们需要在创建Hystrix命令时为其指定命令组名来实现默认的线程池划分。
Hystrix还提供HystrixThreadPoolKey来对线程池进行设置,通过它可以实现更细粒度的线程池划分。
public UserCommand(RestTemplate restTemplate, Long id) { super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("GroupName")) .andCommandKey(HystrixCommandKey.Factory.asKey("CommandName")) .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("ThreadPoolKey"))); this.restTemplate = restTemplate; this.id = id; }
在没有指定HystrixThreadPoolKey的情况下,会使用命令组的方式来划分线程池。通常情况下,我们尽量使用HystrixThreadPoolKey来指定线程池的划分。因为多个不同的命令可能从业务逻辑上来看属于同一个组,但是往往从实现本身上需要跟其他命令来进行隔离。
@HystrixCommand注解使用注解时只需要设置注解的commandKey、groupKey以及threadPoolKey属性即可,他分别表示了命令名称、分组以及线程池划分。
@HystrixCommand(fallbackMethod = "getDefaultUser", ignoreExceptions = NullPointerException.class, commandKey = "findUserById", groupKey = "UserGroup", threadPoolKey = "findUserByIdThread") public User findUserById(Long id) { return restTemplate.getForObject("http://USER-SERVICE/users/{1}", User.class, id); }代码地址
spring-cloud-example
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77034.html
摘要:在舱壁模式中可以隔离每个远程资源,并分配各自的线程池,使之互不影响。 springcloud 总集:https://www.tapme.top/blog/detail/2019-02-28-11-33 本次用到全部代码见文章最下方。 一、为什么要有客户端弹性模式 所有的系统都会遇到故障,分布式系统单点故障概率更高。如何构建应用程序来应对故障,是每个软件开发人员工作的关键部分。但是通...
摘要:断路器本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,断路器能够及时的切断故障电路,防止发生过载发热甚至起火等严重后果。具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。 转载请注明出处 http://www.paraller.com 代码机制:熔断 & Fallback & 资源隔离 熔断 概念: 在微服务架构中,我们将系...
摘要:服务雪崩效应是一种因服务提供者的不可用导致服务消费者的不可用并将不可用逐渐放大的过程。这种代理能够记录最近调用发生错误的次数,然后决定使用允许操作继续,或者立即返回错误。这个自己持有的上下文默认实现类也是。 本篇集成Hystrix,继续搭建demo。 雪崩效应:在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为...
阅读 2192·2021-09-24 10:31
阅读 3797·2021-09-22 15:16
阅读 3349·2021-09-22 10:02
阅读 970·2021-09-22 10:02
阅读 1769·2021-09-08 09:36
阅读 1946·2019-08-30 14:18
阅读 582·2019-08-30 10:51
阅读 1837·2019-08-29 11:08