Spring Cloud 异常处理

Spring Cloud微服务如何设计异常处理机制? 现在的问题是,虽然FeignClient向服务调用方提供了类似于本地代码调用的服务对接体验,但服务调用方却是不希望调用时发生错误的,即便发生错误,如何进行错误处理也是服务调用方希望知道的事情。如我们在把返回数据就是设计成了一个正常的VO/BO对象的这种形式,而不是向外部接口那么样额外设计错误码或者错误信息之类的字段,当然,也并不是说那样的设计方式不可以,只是感觉会让内部正常的逻辑调用,变得比较啰嗦和冗余,毕竟对于内部微服务调用来说,要么对,要么错,错了就Fallback逻辑就好了。 阅读详情

转载 : https://www.cnblogs.com/yish/p/5850813.html

一开始我想着是在Feign的ErrorDecoder上做自定义的异常处理,来实现根据http code抛出各种异常。但是Feign与Hystrix结合之后,发现一个问题,只要服务调用抛出了Throwable类就会触发Hystrix的fallback(前提是配置了fallback)。想来想去都没有想到怎么利用这套机制来实现业务逻辑上的异常分支和服务器处理异常。最后,灵光一现:

  我把异常分成两大类,ClientException和ServerException。无论哪一种异常,都会导致对应服务本地事务回滚。当发生ClientException时,向客户端返回的http code为200,当发生ServerException时,向客户端返回的http code为500。

  ClientException是由客户端引起的异常,比如输入非法参数或者用户登录输入错误的密码导致登录失败而业务逻辑进入到非主线分支,这类问题其实都是客户端导致的,只需要拒绝服务让客户端提交正确的参数即可恢复。因此当遇到这种异常的时候,其实业务逻辑是执行成功的,只不过进入了非主线分支而已。

  ServerException则是由服务器上的逻辑漏洞或者其他什么原因导致的无法由客户端重新提交来纠正的错误,比如服务器代码上写的不严谨在某个地方报了空指针异常,这种问题客户端无论提交多少次正确的参数都无法修正,因此是属于服务器内部错误。

  将异常分成这两类之后,处理起来就清晰很多了。现在假设有两个服务A、B,外部请求进来的时候,由网关服务转发至A,A的处理过程中需要调用B,此时可能会发生以下几种情况:

  1、A调用B之前发生ClientException,以Http Code 200返回结果至外部客户端,http Body中会有固定的格式包含自定义的业务code、msg、data等。客户端解析code后提示用户msg并执行对应的逻辑来重新提交请求。通俗一点讲就是登陆的时候输入了错误的密码,请求提交后页面提示密码错误,此时重新输入正确密码,提交,登录成功。

  2、A调用B之前发生ServerException,这个没办法,服务暂时不可用了。等重新发布来修复。

  3、A调用B时,B发生ClientException。此时Http Code 200返回结果至A,但是A在从http Body中提取data时,会发现业务code不等于操作成功的那个值,则A抛出对应的ClientException,让客户端重新提交正确参数。

  4、A调用B时,B发生ServerException。则A的Feign 客户端在解析的时候就会抛出FeignException异常(由于http code为500)。此时有两种选择,A捕获到FeignException,本地事务中断回滚,并告知客户端服务整体不可用,不过这样体验不好。还有一种选择,就是当A的feign客户端配置了fallback,则发生FeignException时会进入对应的fallback代码,那么在这段代码里可以向消息队列里发送这个调用请求!对应的B会监听这个调用消息,然而此时无论B调用多少次都会报错,不过没关系。紧急发布一个补丁,修复导致ServerException的那个bug,然后部署上线。当新版本的B代码监听到这个消息时,请求就会处理成功,以达到最终一致性!

  5、A调用B成功后,A本地事务提交出错,这个问题比较恶心,粗略想了一下A try catch一下然后调用B的补偿接口来使B的数据恢复正常。

     最后,为了安全起见,微服务之前涉及到修改操作的接口,都要保证幂等性。最简单的一个情况就是服务调用超时,Feign会自动重新发送请求几次,那么假设某服务响应过慢,则极有可能导致请求重复提交,若没有做到幂等则会产生错误数据。另外一个就是基于消息队列来保证最终一致性,也有可能发生请求重复处理。

在 Spring Cloud Gateway 中,异常处理是一个关键功能,用于在网关层面对请求进行统一的错误处理和响应 在 Spring Cloud Gateway 中,异常处理是一个关键功能,用于在网关层面对请求进行统一的错误处理和响应。以下是关于 Spring Cloud Gateway 异常处理的详细介绍,包括源码解析和自定义异常处理的方案。 阅读详情

相关推荐

MFC使用Websocket通讯介绍和实例(附完整源码)

踩坑点,下载了好几个boost版本编译,经常出问题,后来搜索了好久资料才发现如下评论:WebSocket++0.8.2 has been tested through Boost 1.72。WebSocketpp依赖于boost,因此在使用WebSocketpp前需要编译Boost;所以我们直接下载Boost 1.72的windows版的进行安装,安装完成还需要编译;WebSocketpp也叫WebSocket++;服务编译好之后,使用。

weixin_42530684的博客 1171

SpringCloud组件OpenFeign——将服务端详细异常信息返回给客户端

一、场景 最近使用单位封装的微服务架构搭建微服务项目,封装的不太多,大部分可以按原生的SpringCloud组件的使用方式使用。涉及到的组件有Nacos、Ribbon、OpenFeign、Hystrix、Sentinel。领导让搭建微服务项目,并且不使用Hystrix和Sentinel做服务熔断和降级,即客户端通过OpenFeign调用服务端服务,如果服务端异常直接返回给客户端,客户端能够捕获并打印出异常信息。 二、模拟服务端异常 先让服务端产生一个算数异常并抛出,看一下正常情况下客户端会怎么样。 .

Luffy的博客 6992

从ResNet到EfficientNet:特征金字塔网络(FPN)在不同骨干网中的适配指南

本文深入探讨了特征金字塔网络(FPN)与ResNet、VGG、EfficientNet等主流骨干网络的适配策略。文章详细解析了FPN的核心原理,并针对不同骨干网络的特征提取特性,提供了通道对齐、参数量估算及迁移学习的系统化指南,旨在帮助开发者在目标检测等视觉任务中构建高性能、高效率的模型。

weixin_29047919的博客 220

你的异常别被自己 “吃” 掉了都不知道!

我们在开发企业应用时,由于数据操作在顺序执行的过程中,线上可能有各种无法预知的问题,任何一步操作都有可能发生异常,异常则会导致后续的操作无法完成。此时由于业务逻辑并未正确的完成,所以在之前操作过数据库的动作并不可靠,需要在这种情况下进行数据的回滚。 这叫事务。事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态。这...

5446

用户视角下的vfsglobal预约困境:从注册到登录的全流程避坑指南

本文详细解析了vfsglobal签证预约系统从注册到登录的全流程操作,帮助用户避开常见技术陷阱。针对IP限制、DNS解析、浏览器缓存等登录障碍提供实用解决方案,并揭示账号管理的隐藏规则与支付环节的延时处理技巧,助力用户高效完成签证预约。

ol78901234的博客 871

MIPI D-PHYv2.5笔记(11) -- 高速时钟传输(High-Speed Clock Transmission)

在High-Speed模式中,Clock Lane提供了一个低摆幅(low-swing)、差分DDR时钟信号,此信号从Master到Slave,用于为高速数据传输提供时钟信号。时钟信号关于Forward Direction中的Data Lane上的位切换序列(toggling bit sequence)有正交相位,并且在一次burst的第一个被传输的bit的中心点有一个上升沿。

vivo01的专栏 3021

springcloud服务间调用出现错误,HystrixRuntimeException :api timed-out and no fallback available

在做大数据平台项目期间,由于是微服务架构,存在服务间的调用问题,做压力测试,并发在每秒50左右时,服务A调用服务B时,服务A会出现以下错误: 经过查找原因,是因为服务间调用时,FeignClient注解的接口没有实现类,即找不到回调逻辑,所以会报这个错误,正常情况下,应该指明 @FeignClient(value = "auth",fallback = AuthLoginClientFa...

selectgoodboy的博客 6182

Unity性能优化 - 动态图集

Unity 动态图集是 Unity 引擎中用于处理游戏纹理优化的一种技术。本文介绍了什么是动态图集,动态图集的优缺点,以及提供了一套完整的代码供大家参考。

qq_33808037的博客 4840

SpringCloud跨服务调用失败Seata无法回滚解决办法

微服务使用Seata作为分布式事务,在调用中 全局事务与本地事务不一致

qq_44021541的博客 2273

【WRFDA教程第四期】雷达数据同化(Radar Data Assimilation)

雷达数据同化(Radar Data Assimilation)

WW、forever的博客 1758

Lammps模拟剪切作用下的位错滑移

Lammps模拟位错与障碍物作用。在lammps中实现周期性位错阵列模型模拟剪切作用下1/2刃位错与障碍物的交互作用

Rockyoung 3460

Spring Cloud Zuul异常处理

最近看到了一个GitHub issue在讨论如何在post类型的zuul filter中设置response body,其中涉及到异常情况下,如何返回一个自定义的response body。正好我在升级spring-cloud,也想弄清楚,spring-cloud-zuul是如何处理异常情况的,所以就仔细看了看这部分的实现细节,现在做个笔记记录下来。 1. zuul 请求的生命周期图 关于zuul...

我飞故我在的专栏 3552

TCP/IP工业通信C#极致实现:工业级TcpClient封装 + 粘包拆包彻底解决 + 高频采集专项优化(完整可投产)

在工业自动化、PLC通信、工业传感器/模块、产线高频数据采集等场景中,TCP/IP是绝对主流的通信方式,相比串口/485,具备传输速率高、距离无限制、布线简单、抗干扰强的优势。但工业TCP通信和普通桌面TCP通信有本质区别,工业场景的核心要求是:✔高可靠:7×24小时不间断运行,断网自动重连、异常自动恢复,绝不崩溃;✔无数据错误:彻底解决「粘包、拆包、半包」问题(工业通信第一大坑,90%的通信异常源于此);✔高频采集优化:支持级别的高频读写PLC/设备,无卡顿、无丢帧、CPU占用极低;✔。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 859

Spring Cloud Gateway 自定义异常处理

一、背景 平时我们在Spring MVC层面做自定义异常出处理都是通过@ControllerAdvice和@ExceptionHandler自定义不同类型异常的处理逻辑,如图 以上只是简单的同一处理异常,具体实现方式可根据项目自定义处理,这里就不展开细说。 不过本文的重点是在网关层自定义异常,因为请求通过网关再到服务,中间难免会有未处理好的异常抛出,加上网关还有限流,熔断等功能,难免有异常抛出,这个时候我们就需要对这些异常做个处理, Spring Cloud Gateway默认的异常处理重点是在Defau

代码搬运工 8054

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Spring Cloud Feign 熔断、异常处理

spring cloud alibaba 用Feign调取服务时,如果服务端发生异常要传递给客户端,或者客户端拦截到异常响应做相应的业务处理,可有几种实现。

至今、的专栏 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring Cloud Gateway 全局通用异常处理

为什么需要全局异常处理 在传统 Spring Boot 应用中, 我们 @ControllerAdvice 来处理全局的异常,进行统一包装返回 // 摘至 spring cloud alibaba console 模块处理 @ControllerAdvice public class ConsoleExceptionHandler { @ExceptionHandler(AccessException.class) private ResponseEntity<String>

冷冷的博客 6885

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring Cloud Gateway中异常处理 [JSON]

最近我们的项目在考虑使用Gateway,考虑使用Spring Cloud Gateway,发现网关的异常处理和spring boot 单体应用异常处理还是有很大区别的。让我们来回顾一下异常。 关于异常是拿来干什么的,很多人老程序员认为就是拿来我们Debug的时候排错的,当然这一点确实是异常机制非常大的一个好处,但异常机制包含着更多的意义。 关注业务实现。异常机制使得业务代码与异常处理代码可以分开,你可以将一些你调用数据库操作的代码写在一个方法里而只需要在方法上加上throw DB相关的异常。至于如何处.

z69183787的专栏 2166

Spring Cloud Gateway 异常处理与错误响应

本文深入探讨Spring Cloud Gateway的异常处理与错误响应机制,涵盖全局异常处理、自定义错误页面、熔断降级、异常监控等核心技术。通过实际代码示例和架构图,帮助开发者构建健壮的网关系统,为AI应用开发者提供实用的技术参考,实现完善的错误处理体系。路由异常:路由配置错误、路由匹配失败网络异常:连接超时、网络中断服务异常:下游服务不可用、响应超时协议异常:HTTP协议错误、WebSocket连接失败安全异常:认证失败、权限不足参数异常:请求参数校验失败@Component。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1222

Spring Cloud:Sentinel异常处理(六)

摘要:Sentinel是一个服务保护框架,支持限流、熔断降级等功能。使用步骤包括:1)下载并启动控制台;2)导入相关依赖;3)配置控制台地址;4)为资源添加@SentinelResource注解创建保护机制。异常处理提供三种方式:1)Web接口方式自定义异常返回JSON;2)使用blockHandler指定兜底回调方法;3)结合OpenFeign实现远程调用保护。通过配置可实现对服务的全方位保护,确保系统稳定性。

mdforeverlive的博客 433
上一篇: loadrunner通过注册中心 网关压测spring cloud应用
下一篇: eclispe git冲突解决办法
琅琊山二当家
博客等级 码龄18年 447粉丝 322原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值