Hystrix
基于线程池技术实现资源隔离
基于Hystrix信号量机制实现资源隔离
Hystrix资源隔离策略细粒度控制
HystrixCommandProperties.Setter()
//资源隔离策略 -> 线程池
.withExecutionIsolationStrategy(ExecutionIsolationStrategy.THREAD)
//commandGroupKey
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
//commandKey
.andCommandKey(HystrixCommandKey.Factory.asKey("HelloWorld"))
//threadPoolKey
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("HelloWorldPool"));
//coreSize
.withCoreSize(int value)
//queueSizeRejectionThreshold
.withQueueSizeRejectionThreshold(int value);
HystrixCommandProperties.Setter()
//资源隔离策略 -> 信号量
.withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
//semaphoreMaxConcurrentRequests
.withExecutionIsolationSemaphoreMaxConcurrentRequests(int value);
内部原理
步骤一:创建 command
// 返回一个结果
HystrixCommand hystrixCommand = new HystrixCommand(arg1, arg2);
// 返回多条结果
HystrixObservableCommand hystrixObservableCommand = new HystrixObservableCommand(arg1, arg2);
步骤二:调用 command 执行方法
//execute():调用后直接 block 住,属于同步调用,直到依赖服务返回单条结果,或者抛出异常
K value = hystrixCommand.execute();//queue().get()
//queue():返回一个 Future,属于异步调用,后面可以通过 Future 获取单条结果
Future<K> fValue = hystrixCommand.queue();//toObservable().toBlocking().toFuture()
//observe():订阅一个 Observable 对象,Observable 代表的是依赖服务返回的结果,获取到一个那个代表结果的 Observable 对象的拷贝对象
Observable<K> oValue = hystrixObservableCommand.observe();
//toObservable():返回一个 Observable 对象,如果我们订阅这个对象,就会执行 command 并且获取返回结果
Observable<K> toOValue = hystrixObservableCommand.toObservable();
步骤三:检查是否开启缓存
如果这个 command 开启了请求缓存 Request Cache,而且这个调用的结果在缓存中存在,那么直接从缓存中返回结果。否则,继续往后的步骤
步骤四:检查是否开启了断路器
检查这个 command 对应的依赖服务是否开启了断路器。如果断路器被打开了,那么 Hystrix 就不会执行这个 command,而是直接去执行 fallback 降级机制,返回降级结果。
步骤五:检查线程池/队列/信号量是否已满
如果这个 command 线程池和队列已满,或者 semaphore 信号量已满,那么也不会执行 command,而是直接去调用 fallback 降级机制,同时发送 reject 信息给断路器统计。
步骤六:执行 command
步骤七:断路健康检查
步骤八:调用 fallback 降级机制
不同的执行方式
execute(),获取一个 Future.get(),然后拿到单个结果。
queue(),返回一个 Future。
observe(),立即订阅 Observable,然后启动 8 大执行步骤,返回一个拷贝的 Observable,订阅时立即回调给你结果。
toObservable(),返回一个原始的 Observable,必须手动订阅才会去执行 8 大步骤。
基于 request cache 请求缓存技术优化批量商品数据查询接口
https://gitee.com/shishan100/Java-Interview-Advanced/blob/master/docs/high-availability/hystrix-request-cache.md
基于本地缓存的 fallback 降级机制
https://gitee.com/shishan100/Java-Interview-Advanced/blob/master/docs/high-availability/hystrix-fallback.md
深入 Hystrix 断路器执行原理
https://gitee.com/shishan100/Java-Interview-Advanced/blob/master/docs/high-availability/hystrix-circuit-breaker.md
深入 Hystrix 线程池隔离与接口限流
https://gitee.com/shishan100/Java-Interview-Advanced/blob/master/docs/high-availability/hystrix-thread-pool-current-limiting.md
基于 timeout 机制为服务接口调用超时提供安全保护
https://gitee.com/shishan100/Java-Interview-Advanced/blob/master/docs/high-availability/hystrix-timeout.md
Hystrix
于 2020-12-23 16:32:26 首次发布