以下为博主写Hystrix系列的文章列表
点击查看 Hystrix入门
点击查看 Hystrix命令执行
点击查看 Hystrix处理异常机制(降级方法)
默认情况下,命令名称来源于类名。
getClass().getSimpleName();
如果要显示定义名称的话,可以通过 HystrixCommand
或者 HystrixObservableCommand
的构造函数:
public HystrixHelloWorldCommand(String name) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("Command Group: Hello World"))
.andCommandKey(HystrixCommandKey.Factory.asKey("Command Name: Hello World")));
this.name = name;
}
为了给每个命令集合保存Setter配置,可以缓存Setter,示例如下:
private static final Setter cachedSetter =
Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
.andCommandKey(HystrixCommandKey.Factory.asKey("Cache Setter: Hello World"));
public HystrixHelloWorldCommand(String name) {
super(cachedSetter);
this.name = name;
}
HystrixCommandKey
是一个接口,可以作为枚举或者普通类实现。其实它有一个辅助工厂类,示例如下:
HystrixCommandKey.Factory.asKey("Command Name: Hello World")
HystrixCommandKey
源码如下:
public interface HystrixCommandKey extends HystrixKey {
public static class Factory {
private static final InternMap intern = new InternMap(new ValueConstructor() {
public HystrixCommandKey.Factory.HystrixCommandKeyDefault create(String key) {
return new HystrixCommandKey.Factory.HystrixCommandKeyDefault(key);
}
});
private Factory() {
}
public static HystrixCommandKey asKey(String name) {
return (HystrixCommandKey)intern.interned(name);
}
static int getCommandCount() {
return intern.size();
}
private static class HystrixCommandKeyDefault extends HystrixKeyDefault implements HystrixCommandKey {
public HystrixCommandKeyDefault(String name) {
super(name);
}
}
}
}
点击查看源码和单元测试
Hystrix使用命令分组将一起的命令进行管理,比如报告、警报、仪表盘或组/库。默认情况下,Hystrix使用 HystrixCommandGroupKey
来定义命令线程池,除非单独定义线程池。
HystrixCommandGroupKey
是一个接口,可以作为枚举或者普通类实现。其实它有一个辅助工厂类,示例如下:
HystrixCommandGroupKey.Factory.asKey("Command Group: Hello World")
HystrixCommandGroupKey
源码如下:
public interface HystrixCommandGroupKey extends HystrixKey {
public static class Factory {
private static final InternMap intern = new InternMap(new ValueConstructor() {
public HystrixCommandGroupKey.Factory.HystrixCommandGroupDefault create(String key) {
return new HystrixCommandGroupKey.Factory.HystrixCommandGroupDefault(key);
}
});
private Factory() {
}
public static HystrixCommandGroupKey asKey(String name) {
return (HystrixCommandGroupKey)intern.interned(name);
}
static int getGroupCount() {
return intern.size();
}
private static class HystrixCommandGroupDefault extends HystrixKeyDefault implements HystrixCommandGroupKey {
public HystrixCommandGroupDefault(String name) {
super(name);
}
}
}
}
点击查看源码和单元测试
线程池主要体现是用于监测、指标发布、缓存和其他此类用途的HystrixThreadPool。 一个HystrixCommand与一个单独注入到它的HystrixThreadPoolKey所检索到的HystrixThreadPool相关联, 或者默认为使用HystrixCommandGroupKey的创建一个 。
如果要显示定义名称的话,可以通过 HystrixCommand
或者 HystrixObservableCommand
的构造函数:
public HystrixHelloWorldCommand(String name) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("Command Group: Hello World"))
.andCommandKey(HystrixCommandKey.Factory.asKey("Command Name: Hello World"))
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("Command ThreadPool: Hello World")));
this.name = name;
}
HystrixThreadPoolKey
是一个接口,可以作为枚举或者普通类实现。其实它有一个辅助工厂类,示例如下:
HystrixThreadPoolKey.Factory.asKey("Command ThreadPool: Hello World")
HystrixThreadPoolKey
源码如下:
public interface HystrixThreadPoolKey extends HystrixKey {
class Factory {
private Factory() {
}
private static final InternMap intern
= new InternMap(
new InternMap.ValueConstructor() {
@Override
public HystrixThreadPoolKey create(String key) {
return new HystrixThreadPoolKeyDefault(key);
}
});
public static HystrixThreadPoolKey asKey(String name) {
return intern.interned(name);
}
private static class HystrixThreadPoolKeyDefault extends HystrixKeyDefault implements HystrixThreadPoolKey {
public HystrixThreadPoolKeyDefault(String name) {
super(name);
}
}
static int getThreadPoolCount() {
return intern.size();
}
}
}
可能使用HystrixThreadPoolKey而不仅仅是不同的HystrixCommandGroupKey的原因是多个命令可能属于相同的所有权或逻辑功能的“组”,但是某些命令可能需要彼此隔离。
简单示例如下:
如果命令A的线程池潜在并且饱和,它就不应该阻止命令B访问资源,因为他们互相命中不同的后端资源。因此,我们在逻辑上希望这些命令组合在一起,但希望它们以不同的方式隔离,并使用 HystrixThreadPoolKey
来给它们每个线程池提供一个不同的线程池。
点击查看源码和单元测试
转帖请注明原贴地址 : https://my.oschina.net/u/2342969/blog/1816623