浅谈微服务下异常处理
2019独角兽企业重金招聘Python工程师标准>>>
谈到微服务,必不可免就谈到spring cloud.
笔者正是基于spring cloud架构下的异常处理.
异常,按照业务划分下来,分为三类: 参数校验异常,自定义异常,以及系统异常.
参数校验异常: 通常是缺少参数,参数类型错误,以及相关校验不通过(javax.validation).
通常我们项目一开始,便定义了统一的基础异常类,和统一的错误码.
例如:
- 成功: 2000
- 缺少参数: 5001
- 参数类型错误: 5002
- 参数校验异常: 5003
- 系统异常: 5000
基础异常类:
public abstract class BaseException extends RuntimeException {private String code = ResultCodeConstant.SYSTEM_ERROR;public Result getResult() {return Result.fail(this.code, this.getMessage() != null?this.getMessage():"error");}public BaseException() {}public BaseException(String message) {super(message);}public BaseException(String code, String message) {super(message);this.code = code;}public BaseException(String message, Throwable cause) {super(message, cause);}public BaseException(Throwable cause) {super(cause);}public BaseException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}public String getCode() {return this.code;}public void setCode(String code) {this.code = code;}
}
code常量类:
public class ResultCodeConstant {public static final String SUCCESS = "2000";//成功public static final String ARGUMENT_VANISH = "5001";//缺少参数public static final String ARGUMENT_TYPE_MISMATCH = "5002";//类型错误public static final String ARGUMENT_CONSTRAINT_VIOLATION = "5003";//参数校验错误public static final String SYSTEM_ERROR = "5000";
}
对外服务
为了达到对外服务的友好和保密,处理异常时,往往是拦截异常后返回友好结果.
首先约定了对外的结果的封装
public class Result<T> implements Serializable {private String code;private String desc;private T data;public T getData() {return this.data;}public Result(String code, String desc, T data) {this.code = code;this.desc = desc;this.data = data;}public void setData(T data) {this.data = data;}public Result() {}public Result(String code, String desc) {this.code = code;this.desc = desc;}public String getCode() {return this.code;}public void setCode(String code) {this.code = code;}public String getDesc() {return this.desc;}public void setDesc(String desc) {this.desc = desc;}public String toJsonString() {return JSONObject.toJSONString(this, new SerializerFeature[]{SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteDateUseDateFormat});}public static Result okDesc() {return new Result(ResultCodeConstant.SUCCESS, "成功");}public static Result okDesc(String desc) {return new Result(ResultCodeConstant.SUCCESS, desc);}public static Result ok(Object data) {return new Result(ResultCodeConstant.SUCCESS, "", data);}public static Result ok(String desc, Object data) {return new Result(ResultCodeConstant.SUCCESS, desc, data);}public static Result fail() {return new Result(ResultCodeConstant.SYSTEM_ERROR, "error");}public static Result fail(String dsec) {return new Result(ResultCodeConstant.SYSTEM_ERROR, dsec);}public static Result fail(String code, String dsec) {return new Result(code, dsec);}public static Result fail(String code, String dsec, Object data) {return new Result(code, dsec, data);}
}
在spring中,可以通过@ControllerAdvice来拦截controller中抛出的异常
/*** Created by wenshiliang on 2017/1/16.*/
@ControllerAdvice()
@ConfigurationProperties
@Slf4j
public class GlobalExceptionHandler {@Autowiredprivate CounterService counterService;public GlobalExceptionHandler() {log.info("GlobalExceptionHandler构建");}@ExceptionHandler(BaseException.class)@ResponseBodypublic Result baseExceptionHandler(BaseException e, HttpServletResponse response) {log.error("拦截自定义异常", e);counterService.increment("exception.custom");return e.getResult();}@ExceptionHandler(MissingServletRequestParameterException.class)@ResponseBodypublic Result missingServletRequestParameterExceptionHandler(MissingServletRequestParameterException e,HttpServletResponse response) {log.warn("缺少参数", e);counterService.increment("exception.check");return Result.fail(ResultCodeConstant.ARGUMENT_VANISH,"缺少参数");}@ExceptionHandler(MethodArgumentTypeMismatchException.class)@ResponseBodypublic Result methodArgumentTypeMismatchExceptionExceptionHandler(MethodArgumentTypeMismatchException e,HttpServletResponse response) {log.warn("参数类型不正确", e);counterService.increment("exception.check");return Result.fail(ResultCodeConstant.ARGUMENT_TYPE_MISMATCH,"参数类型不正确");}/*** 参数校验异常** @param e* @param response* @return*/@ExceptionHandler(ConstraintViolationException.class)@ResponseBodypublic Result constraintViolationExceptionHandler(ConstraintViolationException e, HttpServletResponse response) {log.warn("参数校验异常", e);StringBuilder builder = new StringBuilder();Set<ConstraintViolation<?>> set = e.getConstraintViolations();if (set != null && set.size() > 0) {set.forEach(active -> {log.warn(active.getRootBeanClass() + active.getMessage());builder.append(active.getMessage()).append(".");});} else {builder.append("参数校验异常");}counterService.increment("exception.check");return Result.fail(ResultCodeConstant.ARGUMENT_CONSTRAINT_VIOLATION,builder.toString());}@ExceptionHandler(BindException.class)@ResponseBodypublic Result BindException(BindException e, HttpServletResponse response) {log.warn("参数校验异常", e);counterService.increment("exception.check");String desc = e.getBindingResult().getFieldError().getDefaultMessage();return Result.fail(ResultCodeConstant.ARGUMENT_CONSTRAINT_VIOLATION, desc);}@ExceptionHandler//处理其他异常@ResponseBody //public Result exceptionHandler(Exception e, HttpServletResponse response) {Result result = null;log.error("拦截异常", e);counterService.increment("exception.system");result = Result.fail();return result;}
}
##对内服务
转载于:https://my.oschina.net/superwen/blog/1502954
浅谈微服务下异常处理相关推荐
- 浅谈微服务的来龙去脉
作者:王清培(Plen wang) 沪江 公共业务平台 应用架构师 转载至沪江技术学院微信公众号 背景介绍 最近一段时间公共业务平台在进行大面积的重构,对原来的技术栈进行迁移,逐渐往Java.Go.N ...
- 浅谈微服务基建的逻辑
2019独角兽企业重金招聘Python工程师标准>>> 起点 首先,我们得有一个"服务".根据定义,我们可以把每个服务实例都视作一个黑盒.这个盒子有着明确的输入点 ...
- 浅谈微服务体系中的分层设计和领域划分
1.摘要 本文阐述了一种将分层设计和DDD领域设计应用于微服务体系架构的方案实践,也是个人的最佳实践.对于互联网公司来说,我们主张将其Web服务架构分为五层:基础设施层.领域服务层.应用服务层.网关层 ...
- 微服务怎么部署到服务器的_浅谈微服务部署方案
在项目迭代的过程中,不可避免需要"上线".上线对应着部署,或者重新部署:部署对应着修改:修改则意味着风险. 微服务目前有很多用于部署的技术,有的简单,有的复杂:有的得停机,有的不需 ...
- 代码重新发布后docker服务会不会受影响_分享点经验 | 浅谈微服务架构
点击蓝字关注我们 AMP 背景简介 在最原始的系统设计中,我们通常使用单体架构.单体架构把所有的业务逻辑都写在一起,没有对业务场景进行划分.在规模比较小的情况下工作情况良好,但是随着系统规模的扩大,它 ...
- (未完待续)浅谈微服务以及 常用中间件( zookeeper redis rabbitmq)
传统的单体框架,已经不满足目前公司战略规划要求,近几年"微服务" 这个字眼,出现的越来越频繁,虽然有过一年多微服务项目经验,也很难把微服务解释清楚,到底何为微服务? Martin ...
- cx_oracle写日志信息_浅谈微服务架构之构建日志收集系统
任何复杂的应用程序偶尔都会出现错误.在微服务应用程序中,需要跟踪几十甚至几百个服务发生的情况.要获取系统的整体视图,日志记录和监控至关重要.在微服务架构中,一个业务请求会经历多个服务,收集端到端链路上 ...
- (一)浅谈微服务概念理解
1.什么是微服务 让我们以一个餐厅为例来解释微服务的概念. 想象一家传统的餐厅,它有一个集中式的厨房,所有的菜品都在同一个厨房中准备和烹饪.这个厨房负责接收顾客的点餐请求,准备食材,烹饪菜品,并最终将 ...
- 阿里技术专家浅谈微服务架构
- 浅谈互联网时代下融媒技术现状
浅谈互联网时代下融媒技术现状 摘要:近年来,我国数字技术的迅速发展使得媒体技术在"互联网+"时代下不断发展融合,形成了如今的融合媒体技术.新兴融媒技术的发展给广播电视行业带来了新的 ...
最新文章
- vba 单元格 一系例操作
- 从0搭建一个Springboot+vue前后端分离项目(五)创建后台Springboot工程
- TCP、UDP、IP 协议分析
- 关于Python的执行原理你了解吗?
- [python 练习] 计算个税
- 宇宙十大不为人知的事情
- ol xyz 加载天地图_OpenLayers加载天地图方法——WMTS和XYZ
- php 生成excel空白,phpexcel库在localhost上运行良好,但在服务器中生成空白的excel文件...
- 如何集成Python代码和GUI来创建一个简单的游戏?
- linux-权限案例-文件与目录权限
- JQuery------Select标签的各种使用方法
- 二维傅立叶变换和二维傅立叶反变换
- 计算机相关审稿周期短的ei,计算机比较好发的sci期刊_比较水的计算机ei期刊_ei期刊计算机...
- 导入oracle 904,江湖救急..ora-904怎么处理?
- excel打开密码忘记了_Excel工作表保护密码忘记了怎么办?这一招轻松去除密码...
- 随机数种子(seed)
- 快速集成百度定位功能
- 《简化iOS APP上架流程,App Uploader助你搞定!》
- 帝国php漏洞,帝国CMS(EmpireCMS) v7.5 后台XSS漏洞分析
- C#中命名参数和可选参数
热门文章
- 卧槽!华为工程师总结的Java笔记,太优秀了!
- TCP 协议面试灵魂 12 问 !
- Kotlin 新版来了,支持跨平台!
- studio中碰到的jni问题:java.lang.UnsatisfiedLinkError
- centos php mongodb 驱动,安装 MongoDB PHP 驱动 在CentOS 6.x和遇到的问题
- mysql从库新增_MySQL新增从库
- python列表操作详解_Python --列表(List)详解
- FR切换sheet时隐藏参数面板
- c 语言打印沙漏图形,PAT乙级 1027打印沙漏 [图形输出]
- erc20钱包下载_DREP IOS客户端上线|支持BTC/DREP及所有ERC20通证,云端钱包功能