Spring Cloud 网关异常处理实践

文章来源:陈同学 | 异常处理实践

本文分享自己关于异常处理的理解。

为什么需要异常处理机制?

良好的异常处理机制带来许多好处,例如:

  • 及时发现问题,别让用户找上门时我方还一头雾水
  • 辅助开发人员准确定位问题
  • 统计分析

…...

异常机制要达到什么效果?

异常信息受众有两类:人和机器.

  • :用户、运营、开发人员等
  • 机器:根据状态码程序进行处理

针对受众,各方的需求可能有:

  • 用户:给用户看得懂的反馈,例如:密码错误
  • 运营:根据信息能判断 哪个用户、在什么时候、做什么操作时、发生了什么问题
  • 开发人员:根据信息能判断用户环境(用户、Token等)、请求信息(请求方式、数据格式、请求的数据、URL、请求时间)、异常信息(stacktrace、异常状态码、异常消息)、日志信息(报错时的关键ID、单据等)、服务信息(哪个服务、哪个实例、在哪台机器)等

如何进行异常预警?

异常预警要根据团队及业务情况来,初创团队简单处理,有余力再好好整。

  • 简单处理:出现异常发个邮件通知即可
  • 稳妥处理:由于非工作时间大家不一定看邮件,严重异常除普通预警,还可以进行:短信通知、微信通知、自动语音拨号等措施,做到哪怕人在睡觉,只要通讯正常,也能把人抓起来

有余力可以自建异常处理平台,有一套异常处理流程,有个炫酷且实用的Dashboard。

SpringCloud网关处理异常案例

目前我们使用的异常处理方式,请根据红色序号阅读:

案例

网关异常处理

流程简析:

  • 1.用户发起请求,经负载均衡后最后达到网关
  • 2.网关路由到具体的服务某实例
  • 3.服务实例运行时抛出了异常,服务需在最上层捕获异常并封装好数据返回到网关.

例如:结合@ControllerAdvice + @ExceptionHandler捕获异常,创建一个异常处理starter让各个服务直接引用maven依赖,starter中直接注入异常处理Bean,这样具体服务开发时不用关心异常处理,专注业务即可。同时将异常处理与业务模块解耦,便于后续拓展异常处理。

  • 4.服务返回封装好的数据返回到网关
  • 5.网关针对异常处理进行处理,为了保证性能,网关仅初步处理异常

e1.解析异常码: 由网关解析异常码的好处是:具体服务只需要用枚举类定义异常状态码,不需要关心异常对应的提示信息。同时也只需要网关连接到缓存(例如:redis)

e3.纠正HTTP状态码:网关和具体服务之间可以通过任意状态码通讯,但到网关时必须将HTTP状态码调整为HTTP标准状态码

  • 6.用户得到可读的反馈信息

为什么用网关处理异常?

出于以下几个考虑,使用了网关来处理异常:

  • 若异常交给具体服务处理,那么各个团队在代码中处理异常的方式将 "形色各异",不好统一管理
  • 开发人员应该专注于业务,知道合理的抛出异常即可,具体服务不应该重复做相同的事情
  • 异常状态码对应的异常消息应该统一读取,具体的服务不允许直接访问缓存服务器
  • 异常处理流程本身较为复杂,例如:持久化、预警等,各个服务不需要做同样的事情

这个思路和AOP的理念有点类似

预警数据Demo

上面扯了很多异常效果,下面展示下我们团队的邮件预警效果(数据无实际意义,拼凑而成):

exception mail

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Python老司机带你快速搞定日志分析工具

转载自:Python中文社区 ID:python-china 日志分析在web系统中故障排查、性能分析方面有着非常重要的作用。该工具的侧重点不是通常的P...

35350
来自专栏Python中文社区

Python爬取网易云音乐热门评论

專 欄 ❈王雨城,Python中文社区专栏作者 博客: http://www.jianshu.com/u/88ff70818bd1 ❈ ? 分析api 我们首...

269100
来自专栏狮乐园

在 redux 中集成 angular di 机制

最近一直在折腾redux相关的东西,算然说官方鼓励的使用方式是将redux和react一起使用,但并不影响我们在其他的mvvm框架中使用它。

12630
来自专栏Linyb极客之路

API设计:先思考再编码

14330
来自专栏FreeBuf

Any.Run交互式恶意软件分析沙盒服务现向公众免费开放

近日,名为Any.Run的交互式恶意软件分析沙盒服务宣布,其免费社区版本正式向公众开放。这样一来任何人只需简单的注册一个账号,就可以使用该平台实时的对某个特定文...

41560
来自专栏C/C++基础

C/C++代码调试的几点建议

代码调试在程序开发阶段占有举足轻重的地位,可见代码调试的重要性。但是有一点必须强调:程序是设计出来的,而不是调试出来的。这是所有程序员必须牢记在心的一条准则。一...

9210
来自专栏程序员的碎碎念

π框架之ADM分层架构

目录结构 phalapi 2.X版本与第一个版本在项目目录结构上有很大的差异,更面向自动化、国际化和流行化,学习起来更易懂。(前提是你理解了composer、命...

42980
来自专栏芋道源码1024

小谈 Java 单元测试

总之有无数种理由不想写UT,作为工作不到三年的菜鸟深有体会。之前在点评工作的时候,团队的“UT”都集中于RPC的服务端。为啥带双引号? 因为RPC的服务端没有页...

16830
来自专栏喵了个咪的博客空间

phalapi-进阶篇4(notrom进阶以及事务操作)

#phalapi-进阶篇4(notrom进阶以及事务操作)# ? ##前言## 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的...

35660
来自专栏PHP在线

文件缓存介绍

随着网络的发展,数据越来越多,从而导致运算压力越来越大。为了解决这一问题,就需要合理分配资源,充分利用已有资源,缓存的工作实际就是资源的合理分配。 在w...

37690

扫码关注云+社区

领取腾讯云代金券