文章目录
前言
微服务保护学习笔记(一)雪崩问题及解决方案、Sentinel介绍与安装
微服务保护学习笔记(二)簇点链路、流控操作、流控模式(关联、链路)
微服务保护学习笔记(三)流控效果(warm up、排队等待)、热点参数限流
3 隔离和降级
限流是一种预防措施,它可以尽量避免因高并发而引起的服务故障。但服务还会因为其它原因而故障,而要将这些故障控制在一定范围内避免雪崩,就要依靠线程隔离(舱壁模式)和熔断降级手段了。
-
线程隔离:服务调用者在调用服务提供者时,给每个调用请求分配独立线程池,出现故障时,这个请求最多消耗这个线程池内的资源,避免把调用者的所有资源耗尽。
-
熔断降级:在调用方这边加入断路器,统计对服务提供者的调用,如果调用的失败比例过高,则熔断该业务,不允许访问该服务提供者。
可以看到,不管是线程隔离还是熔断降级,都是对客户端(调用方)的保护,需要在调用方发起远程调用时做线程隔离或者服务熔断。
SpringCloud微服务远程调用都是基于Feign来完成的,因此需要将Feign与Sentinel整合,在Feign里面实现线程隔离和服务熔断。
3.1 FeignClient整合Sentinel
3.1.1 搭建SpringCloud项目
创建一个SpringCloud项目,sd-user-service
和sd-order-service
微服务均注册到Eureka中:
sd-user-service
微服务中有一个/user/query
接口,调用该接口后会通过Feign调用sd-order-service
微服务:
// com.hsgx.user.controller.UserController
@Autowired
private OrderClient orderClient;
@GetMapping("/query")
public String query(String id) {
String order = orderClient.queryById(id);
return "查询用户" + id + "成功," + order;
}
// com.hsgx.order.controller.OrderController
@GetMapping("/query")
public String query(String id) {
return "查询订单" + id + "成功";
}
3.1.2 修改配置文件
修改sd-user-service
微服务(调用方)的配置文件,开启Feign的Sentinel功能: