纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

SpringCloud feign微服务异常处理 SpringCloud feign微服务调用之间的异常处理方式

zf12178   2021-06-24 我要评论
想了解SpringCloud feign微服务调用之间的异常处理方式的相关内容吗zf12178在本文为您仔细讲解SpringCloud feign微服务异常处理的相关知识和一些Code实例欢迎阅读和指正我们先划重点:SpringCloud微服务,feign微服务调用,异常处理下面大家一起来学习吧。

如何优雅地处理微服务间调用的异常

现在微服务架构盛行其中spring cloud方案就很具有代表。

那么在微服务之间进行调用如果被调用的服务挂了调用方如何感知呢?

一、加上hystrix熔断

在定义feignClient的地方指定熔断如下图

熔断

当被调用服务不可用或者被调用方发生错误的时候会触发熔断但是如果被调用方抛出异常调用方怎么知道究竟是出了什么问题呢?

那这就出现了

二、feign全局异常处理

我们不得不提到feign提供的一个接口叫做ErrorDecoder 是用来处理feign异常的有一个方法需要实现 public Exception decode(String s, Response response)

如下图:

在这里插入图片描述

这样就会替换它默认的feign异常处理这样就可以捕捉全局的异常了但是又带来一个新的问题如果使用这个ErrorDecoder得关闭熔断否者这里抛出的FeignBadRequestException异常又会被hystrix吞掉那有没有更好的办法呢?

在被调用的controller方法里面捕捉全局异常发生错误的时候把异常保存一个对象里面然后用该对象进行服务间的通信调用方收到结果再检查是否包含错误这个方式确实可以解决但这肯定不是个好办法;那么有没有更好的办法呢?跳出ErrorDecoder后会经过在AbstractCommand里面的一个executeCommandAndObserve方法里面有个function叫做 handleFallback

由此可知当抛出的异常是HystrixBadRequestException时直接抛出异常不再经过fallback那么我们的解决办法就有了那就是调整FeignBadRequestException 的继承对象如图

调整异常继承方案

现在就实现了服务端不可用和服务端报错的异常分离但是可能有的同学已经注意到了FeignClientErrorDecoder这个异常处理类里面是是针对状态为SERVICE_UNAVAILABLE的进行了特别处理为社么要这样?这是因为与被调用方约定当状态码为 SERVICE_UNAVAILABLE 的时候视为被调用方主动抛出的异常

需要注意的地方

我们的被调用方除了提供微服务之间调用很可能也提供了面向前端的接口为了封装我们程序内部的异常通常我们会定义个全局异常捕捉类即使报错了我们也提供一个友好的交互方式比如下面这样

第一处我们除了系统内部抛出的异常第二处处理其它异常也就是说不管抛出什么错该服务都会返回一个状态值为200的信息出去那么问题来了我们微服务间的调用也会被处理成200从而导致feign会以为服务是正常的正常返回结果了没有报错那怎么办?

三、针对内部调用的特殊处理

当然你可能想到了我们可以在提供给内部使用的接口进行异常转换然后让全局异常处理处不进行这样的处理但是每个内部接口都要进行全局异常捕捉然后转换这明显不是最好的做法

四、通过注解标记为接口为内部调用接口

先定义一个注解直接上图

注解

我们定义该注解为方法和类上都可以使用然后再定义处理程序

在这里插入图片描述

处理程序要做一件事情就是在程序方法异常的时候将http状态码设置为我们约定的SERVICE_UNAVAILABLE然后看下怎么使用

标记异常

这样我们把该方法标记为了供内部使用的接口当然同样也可以将注解放在类上这样就可以把该类的全部方法标记为内部调用。

至此我们现在调用其它服务的方法就可以调用本地的一样了当然如果你想在调用其它服务的方法报错后想继续执行其它逻辑同样也可以直接catch FeignBadRequestException 这个异常就可以了

微服务间调用异常改参

两个微服务之间通过feign调用时,后台抛出异常:

feign.RetryableException: Read timed out executing POST

解决方法:

在你的yml文件中添加

ribbon:  
  ReadTimeout: 60000  
  ConnectTimeout: 60000

以上为个人经验希望能给大家一个参考也希望大家多多支持。


相关文章

猜您喜欢

  • OpenCV高斯噪声 OpenCV实现高斯噪声

    想了解OpenCV实现高斯噪声的相关内容吗我有一個夢想在本文为您仔细讲解OpenCV高斯噪声的相关知识和一些Code实例欢迎阅读和指正我们先划重点:OpenCV,高斯噪声下面大家一起来学习吧。..
  • SpringBoot AOP无法注入 怎样解决SpringBoot 加入AOP后无法注入的问题

    想了解怎样解决SpringBoot 加入AOP后无法注入的问题的相关内容吗love13135816在本文为您仔细讲解SpringBoot AOP无法注入的相关知识和一些Code实例欢迎阅读和指正我们先划重点:SpringBoot,AOP无法注入,SpringBoot,AOP下面大家一起来学习吧。..

网友评论

Copyright 2020 www.Shellfishsoft.com 【贝软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式