微服务框架
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
微服务保护
文章目录
- 微服务框架
- 微服务保护
- 32 隔离和降级
- 32.2 线程隔离
- 32.2.1 线程隔离
- 32.2.2 优缺点对比
32 隔离和降级
32.2 线程隔离
32.2.1 线程隔离
线程隔离有两种方式实现:
- 线程池隔离
- 信号量隔离(Sentinel默认采用)
【两种方式的差别】
现在有4 个服务,I、A、B、C,服务I 中的一些业务依赖于服务A、B、C
现在来了一个用户请求,这个请求它 依赖于服务A 和服务B,
【1】线程池隔离
它会给现在这个请求所依赖的每一个服务都创建一个线程池
现在就有了 俩线程池,一个对应服务A ,一个对应服务B
现在请求来了之后,它不会去使用请求本身的线程,它会去两个线程池中分别取一个线程,
然后用这个线程去调用Feign 的客户端发起远程调用
这样就把两个服务隔离开了 。现在如果 服务A 出现 了故障,那最多就是把服务A 的线程池用完
池子满了,如果再有服务来,就会被拒绝了,这样就不会把服务I 的资源给耗尽了,即把故障隔离在了一个限定的范围内
这就是线程池的模式。
【信号量方式】
现在来了一个请求要去调用 服务C,它会使用调用本来的线程直接去使用Feign 调用服务C,但是它会在请求时做一个判断
判断计数器还有没有。每进入一个请求,计数器就会 - 1,当拿不到了的时候,新请求就不能进来了,相当于是使用计数器限制了 最终的 线程的数量,从而起到一个故障隔离的作用【当然业务处理完,信号肯定要还回去】
32.2.2 优缺点对比
-
主动超时:线程池会给每一个远程调用创建独立线程,因此在远程调用的请求发出之后,其实是可以通过线程池来进行控制的,比如说看你这个线程耗时已经很久了,我可以立即终止这个线程,线程一终止 = 业务终止,
-
异步调用:每一次调用都是一个独立的线程,相互之间相互独立,→ 异步
-
扇出:请求到某个服务,服务依赖于n 个其他的服务,这个就叫扇出