微服务保护(线程隔离、降级、熔断)

线程隔离

线程隔离有两种方式实现:

  • 线程池隔离
  • 信号量隔离

线程池隔离

Hystix默认采用

假设服务A依赖于服务B和服务C,那么服务A就会分别对服务B和服务C创建线程池,当有请求进来时不会使用服务A本身的线程,而是到对应的线程池中取一个线程来调用feign的客户端来发起远程调用。

此时如果服务B出现故障,最多只会把服务A中对应服务B的线程池占满,不会影响到服务A访问服务C

优点:支持主动超时、支持异步调用

缺点:线程的额外开销比较大 

信号量隔离

Sentinel默认采用

信号量不会去创建独立的线程池,而是直接使用服务A原始的线程去请求,但是它维持了一个计数器。假设这个计数器总量为10,每当服务A向服务B发起请求时计数器就会减一,当请求处理完后在归还信号。当计数器减至为0时如果再有请求进来就会直接被拒绝。

优点:轻量级,无额外开销 

缺点:不支持主动超时、不支持异步调用

降级

概念:当莫个接口不可用,有请求进来该接口时,直接返回提示信息。当降级太多就会触发熔断机制

79ff4c40c6874f798bc5baa0197aedc0.png

熔断

其思路是由断路器统计服务调用的异常比例、慢请求比例,如果超出阈值则会熔断该服务。即拦截访问该服务的一切请求;而当服务恢复时,断路器会放行访问该服务的请求。

服务熔断:默认是关闭的,如果需要开启需要在引导类上添加注解:@EnableCircuitBreaker

bc05437b5b3e4d3bbd49bfad8cfcd8fd.png

Closed这种状态下断容器不会拦截任何请求。但是断容器会统计调用的异常比例,如果异常比例超过一个阀值就会进入Open状态。

Open拦截进入该服务的请求,也就相当于进入熔断状态。但是它不会一直熔断,而是有一个期限,当熔断期限结束后就会进入Half-Open半开状态

Half-Open:它会尝试放行一次请求,然后根据这次请求的结果来进行选择。

  • 当结果为失败时:再次进Open状态入
  • 当结果为成功时:将会切换到Closed状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值