线程隔离
线程隔离有两种方式实现:
- 线程池隔离
- 信号量隔离
线程池隔离
Hystix默认采用
假设服务A依赖于服务B和服务C,那么服务A就会分别对服务B和服务C创建线程池,当有请求进来时不会使用服务A本身的线程,而是到对应的线程池中取一个线程来调用feign的客户端来发起远程调用。
此时如果服务B出现故障,最多只会把服务A中对应服务B的线程池占满,不会影响到服务A访问服务C
优点:支持主动超时、支持异步调用
缺点:线程的额外开销比较大
信号量隔离
Sentinel默认采用
信号量不会去创建独立的线程池,而是直接使用服务A原始的线程去请求,但是它维持了一个计数器。假设这个计数器总量为10,每当服务A向服务B发起请求时计数器就会减一,当请求处理完后在归还信号。当计数器减至为0时如果再有请求进来就会直接被拒绝。
优点:轻量级,无额外开销
缺点:不支持主动超时、不支持异步调用
降级
概念:当莫个接口不可用,有请求进来该接口时,直接返回提示信息。当降级太多就会触发熔断机制
熔断
其思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。
服务熔断:默认是关闭的,如果需要开启需要在引导类上添加注解:@EnableCircuitBreaker
Closed:这种状态下断容器不会拦截任何请求。但是断容器会统计调用的异常比例,如果异常比例超过一个阀值就会进入Open状态。
Open:拦截进入该服务的请求,也就相当于进入熔断状态。但是它不会一直熔断,而是有一个期限,当熔断期限结束后就会进入Half-Open半开状态
Half-Open:它会尝试放行一次请求,然后根据这次请求的结果来进行选择。
- 当结果为失败时:再次进Open状态入
- 当结果为成功时:将会切换到Closed状态