通过简单了解Hystrix的舱壁隔离这篇博文,可以了解到划分独立线程池是Hystrix实现舱壁隔离的手段之一。
怎么划分线程池
- 以继承方式实现的 Hystrix 命令使用类,在该类的构造函数里划分线程池
- 用注解的方式划分线程池
以继承方式实现的 Hystrix 命令使用类,在该类的构造函数里划分线程池
public class DemoCommand extends HystrixCommand {
public DemoCommand() {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("group1"))
.andCommandKey(HystrixCommandKey.Factory.asKey("democomand"))
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("demo")));
}
-
Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(“group1”)
这步是为了设置组名,在没有做更细粒度的线程池划分的时候,Hystrix会让组名相同的命令使用同一个线程池。 -
andCommandKey(HystrixCommandKey.Factory.asKey(“democomand”))
这步是设置命令名称,没有设置的话默认用的是类名 -
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey(“demo”)));
这步做了更细粒度的线程池划分,使用起来更加灵活,建议尽量使用这个方式来划分线程池
用注解的方式划分线程池
@HystrixCommand(groupKey = "group1", commandKey = "democomand", threadPoolKey = "demo")
public User democomand(String name) throws Exception {
。。。
}