AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
## 一、在FeignClient接口配置fallback降级 参考《服务熔断降级hystrix》章节中的《Hystrix结合Feign服务降级》学习,二者的实现方法及目的是一样的,所以此处简写,只写不同的部分。 * 在服务配置文件中打开feign结合sentinel的开关 ~~~ feign: sentinel: enabled: true ~~~ ~~~ @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 ,"短信发送接口失败!"); } } ~~~ ## 二、远程服务调用异常传递的问题 参考《服务熔断降级hystrix》章节中的《远程服务调用异常传递的问题》学习。把文章中的hystrix当成sentinel看,把HystrixCommand注解当成SentinelResource注解看。问题是一样的,原理是一样的。所以此处简写,只写不同的部分。 ![](https://img.kancloud.cn/5c/99/5c994df081aa36bc4de8b0c4e567537c_1197x326.png) 人为制造一个被除数为0的异常,将会执行SmsControllerHandler 类中的sendFallback方法。 ~~~ public class SmsControllerHandler { public static AjaxResponse sendFallback(@RequestParam String phoneNo, @RequestParam String content, Throwable e) { return AjaxResponse.error(CustomExceptionType.SYSTEM_ERROR, "短信服务发送接口出现错误"); } } ~~~ ## 三、sentinel-feign异常拦截与处理 通过上面的实现,远程的服务提供者已经可以传递异常了,剩下的工作就是服务调用端如何进行异常的拦截和处理,从而本地服务如果有数据库操作,实现事务回滚。参考《服务熔断降级hystrix》章节中的《Hystrix-Feign异常拦截与处理》学习,此处简写! ### 3.1.第一种处理方式 最简单的处理方式就是:我们在接收到远程服务的响应结果Response Body(对于我们的项目是AjaxResponse)后,判断其内部的状态信息。如果状态信息是业务失败,throw new 自定义异常抛出,触发数据库回滚! ![](https://img.kancloud.cn/eb/e4/ebe49d7d376e3dcd66c76944c76d9878_1343x276.png) ### 3.1.暂时没有第二种处理方式 **但是非常遗憾的是:Sentinel目前并没有一种Exception,和HystrixBadRequestException一样既可以向外抛出,又不会触发FeignClient的Fallback策略。(或者有我不知道)**无法使用Feign的ErrorDecoder进行全局的集中的异常转换。 我已经将这个问题或者说是需求在github上面以issue的方式提交给官方!暂时没有回复! ![](https://img.kancloud.cn/50/5f/505fcc87eab1a2c566d9cfa1c7a2fd30_835x404.png) [https://github.com/alibaba/spring-cloud-alibaba/issues/1447](https://github.com/alibaba/spring-cloud-alibaba/issues/1447)