博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hystrix异常处理及线程池划分
阅读量:6707 次
发布时间:2019-06-25

本文共 2287 字,大约阅读时间需要 7 分钟。

异常处理

异常传播

在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);    }

代码地址

转载地址:http://jzslo.baihongyu.com/

你可能感兴趣的文章
【NetApp】VSC设置guest OS timeout值的一些建议
查看>>
POJ-2509(Water,Greedy)
查看>>
window.showModalDialog父子窗口参数传递
查看>>
CSS实现三角兼容ie6
查看>>
2011.8.19
查看>>
登录mysql无需帐号和密码
查看>>
CCNA学习指南 第八章 下载
查看>>
【CentOS】ntpdate: 未找到命令, crontab
查看>>
第二天、Linux基础知识和命令(01)
查看>>
PHP企业级应用缓存技术详解
查看>>
No issues are currently visible Jira kanban看板
查看>>
maven3.5.0 安装
查看>>
POJ 3984 迷宫(BFS)
查看>>
韩剧壁纸包
查看>>
hdu 3065 病毒侵袭持续中 AC自动机
查看>>
2015年10月18日-10月24日作业:mairadb, vsftp, nfs, samb
查看>>
我的友情链接
查看>>
APUE读书笔记-15进程内部通信-07消息队列
查看>>
JVM
查看>>
获取img元素图片的实际尺寸
查看>>