返回顶部
首页 > 资讯 > 后端开发 > Python >SpringCloud feign微服务调用之间的异常处理方式
  • 666
分享到

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

2024-04-02 19:04:59 666人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

如何优雅地处理微服务间调用的异常 现在微服务架构盛行,其中spring cloud方案就很具有代表。 那么在微服务之间进行调用,如果被调用的服务挂了,调用方如何感知呢? 一、加上hy

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

现在微服务架构盛行,其中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

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

--结束END--

本文标题: SpringCloud feign微服务调用之间的异常处理方式

本文链接: https://lsjlt.com/news/129004.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringCloud feign微服务调用之间的异常处理方式
    如何优雅地处理微服务间调用的异常 现在微服务架构盛行,其中spring cloud方案就很具有代表。 那么在微服务之间进行调用,如果被调用的服务挂了,调用方如何感知呢? 一、加上hy...
    99+
    2024-04-02
  • SpringCloud之Feign代理,声明式服务调用方式
    目录引入相关依赖然后再主入口启用注解引入相关依赖然后再主入口启用注解:@EnablFeign配合Ribbon、Hystrix的超时策略配置如下1.pom2.主入口3.配置文件4.业务...
    99+
    2024-04-02
  • SpringCloud feign服务熔断下的异常处理操作
    今天做项目的时候,遇到一个问题,如果我调用某个服务的接口,但是这个服务挂了,同时业务要求这个接口的结果是必须的,那我该怎么办呢,答案是通过hystrix,但是又有一点,服务不是平白无...
    99+
    2024-04-02
  • Feign调用全局异常处理解决方案
    异常信息形如: TestService#addRecord(ParamVO) failed and no fallback available.; 对于failed a...
    99+
    2024-04-02
  • springcloud feign服务之间调用,date类型转换错误的问题
    目录feign服务之间调用,date类型转换错误自定义feign请求头通过判断是否为feign请求openfeign服务间调用时日期格式异常异常为原因解决方法feign服务之间调用,...
    99+
    2024-04-02
  • Java微服务间接口调用feign的方法是什么
    今天小编给大家分享一下Java微服务间接口调用feign的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Feign...
    99+
    2023-07-05
  • Feign调用接口解决处理内部异常的问题
    问题描述: 当使用feign调用接口,出现400~500~的接口问题时。会出错feign:FeignException。(因为是错误,只能用catch Throwable,不可使用c...
    99+
    2024-04-02
  • Feign调用服务各种坑的处理方案
    1.编写被调用服务 @RefreshScope @RestController public class XXXController extends BaseController...
    99+
    2024-04-02
  • 微服务之间如何通过feign调用接口上传文件
    具体需求: 我们的项目是基于springboot框架的springcloud微服务搭建的,后端服务技术层面整体上分为business服务和core服务,business服务用于作为应...
    99+
    2024-04-02
  • 微服务之间怎么通过feign调用接口上传文件
    这篇文章主要介绍“微服务之间怎么通过feign调用接口上传文件”,在日常操作中,相信很多人在微服务之间怎么通过feign调用接口上传文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”微服务之间怎么通过feig...
    99+
    2023-06-20
  • Spring Cloud-Feign服务调用的问题及处理方法
    概述: • Feign 是一个声明式的 REST 客户端,它用了基于接口的注解方式,很方便实现客户端配置。 • Feign 最初由 Netflix 公司提供...
    99+
    2024-04-02
  • SpringCloud详解实现声明式微服务调用OpenFeign方法
    目录OpenFeign介绍项目实战创建项目启动项目验证总结OpenFeign介绍 一开始,我们使用原生的 DiscoveryClient 发现服务和使用RestTemplate进行服...
    99+
    2024-04-02
  • openFeign服务之间调用保持请求头信息处理方式
    openFeign服务间调用保持请求头信息处理 1、注意特殊情况,在定时任务或者内部之间调用,没有request的时候,不要处理直接返回。 2、在GET请求,参数确放在Body里面传...
    99+
    2024-04-02
  • SpringCloud远程服务调用三种方式及原理
    目录一个简单的微服务架构图调用远程服务的三种方式1、基于 RestTemplate 和 @LoadBalanced 注解2、基于DiscoveryClient3、基于 Feign 的...
    99+
    2022-12-19
    SpringCloud远程服务 SpringCloud服务调用
  • java服务之间调用的方式是什么
    Java服务之间调用的方式有多种,包括:1. 远程过程调用(RPC):使用RPC框架进行服务间的调用,如Dubbo、gRPC等。通过...
    99+
    2023-08-15
    java
  • Spring Cloud中声明式服务调用Feign的方法
    这篇文章主要介绍“Spring Cloud中声明式服务调用Feign的方法”,在日常操作中,相信很多人在Spring Cloud中声明式服务调用Feign的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”S...
    99+
    2023-06-19
  • THINKPHP调试模式及异常处理的方法是什么
    这篇文章主要讲解了“THINKPHP调试模式及异常处理的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“THINKPHP调试模式及异常处理的方法是什么”吧!调试模式开启调试模式很简单...
    99+
    2023-06-26
  • 基于springboot服务间Feign调用超时的解决方案
    解决springboot服务间Feign调用超时问题概述 1、起因 在完成项目功能需求的开发,经过自己测试以及通过测试组测试通过后,昨晚正式部署到线上环境进行正式运行前的最后一次的测...
    99+
    2024-04-02
  • SpringCloud Nacos + Ribbon 调用服务的实现方式(两种)
    目录1.代码方式调用1.1创建服务提供者:Provider1.2创建服务调用者:Consumer2.注解方式调用注解实现原理分析总结在 Nacos 中,服务调用主要是通过 RestT...
    99+
    2024-04-02
  • RxJava处理业务异常的方式有哪些
    这篇文章主要为大家展示了“RxJava处理业务异常的方式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“RxJava处理业务异常的方式有哪些”这篇文章吧。关于异常Java的异常可以分为两种:...
    99+
    2023-05-30
    rxjava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作