Hystrix高级属性配置
在几篇的讲解和操作中,我们已经知道了服务与服务之间是通过Hystrix来实现服务熔断与降级的,Hystrix官网上除了介绍Hystrix外,还列出了一些Hystrix高级属性配置。
(https://github.com/Netflix/Hystrix/wiki/Configuration)
执行隔离策略
对某种依赖的请求数量进行限制的方式,称为执行隔离。执行隔离能够服务熔断,防止服务雪崩。
执行隔离有两种类型:
线程隔离
Hystrix的默认隔离策略,系统会创建一个依赖线程池,为每个依赖请求分配一个独立的线程,而每个依赖所拥有的线程数量是有上限的。当对该依赖的调用请求数量达到上限后再有请求,则直接拒绝该请求,并对该请求做降级处理。所以对某依赖的并发量取决于为该依赖线程池所分配的线程数量。
当UserRequest获取不到线程之后就会被服务降级。
信号量隔离
对依赖的调用所使用的线程仍为请求线程,不会为依赖请求再创建新的线程。但系统会为每种依赖分配一定数量的信号量,每个依赖请求分配一个信号。当对该依赖的调用请求数量达到上限后再有请求,则直接拒绝,并对该请求做降级处理。所以对某依赖的并发量取决于为该依赖所分配的信号量数量。
在服务器少但请求并发量大的情况下不建议使用线程隔离,可能会使系统对请求的并发能力下降。线程隔离更便于控制反馈给客户端的降级时间。线程隔离的执行效率高于信号量隔离的,因为线程隔离的执行体数量是信号量隔离的2倍。
线程隔离 |
信号量隔离 |
能独立运行(线程是进程的一个执行体) |
无法独立运行(信号量只是线程执行条件) |
请求线程与提供者调用线程不是同一个线程 |
请求线程与调用线程是同一个线程 |
每台主机处理请求的数量是有限制的 |
信号量是一个计数器,是一个数值不存在上限 |
修改策略
修改策略一共有两种方式,一种是在代码中修改,另一种是在配置文件中修改。
代码中修改
HystrixCommandProperties.Setter().withExecutionIsolationStrategy(ExecutionIsolationStrate gy.THREAD) HystrixCommandProperties.Setter().withExecutionIsolationStrategy(ExecutionIsolationStrate gy.SEMAPHORE)12345复制代码类型:[java]
配置文件中修改
hystrix.command.default.execution.isolation.strategy=thread hystrix.command.default.execution.isolation.strategy=semaphore123复制代码类型:[java]
HystrixCommandProperties类的构造器中设置有这些高级属性的默认值。
this.executionIsolationStrategy = getProperty(propertyPrefix, key, "execution.isolation.strategy", builder.getExecutionIsolationStrategy(), default_executionIsolationStrategy);1复制代码类型:[java]
执行隔离的其他属性
执行隔离还有一些其他属性。
超时时限
hystrix.command.default.execution.timeout.enabled1复制代码类型:[java]
在默认的线程执行隔离策略中,线程的执行时间可以为其设置超时时限。首先开启该超时时限,该属性默认值为true。若要关闭,则可以配置文件中设置该属性的值为false。
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds1复制代码类型:[java]
执行线程超时时限开启后还可以设置时限长度,默认值为1000毫秒。
超时中断
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds1复制代码类型:[java]
当线程执行超时时是否中断线程的执行。默认为true,即超时即中断。通过以下属性进行设置。
取消中断
hystrix.command.default.execution.isolation.thread.interruptOnCancel1复制代码类型:[java]
在线程执行过程中,若请求取消了,当前执行线程是否结束呢?由该值设置。默认为false,即取消后不中断。通过以下属性进行设置。
信号量数量
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests1复制代码类型:[java]
采用信号量执行隔离策略,可以修改信号量的数量。(对某一依赖所允许的请求的最高并发量)
服务降级属性
降级请求最大数量
hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests1复制代码类型:[java]
仅限于信号量隔离。当信号量已用完后再有请求到达,不是所有请求都会进行降级处理,而是在该属性设置值范围内的请求才会发生降级,其它请求将直接拒绝。
服务降级开关
hystrix.command.default.fallback.enabled1复制代码类型:[java]
无论是线程隔离还是信号量隔离,当请求数量到达其设置的上限后再有请求到达是否会对请求进行降级处理,取决于该属性值的设置。若该属性值设置为false,则不进行降级,而是直接拒绝请求。
服务熔断属性
熔断功能开关
hystrix.command.default.circuitBreaker.enabled1复制代码类型:[java]
默认值为true,设置当前应用是否开启熔断器功能。
熔断器开启阈值
hystrix.command.default.circuitBreaker.requestVolumeThreshold1复制代码类型:[java]
默认值为20,当在时间窗内(10秒)收到的请求数量超过该设置的数量后,开启熔断器。(开启熔断器是指将拒绝所有请求,关闭熔断器是指将使所有请求通过)
熔断时间窗
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds1复制代码类型:[java]
默认值为5000毫秒,当熔断器开启该属性设置的时长后,会尝试关闭熔断器,恢复被熔断的服务。
熔断开启错误率
hystrix.command.default.circuitBreaker.errorThresholdPercentage 12复制代码类型:[java]
当请求的错误率高于该百分比时,开启熔断器。默认值为50,即50%。
强制开启熔断器
hystrix.command.default.circuitBreaker.forceOpen 12复制代码类型:[java]
默认值为false,设置熔断器无需条件开启,拒绝所有请求。
强制关闭熔断器
hystrix.command.default.circuitBreaker.forceClosed 12复制代码类型:[java]
默认值为false,设置熔断器无需条件的关闭,通过所有请求。
线程池相关属性
关于执行线程的线程池,可以通过官网给出的属性设置。
https://github.com/Netflix/Hystrix/wiki/Configuration#ThreadPool