概述
public class RestTemplateHystrixCommand extends HystrixCommand {
private String key ;
public RestTemplateHystrixCommand(String group,String key,String url,int threadSize) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(group))
.andCommandKey(HystrixCommandKey.Factory.asKey(key))
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey(url))
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutEnabled(true)
.withExecutionTimeoutInMilliseconds(6000) //包括在等待中的时间
.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)
.withRequestCacheEnabled(true)
)
.andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter()
.withCoreSize(threadSize).withMaxQueueSize(5).withQueueSizeRejectionThreshold(3)
));
this.key = key;
}
@Override
protected String getCacheKey(){
return this.key;
}
@Override
protected Boolean run() throws Exception {
System.out.println("执行了一个请求");
Thread.sleep(5000);
return true;
}
@Override
protected Boolean getFallback() {
log.info("请求失败");
return false;
}
public static void main(String[] args) {
Executor executor = Executors.newFixedThreadPool(30);
HystrixRequestContext context = HystrixRequestContext.initializeContext();
for(int i = 0; i<20 ;i++) {
HystrixContextRunnable runnable =new HystrixContextRunnable(() -> {
HystrixRequestContext context1 = HystrixRequestContext.getContextForCurrentThread();
System.out.println("context is null " + (context1 == null));
RestTemplateHystrixCommand restTemplateHystrixCommand =
new RestTemplateHystrixCommand("bws", "jx", "localhost", 5);
Boolean result = (Boolean) restTemplateHystrixCommand.execute();
System.out.println("任务:" + "执行结果" + result + "是否获取了缓存结果:" + restTemplateHystrixCommand.isResponseFromCache);
});
executor.execute(runnable);
}
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
context.shutdown();
}
}
注意点 TimeoutInMilliseconds 是包括在队列中等待的时间
如果想使用缓存结果,
单线程情况:
初始化请求上下文
HystrixRequestContext context = HystrixRequestContext.initializeContext();
并重写getCacheKey方法
多线程情况:
子线程要使用
HystrixContextRunnable或HystrixContextCallable去创建,
并且父线程的 context 要在所有子线程执行结束后再调用 context.shutdown
Hystrix配置说明
- 统计滚动的时间窗口 default 10000 ten seconds
withMetricsRollingStatisticalWindowInMilliseconds(10000) - 滚动时间窗口 bucket 数量 default
withMetricsRollingStatisticalWindowBuckets(10) - 采样时间间隔 default 500
withMetricsHealthSnapshotIntervalInMilliseconds(1) - 熔断器在整个统计时间内是否开启的阀值,默认20。也就是10秒钟内至少请求20次,熔断器才发挥起作用
withCircuitBreakerRequestVolumeThreshold(20) - 默认:50。当出错率超过50%后熔断器启动.
withCircuitBreakerErrorThresholdPercentage(30) - 熔断器默认工作时间,默认:5秒.熔断器中断请求5秒后会关闭重试,如果请求仍然失败,继续打开熔断器5秒,如此循环
withCircuitBreakerSleepWindowInMilliseconds(1000) - 隔离策略
withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE) - 信号量隔离时最大并发请求数
withExecutionIsolationSemaphoreMaxConcurrentRequests(2) - 命令组名,该命令属于哪一个组,可以帮助我们更好的组织命令。
withGroupKey(HystrixCommandGroupKey.Factory.asKey(“HelloGroup”)) - 命令名称,每个CommandKey代表一个依赖抽象,相同的依赖要使用相同的CommandKey名称。依赖隔离的根本就是对相同CommandKey的依赖做隔离。
andCommandKey(HystrixCommandKey.Factory.asKey(“Hello”) - 所属线程池的名称,同样配置的命令会共享同一线程池,若不配置,会默认使用GroupKey作为线程池名称。
andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey(“HelloThreadPool”)) - 命令属性,设置包括断路器的配置,隔离策略,降级设置,以及一些监控指标等。
- 线程池属性,配置包括线程池大小,排队队列的大小等。
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=1000
超时时间,默认1000ms
execution.timeout.enabled
是否开启超时,默认true
execution.isolation.thread.interruptOnTimeout
当超时的时候是否中断(interrupt) HystrixCommand.run()执行
官方参考文档:
https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.strategy
最后
以上就是奋斗火车为你收集整理的Hystrix使用缓存例子的全部内容,希望文章能够帮你解决Hystrix使用缓存例子所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复