JAR包引入
通过maven引入编译好的jar包
<dependency>
<groupId>com.netease</groupId>
<artifactId>dubbo-hystrix-support</artifactId>
<version>0.0.1</version>
</dependency>
引入dubbo-hystrix-support后会通过Dubbo的Activate机制自动激活HystrixFilter,对dubbo:reference进行资源隔离和熔断保护。
线程池隔离
默认按dubbo:reference进行线程池资源隔离,可以认为一个dubbo:reference为一个领域服务,reference里的所有方法在一个线程池资源里运行,多个reference之间线程池资源是隔离的,这样可以根据具体的业务场景对不同的reference设置不同的线程池资源,并且当某个reference出现阻塞故障时不会导致容器线程资源被耗尽,从而影响其他服务。
默认线程池配置如下:
<dubbo:parameter key="coreSize" value="10"/>
<dubbo:parameter key="maximumSize" value="20"/>
<dubbo:parameter key="keepAliveTimeMinutes" value="1"/>
参数 | 说明 | 默认值 |
---|---|---|
coreSize | 核心线程数大小 | 10 |
maximumSize | 空闲线程持有时间(分钟) | 20 |
keepAliveTimeMinutes | 最大线程数大小 | 1 |
信号量隔离
将自定义属性 isolation 为设置 SEMAPHORE 进行信号量隔离
<dubbo:parameter key="isolation" value="SEMAPHORE"/>
isolation属性:
属性值 | 说明 | 备注 |
---|---|---|
SEMAPHORE | 信号量隔离 | 适用于本地方法调用,或者QPS非常高的调用 |
THREAD | 线程池隔离 -默认值 |
最大并发请求数量
设置属性 maxConcurrentRequests 默认值为 10
<dubbo:parameter key="maxConcurrentRequests" value="10"/>
熔断保护
每个dubbo:reference的服务方法会封装成command,提供熔断保护和优雅降级功能。
默认熔断配置如下:
<dubbo:parameter key="requestVolumeThreshold" value="20"/>
<dubbo:parameter key="sleepWindowInMilliseconds" value="5000"/>
<dubbo:parameter key="errorThresholdPercentage" value="50"/>
<dubbo:parameter key="timeoutInMilliseconds" value="1000"/>
参数 | 说明 | 默认值 | 备注 |
---|---|---|---|
requestVolumeThreshold | 熔断判断请求数阈值 | 20 | 一个统计周期内(默认10秒)请求不少于requestVolumeThreshold才会进行熔断判断 |
sleepWindowInMilliseconds | 熔断触发错误率阈值 | 5000 | 超过50%错误触发熔断 |
errorThresholdPercentage | 熔断触发后多久恢复half-open状态 | 50 | 熔断后sleepWindowInMilliseconds毫秒会放入一个请求,如果请求处理成功,熔断器关闭,否则熔断器打开,继续等待sleepWindowInMilliseconds |
timeoutInMilliseconds | 任务执行超时时间 | 1000 | 注意该时间和dubbo自己的超时时间不要冲突,以这个时间优先,比如consumer设置3秒,那么当执行时hystrix会提前超时 |
服务降级
降级触发条件如下:
- 远程服务调用超时
- 远程服务内部执行返回异常结果(如内部抛出运行时异常)
- Hystrix will execute this fallback for all types of failure such as run() failure, timeout, thread pool or semaphore rejection, and circuit-breaker short-circuiting
服务降级方法通过SPI扩展的方式加载、运行,实现方式如下:
1、继承实现Fallback接口,提供降级实现,Fallback接口定义如下:
package com.netease.urs.dubbo.rpc.filter;
import com.alibaba.dubbo.common.extension.SPI;
/**
* 业务失败返回处理函数
* Created by yangshaokai on 2018/2/26.
*/
@SPI
public interface Fallback {
Object invoke();
}
2、按dubbo SPI扩展规则进行配置
- resources目录增加文件/META-INF/dubbo/com.netease.urs.dubbo.rpc.filter.Fallback
- demoFallback=com.netease.urs.dubbo.rpc.DemoFallback
3、dubbo:reference增加method fallback配置
<dubbo:method name="demo">
<dubbo:parameter key="fallback" value="demoFallback"/>
</dubbo:method>
Fallback并发调用量控制
设置属性 fallbackMaxConcurrentRequests 默认值为 50
<dubbo:parameter key="fallbackMaxConcurrentRequests" value="50"/>