享学课堂特约作者:老顾
目录
前言
全局异常降级
熔断遗失
熔断降级
配置思考
总结
前言
之前的文章中老顾已经介绍了sentinel的基本用法,以及利用Sentinel-Dashboard控制台去配置降级策略,全局Feign调用默认异常,再可以通过nacos持久化方式保证降级策略不丢失。
整体在使用过程中,没有发现什么大问题;但是仔细看一下日志就会发现一些问题;且为了解决这个问题要配置很多东西。发现有个地方在使用的时候不方便;而且是很不方便,浪费很多时间。我们先看看使用过程中的问题
全局异常降级
在之前的文章中,老顾介绍了Feign调用异常全局降级策略,这里我们再简单描述一下
上图中表示有个普通的业务,consumer服务通过Feign调用provider服务,为了保证系统的稳定性,防止provider服务出现什么情况,在consumer服务配置了fallback降级策略
这样设置之后,即使provider服务挂了,我们也可以走fallback方法,可以获取到
Plain Text===fall back===
这样就保证了整体系统的稳定,而不会因为provider服务不稳定导致consumer服务也不稳定,专业术语就是防止雪崩效应。
有没有发现Fegin接口中@FeignClient注解需加上fallback属性
Java@FeignClient(name = "service-provider",fallback = ProviderServiceFallback.class)
小伙伴们我们想一想,如果我们consumer有10个Feign的外部调用,也就是有10个Feign接口,那么要保证系统的稳定,我们需要在每个Feign接口上面配置fallback。而且一般降级逻辑业务处理都是很类似的,都是标准的业务。是不是很麻烦,那能不能系统有个全局的fallback处理呢?
之前的文章《Sentinel限流、降级的统一处理》中已经做过介绍,小伙伴可以出门右拐就可以找到。
本篇文章就不重复介绍具体的实现了。
熔断遗失
上面我们介绍了全局降级;我们来看看的效果,我们把provider服务关掉,这样直接访问consumer对象的getHeader方法,代码里面是先获得客户端传过来的header参数,再远程Feign调用方法。看如下代码
Plain Texthttp://localhost:8083/getHeader
我们发现因为provider服务挂了,导致
Load balancer does not have available server for client: service-provider
不过我们的返回结果,还是友好的;保证系统照样进行
Java{
"statusCode": "0",
"statusMessage": "处理成功",
"data": "success"
}
我们再执行一次
Plain Texthttp://localhost:8083/getHeader
照样报错!!!
不管执行几次,日志照样有异常;虽然前端看不出来!!!小伙伴有没有发现问题?怎么每次都有异常发生?现在的案例中的异常是provider服务不存在,大家看的不是太明显,因为consumer服务即时就知道立刻返回了异常;但如果异常是provider服务执行时间太长,导致consumer服务调用超时返回的异常;那么每次调用都产生超时异常,那根本起不到防止雪崩效应。
那是不是哪边出了问题了?对的,我们忘记配置Sentinel的降级策略了;本质就是熔断降级策略。
关于熔断,小伙伴们可以网上查看,补一下知识哦
熔断降级
之前文章中老顾介绍过Sentinel Dashboard,可以进行配置熔断降级;怎么安装,小伙伴们可以去看之前的文章
上面的配置代表,10秒内最小请求数达到2个,而且有1个异常就执行熔断,熔断持续10秒。
我们在执行多次,发现异常日志没有了。
这个原因就是
Plain TextproviderServiceFeign.transferHeaders();
执行Fegin远程调用时,如果熔断了,执行此代码时不会执行远程调用;而是会立刻调用fallback方法。
这样配置后才算真正的配置完成,达到熔断后保护系统的稳定性。
配置思考
我们上面配置了一个熔断降级策略,资源名为
Plain TextGET:http://service-provider/transferHeaders
这个是根据服务名+请求url组成的。如果我们有很多Feign的远程调用;如
如果有很多Feign接口,那是不是我们都要进行一一配置呢?都要到Sentinel Dashboard那边进行配置呢?
而且如果微服务很多,那对应的每个服务都要进行一一配置;有没有觉得很麻烦。而且配置熔断的规则都很类似,连数值很多都一样。
而且很多时候我们也不记得有多少Feign方法了,需要自己一看看查找,真的很麻烦
那能不能像全局降级fallback一样,有一个可以配置全局熔断策略的方法呢?这样我们就可以不需要配置,只要@FeignClient远程调用,都会默认自动配置上熔断降级策略。
小伙伴们想想有什么方案呢?老顾会在下一篇文章中介绍。
总结
有些知识确实需要在企业实战中发现问题,小伙伴们要善于观察、思考;重构解决方案,能不能找到更好的方案,从而提高效率,减少人为干预。小伙伴们持续看下一篇文章哦,介绍具体的实现方案哦。