目录:
(1)Feign与Sentinel的整合
(2)Sentinel实现线程隔离和熔断
熔断策略-慢调用
熔断策略-异常比例 异常数
(1)Feign与Sentinel的整合
前面学习了限流的各种用法,限流可以降低服务的负载,从而避免服务因为过高并发而出现故障,服务不出现故障自然不会把故障传递给其他服务,从而避免了级联失败,限流是对服务故障的预防措施,但是如果服务已经出现了故障,就很容易把故障传递给依赖它的其他服务,这样很容易出现雪崩了,多以需要使用线程隔离、线程熔断避免级联失败
保护服务的调用者,应该在服务调用者在发起远程调用的时候去做隔离或者做熔断,在SpringCloud在远程调用的时候是基于Feign来实现的,所以我们要想实现隔离和降级,最好的办法是基于Feign去整合Sentinel去做隔离和降级
通过在配置文件中添加,这样就可以我们的Sentinel可以自动的去监控Feign客户端,把它变成一个链路中的资源,这样一来就可以给它配置限流的规则,隔离的规则、降级的规则等
限流也好,服务被拒绝也好,服务器出现了故障,都是直接抛出一个异常 到前端,这种方式不够友好,给用户体验不好,比较好的处理方案是给用户一个好的提示,告诉他说这里出了什么事,或者返回默认的信息,这些就是失败降级的逻辑
用了Feign的客户端
编写返回逻辑:
我们的Feign没有在order-service模块里而是抽成了一个模块
加上fallbackFactory
重启:先访问一下:
有了Feign的请求路径
(2)Sentinel实现线程隔离和熔断
扇出:我这个服务依赖于n个其他的服务,这个就叫扇出
点击流控
测试:
这里显示 是正常的因为我们做了逻辑处理,在控制台显示报错,返回一个空的用户
多余的请求都被降级了
熔断策略-慢调用
更肥usercontroller:添加睡眠时间,触发熔断策略
重启:
查询101,因为设置了睡眠,这条数据的响应时间在60毫秒以上了
查询102的时候,是非常快的,16毫秒,没有触发熔断
配置降级规则,点击降级
就配置好了,降级规则了
狂刷5次查询101:
在访问102:
102本来可以查询到,但是在查询一次:出现问题,而且响应时间是非常的快,10毫秒就结束了,说明用户在查询订单的那一刻直接被熔断了,直接走降级逻辑返回null,所以响应时间没有边长反而变短了
过了熔断时间后进入Half-Open:在重新刷新一次,成功了,进入到了Close状态
熔断策略-异常比例 异常数
修改 controller
重启:
查询102:会抛出异常:
配置熔断:重新配置点击降级按钮
102连续访问5次:就会触发熔断规则
此时访问103,就不能正常访问了: