AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
通过前面几个小节的说明,对于服务降级目前有两种方式: * 使用DefaultProperties注解在类级别的代码上进行服务降级,这种方法一定程度上减少了很多冗余代码。但是通用fallback方法仍然与实际业务的处理方法耦合在一个类中,可以通过BaseController的方式解决。**笔者较为推荐这种方式** * 使用HystrixCommand注解的CommandProperties配置,在方法级别实现服务降级。这种方法代码十分冗余,需要针对每一个方法做配置,写fallback。**最好用于一些重点业务的个性化接口。** * 用一句话总结就是:**追求统一处理、允许个性化实现** 下面为大家介绍服务降级的另一类方法:在FeignClient上实现服务降级。为什么我称它是另一类方法,而不是另一种方法?因为FeignClient上实现服务降级与上面两种方法的思考的角度是不同的: * FeignClient上实现服务降级,**从服务调用者的角度考虑**:如果服务提供者出现连接超时、服务宕机等问题,作为服务调用者我该如何快速的对服务提供者的接口进行降级,**避免造成服务调用者自己的崩溃**。 * HystrixCommand实现服务降级,**从服务提供者角度考虑**:如果有服务调用者调用我的服务,并且我自己的代码或者触发熔断降级规则后,我该如何快速的告知服务调用者,**避免造成服务调用者崩溃**。 ## 一、在FeignClient上实现服务降级 * 首先还是要将Hystrix集成到Spring Cloud服务中,参考《Hystrix集成并实现服务熔断》得第三小节:微服务集成Hystrix * 在服务配置文件中打开feign结合hystrix的开关 ~~~ feign: hystrix: enabled: true ~~~ 在FeignClient注解增加fallback处理实现类,如:SmsServiceFallback。 ~~~ @FeignClient(name="ASERVICE-SMS",fallback = SmsServiceFallback.class) public interface SmsService { @PostMapping(value = "/sms/send") AjaxResponse send(@RequestParam("phoneNo") String phoneNo, @RequestParam("content") String content); } ~~~ 书写SmsServiceFallback代码,该类要实现FeignClient注解的接口函数。当使用Feign客户端远程调用SmsService .send方法,如果远程服务不可达(网络不可达或宕机),就会执行SmsServiceFallback.send方法作为fallback。 ~~~ @Component public class SmsServiceFallback implements SmsService { @Override public AjaxResponse send(String phoneNo, String content) { return AjaxResponse.error(CustomExceptionType.SYSTEM_ERROR ,"短信发送接口失败!"); } } ~~~ * 优点:将fallback服务降级方法与实际的业务处理方法分离,耦合度降低,从这个角度来说对程序员比较友好。 * 缺点:FeignClient注解的接口有多个方法,实现类就要写多个fallback,所以代码冗余量仍然非常大。这个缺点在我看来似乎无关紧要了,因为接口函数定义实际根本就不用我们写,通过IDE一个回车就可以搞定。接口函数的实现内容通过提取公共代码方式就可以搞定。虽然代码行数可能仍然较多,但是独立整齐规范。