如下为博主写Hystrix系列的文章列表html
点击查看 Hystrix入门java
点击查看 Hystrix命令执行git
点击查看 Hystrix处理异常机制(降级方法)github
默认状况下,命令名称来源于类名。后端
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,示例以下:ide
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<String, HystrixCommandKey.Factory.HystrixCommandKeyDefault> intern = new InternMap(new ValueConstructor<String, HystrixCommandKey.Factory.HystrixCommandKeyDefault>() { 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<String, HystrixCommandGroupKey.Factory.HystrixCommandGroupDefault> intern = new InternMap(new ValueConstructor<String, HystrixCommandGroupKey.Factory.HystrixCommandGroupDefault>() { 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<String, HystrixThreadPoolKey> intern = new InternMap<String, HystrixThreadPoolKey>( new InternMap.ValueConstructor<String, HystrixThreadPoolKey>() { @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