欢迎关注头条号:老顾聊技术
精品原创技术分享,知识的组装工
目录前言为什么要自定义异常处理如何自定义异常处理测试总结前言我们平时在用SpringMVC的时候,只要是经过DispatcherServlet处理的请求,可以通过@ControllerAdvice和@ExceptionHandler自定义不同类型异常的处理逻辑。
具体可以参考老顾以前的文章,有过介绍
SpringMVC中提供的自定义异常体系在Spring-WebFlux中并不适用,其实原因很简单,两者底层的运行容器并不相同。WebExceptionHandler是Spring-WebFlux的异常处理器顶层接口,因此追溯到子类可以追踪到DefaultErrorWebExceptionHandler是Spring 电脑Cloud Gateway的全局异常处理器,配置类是ErrorWebFluxAutoConfiguratio。
为什么要自定义异常处理我们看一下上图,网关在整个架构中的作用是
1、路由服务端应用的请求到后端应用
2、(聚合)后端应用的响应转发到服务端应用
假设网关服务总是正常的前提下:
对于第1点来说,假设后端应用不能平滑无损上线,会有一定的几率出现网关路由请求到一些后端的“僵尸节点(请求路由过去的时候,应用更好在重启或者刚好停止)”,这个时候会路由会失败抛出异常,一般情况是Connection Refuse。
对于第2点来说,假设后端应用没有正确处理异常,那么应该会把异常信息经过网关转发回到服务端应用,这种情况理论上不会出现异常。
其实还有第3点隐藏的问题,网关如果不单单承担路由的功能,还包含了鉴权、限流等功能,如果这些功能开发的时候对异常捕获没有做完善的处理甚至是逻辑本身存在BUG,有可能导致异常没有被正常捕获处理,走了默认的异常处理器DefaultErrorWebExceptionHandler,默认的异常处理器的处理逻辑可能并不符合我们预期的结果。
如何自定义异常处理我们可以先看默认的异常处理器的配置类ErrorWebFluxAutoConfiguration:
注意到两个Bean实例ErrorWebExceptionHandler和DefaultErrorAttributes都使用了@ConditionalOnMissingBean注解,也就是我们可以通过自定义实现去覆盖它们。先自定义一个CustomErrorWebFluxAutoConfiguration(除了ErrorWebExceptionHandler的自定义实现,其他直接拷贝ErrorWebFluxAutoConfiguration):
errorWebExceptionHandler方法中替换自定义的ErrorWebExceptionHandler
自定义的JsonErrorWebExceptionHandler如下:
上面的代码中,三个注意点
1、getErrorAttributes用来自定义返回参数,当然小伙伴可以根据自身业务,更细致的区分返回参数。
2、getHttpStatus返回Http的状态码,也可以结合业务区分不同的状态码
3、异常时如何返回JSON而不是HTML?
getRoutingFunction方法,默认优先以Html格式返回
改为JSON格式,如下:
测试测试场景一:只启动网关,下游服务不启动的情况下直接调用下游服务:
测试场景二:下游服务正常启动和调用,网关自身抛出异常。 过滤器中加入代码int a=1/0会产生异常。
总结网关的异常处理是非常重要的,任何一个项目都需要自行定义本业务相关的异常,小伙伴可以关注自己公司的业务,是不是都有自定义异常?今天老顾就分享到这里。
---End---
最近老顾上传了微服务网关的电脑分享课程,请大家多多支持
推荐阅读
1、Gateway网关系列(二):SpringCloud Gateway入门实战,路由规则
2、Gateway网关系列开篇:SpringCloud的官方网关Gateway介绍
3、API网关在微服务架构中的应用,这一篇就够了
4、学习Lambda表达式看这篇就够了,不会让你失望的哦(续篇)
5、Lambda用在哪里?几种场景?
6、为什么会出现Lambda表达式,你知道吗?
7、不说“分布式事务”理论,直接上大厂阿里的解决方案,绝对实用
8、女程序员问到这个问题,让我思考了半天,Mysql的“三高”架构
9、大厂二面:CAP原则为什么只能满足其中两项?而不能同时满足
10、阿里P7二面:聊聊零拷贝的原理
11、秒杀系统的核心点都在这里,快来取
12、你了解如何利用token方式实现分布式Session吗?
13、Mysql索引结构演变,为什么最终会是那个结构呢?让你一看就懂
14、一场比赛涉及到的知识,用通俗易通的方式介绍并发协调
15、企业实战Redis全方面思考,你思考了吗?
16、面试题:Thread的start和run的区别
17、面试题:什么是CAS?CAS的作用以及缺点
18、如何访问redis中的海量数据?避免事故产生
19、如何解决Redis热点问题?以及如何发现热点?
20、如何设计API接口,实现统一格式返回?
21、你真的知道在生产环境下如何部署tomcat吗?
22、分享一线互联网大厂分布式唯一ID设计 之 snowflake方案
2电脑 3、分享大厂分布式唯一ID设计方案,快来围观
24、你想了解一线大厂的分布式唯一ID生成方案吗?
25、你知道如何处理大数据量吗?(数据拆分篇)
26、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)
27、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?
28、你了解大型网站的页面静态化吗?
29、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?
30、你知道怎么解决DB读写分离,导致数据不一致问题吗?
31、DB读写分离情况下,如何解决缓存和数据库不一致性问题?
32、你真的知道怎么使用缓存吗?
33、如何利用锁,防止缓存击穿?重构思想的重要性
34、海量订单产生的业务高峰期,如何避免消息的重复消费?
35、你知道如何保障生产端100%消息投递成功吗?
36、微服务下的分布式session该如何管理?
37、阿里二面:filter、interceptor、aspect应如何选择?很多人中招
38、互联网架构重要组员CDN,很多高级开发都没有实操过,来看这里
39、阿里二面:CDN缓存控制原理,看看能不能难住你
电脑