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

浅谈微服务下异常处理相关推荐

  1. 浅谈微服务的来龙去脉

    作者:王清培(Plen wang) 沪江 公共业务平台 应用架构师 转载至沪江技术学院微信公众号 背景介绍 最近一段时间公共业务平台在进行大面积的重构,对原来的技术栈进行迁移,逐渐往Java.Go.N ...

  2. 浅谈微服务基建的逻辑

    2019独角兽企业重金招聘Python工程师标准>>> 起点 首先,我们得有一个"服务".根据定义,我们可以把每个服务实例都视作一个黑盒.这个盒子有着明确的输入点 ...

  3. 浅谈微服务体系中的分层设计和领域划分

    1.摘要 本文阐述了一种将分层设计和DDD领域设计应用于微服务体系架构的方案实践,也是个人的最佳实践.对于互联网公司来说,我们主张将其Web服务架构分为五层:基础设施层.领域服务层.应用服务层.网关层 ...

  4. 微服务怎么部署到服务器的_浅谈微服务部署方案

    在项目迭代的过程中,不可避免需要"上线".上线对应着部署,或者重新部署:部署对应着修改:修改则意味着风险. 微服务目前有很多用于部署的技术,有的简单,有的复杂:有的得停机,有的不需 ...

  5. 代码重新发布后docker服务会不会受影响_分享点经验 | 浅谈微服务架构

    点击蓝字关注我们 AMP 背景简介 在最原始的系统设计中,我们通常使用单体架构.单体架构把所有的业务逻辑都写在一起,没有对业务场景进行划分.在规模比较小的情况下工作情况良好,但是随着系统规模的扩大,它 ...

  6. (未完待续)浅谈微服务以及 常用中间件( zookeeper redis rabbitmq)

    传统的单体框架,已经不满足目前公司战略规划要求,近几年"微服务" 这个字眼,出现的越来越频繁,虽然有过一年多微服务项目经验,也很难把微服务解释清楚,到底何为微服务? Martin ...

  7. cx_oracle写日志信息_浅谈微服务架构之构建日志收集系统

    任何复杂的应用程序偶尔都会出现错误.在微服务应用程序中,需要跟踪几十甚至几百个服务发生的情况.要获取系统的整体视图,日志记录和监控至关重要.在微服务架构中,一个业务请求会经历多个服务,收集端到端链路上 ...

  8. (一)浅谈微服务概念理解

    1.什么是微服务 让我们以一个餐厅为例来解释微服务的概念. 想象一家传统的餐厅,它有一个集中式的厨房,所有的菜品都在同一个厨房中准备和烹饪.这个厨房负责接收顾客的点餐请求,准备食材,烹饪菜品,并最终将 ...

  9. 阿里技术专家浅谈微服务架构

  10. 浅谈互联网时代下融媒技术现状

    浅谈互联网时代下融媒技术现状 摘要:近年来,我国数字技术的迅速发展使得媒体技术在"互联网+"时代下不断发展融合,形成了如今的融合媒体技术.新兴融媒技术的发展给广播电视行业带来了新的 ...

最新文章

  1. vba 单元格 一系例操作
  2. 从0搭建一个Springboot+vue前后端分离项目(五)创建后台Springboot工程
  3. TCP、UDP、IP 协议分析
  4. 关于Python的执行原理你了解吗?
  5. [python 练习] 计算个税
  6. 宇宙十大不为人知的事情
  7. ol xyz 加载天地图_OpenLayers加载天地图方法——WMTS和XYZ
  8. php 生成excel空白,phpexcel库在localhost上运行良好,但在服务器中生成空白的excel文件...
  9. 如何集成Python代码和GUI来创建一个简单的游戏?
  10. linux-权限案例-文件与目录权限
  11. JQuery------Select标签的各种使用方法
  12. 二维傅立叶变换和二维傅立叶反变换
  13. 计算机相关审稿周期短的ei,计算机比较好发的sci期刊_比较水的计算机ei期刊_ei期刊计算机...
  14. 导入oracle 904,江湖救急..ora-904怎么处理?
  15. excel打开密码忘记了_Excel工作表保护密码忘记了怎么办?这一招轻松去除密码...
  16. 随机数种子(seed)
  17. 快速集成百度定位功能
  18. 《简化iOS APP上架流程,App Uploader助你搞定!》
  19. 帝国php漏洞,帝国CMS(EmpireCMS) v7.5 后台XSS漏洞分析
  20. C#中命名参数和可选参数

热门文章

  1. 卧槽!华为工程师总结的Java笔记,太优秀了!
  2. TCP 协议面试灵魂 12 问 !
  3. Kotlin 新版来了,支持跨平台!
  4. studio中碰到的jni问题:java.lang.UnsatisfiedLinkError
  5. centos php mongodb 驱动,安装 MongoDB PHP 驱动 在CentOS 6.x和遇到的问题
  6. mysql从库新增_MySQL新增从库
  7. python列表操作详解_Python --列表(List)详解
  8. FR切换sheet时隐藏参数面板
  9. c 语言打印沙漏图形,PAT乙级 1027打印沙漏 [图形输出]
  10. erc20钱包下载_DREP IOS客户端上线|支持BTC/DREP及所有ERC20通证,云端钱包功能