Hystrix是一个简单易用的熔断中间件,本篇文章会介绍下常规的使用方式。
目录
helloWorld初窥Hystrix
HystrixCommand基本配置、同步和异步执行
request cache的使用
fallback
default fallback
单级fallback
多级fallback
主次多HystrixCommand fallback
接入现有业务
总结
helloWorld初窥Hystrix
先贴代码
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
public class CommandHelloWorld extends HystrixCommand {
private final String name;
public CommandHelloWorld(String name) {
super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
this.name = name;
}
@Override
protected String run() {
return "Hello " + name + "!";
}
}
代码很简单,声明一个类CommandHelloWorld,集成HystrixCommand, HystrixCommand携带泛型,泛型的类型就是我们的执行方法run()返回的结果的类型。逻辑执行体就是run方法的实现。
构造方法至少要传递一个分组相关的配置给父类才能实现实例化,具体用来干什么的后面会描述。
下面测试一下
public class CommandHelloWorldTest {
@Test
public void test_01(){
String result = new CommandHelloWorld("world").execute();
Assert.assertEquals("Hello world!",result);
}
}
就这样第一个hellworld就跑起来,so easy
HystrixCommand基本配置、同步和异步执行
1.HystrixCommand、Group、ThreadPool 配置
Hystrix把执行都包装成一个HystrixCommand,并启用线程池实现多个依赖执行的隔离。
上面的代码集成了HystrixCommand并实现了类似分组key的构造方法,那么分组是用来做什么呢?还有没有其他类似的东西?怎么没有看到线程配置呢?
Hystrix每个command都有对应的commandKey可以认为是command的名字,默认是当前类的名字getClass().getSimpleName(),每个command也都一个归属的分组,这两个东西主要方便Hystrix进行监控、报警等。
HystrixCommand使用的线程池也有线程池key,以及对应线程相关的配置
下面是代码的实现方式
自定义command key
HystrixCommandKey.Factory.asKey("HelloWorld")
自定义command group
HystrixCommandGroupKey.Factory.asKey("ExampleGroup")
那么线程池呢?
HystrixThreadPoolKey.Factory.asKey("HelloWorldPool")
Hystrix command配置有熔断阀值,熔断百分比等配置,ThreadPoll有线程池大小,队列大小等配置,如何设置?
Hystrix的配置可以通过Setter进行构造
public CommandHelloWorld(){
super(Setter
//分组key
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("helloWorldGroup"))
//commandKey
.andCommandKey(HystrixCommandKey.Factory.asKey("commandHelloWorld"))
//command属性配置
.andCommandPropertiesDefaults(HystrixPropertiesCommandDefault.Setter().withCircuitBreakerEnabled(true).withCircuitBreakerForceOpen(true))
//线程池key
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("helloWorld_Poll&