无论是Dubbo还是JSF等RPC框架,一般都会把接口分为2部分:

1,服务端(provider)

2,客户端(consumer)

由于,客户端与服务端可能不在同一个应用中,所以客户端一般在调用服务端的接口时,通常会返回一个结果实体,来标明这一次请求操作是否成功。

例如:

  

public class BaseResultDto<T> {

    /**
* 是否操作成功
*/
private boolean success; /**
* 提示信息
*/
private String msg;
/**
* 操作结果
*/
private T result;
}

客户端在拿到这个实体后,可以明确得知,这一次操作是否成功。

但是防御式编程中,我们应该对一切未知的接口都持有怀疑态度,况且不怕一万就怕万一:“如果服务端出现异常怎么办?”

网上有2中答案:

  1,直接将异常抛出去,经过RPC序列化后,客户端进行展示。

  2,不抛异常出去,服务端进行全方位拦截,拦截到后,通过BaseResultDto,告诉客户端现在服务端出现异常了。

但是各自的缺点很明显:

  1,服务端与客户端,很可能不在同一个应用中,所以各自会依赖不同的jar包,比方说:服务端抛出了个spring的duplicateKeyException,但是客户端并没用引用spring的相关jar包,这样就会导致:抛出异常后,由于客户端没有依赖这个类,最终抛出个ClassNotDefError,注意是Error不是Exception。如果客户端只对Exception进行捕获的话,会导致直接抛到最顶层。可能日志、重试等都没了。

  2,全方位拦截后,可能返回的结果中只会告诉客户端:“系统出现异常”,无法准确通过日志去定位问题。

最终解决方案:

  将2者折中处理,服务端全方位进行拦截,如果出现异常后,把异常信息转换成字符串,然后把异常信息返回到客户端中:

  

public class BaseResultDto<T> {

	/**
* 是否操作成功
*/
private boolean success; /**
* 提示信息
*/
private String msg;
/**
* 操作结果
*/
private T result; /**
* 异常堆栈信息
*/
private String errorTrace;
}

  errorTrace就是存储异常对战信息的属性,这样如果客户端检测到success为false,这样就可以直接把errorTrace打到log中,方便定位问题。

使用Dubbo、JSF等RPC框架时,对于异常的处理的更多相关文章

  1. 一个轻量级分布式RPC框架--NettyRpc

    1.背景 最近在搜索Netty和Zookeeper方面的文章时,看到了这篇文章<轻量级分布式 RPC 框架>,作者用Zookeeper.Netty和Spring写了一个轻量级的分布式RPC ...

  2. 轻量级分布式RPC框架

    随笔- 139  文章- 0  评论- 387  一个轻量级分布式RPC框架--NettyRpc   1.背景 最近在搜索Netty和Zookeeper方面的文章时,看到了这篇文章<轻量级分布式 ...

  3. 一个轻量级分布式 RPC 框架 — NettyRpc

    原文出处: 阿凡卢 1.背景 最近在搜索Netty和Zookeeper方面的文章时,看到了这篇文章<轻量级分布式 RPC 框架>,作者用Zookeeper.Netty和Spring写了一个 ...

  4. 带你手写基于 Spring 的可插拔式 RPC 框架(二)整体结构

    前言 上一篇文章中我们已经知道了什么是 RPC 框架和为什么要做一个 RPC 框架了,这一章我们来从宏观上分析,怎么来实现一个 RPC 框架,这个框架都有那些模块以及这些模块的作用. 总体设计 在我们 ...

  5. 动手实现一个简单的 rpc 框架到入门 grpc (上)

    rpc 全称 Remote Procedure Call 远程过程调用,即调用远程方法.我们调用当前进程中的方法时很简单,但是想要调用不同进程,甚至不同主机.不同语言中的方法时就需要借助 rpc 来实 ...

  6. RPC框架DUBBO

    1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...

  7. Netty自娱自乐之类Dubbo RPC 框架设计构想 【上篇】

    之前在前一篇的<Netty自娱自乐之协议栈设计>,菜鸟我已经自娱自乐了设计协议栈,gitHub地址为https://github.com/vOoT/ncustomer-protocal.先 ...

  8. 服务化实战之 dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型

    转自: http://blog.csdn.net/liubenlong007/article/details/54692241 概述 前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺 ...

  9. dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型

    概述 前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺点以及使用场景,最终结合本身项目的实际情况选择了使用dubbox作为rpc基础服务框架.下面就简单介绍一下RPC框架技术选型的过 ...

随机推荐

  1. dedecms搜索提示"关键字不能小于2个字节!"

    在测试自己制作的搜索页模板时,如果遇到搜索时提示"关键字不能小于2个字节!"!打开plus/search.php把   if(($keyword=='' || strlen($keyword)< ...

  2. node.js零基础详细教程(4):node.js事件机制、node异步IO操作

    第四章 建议学习时间3小时  课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...

  3. Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

    刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下 废话不多说 先上效果图 获取定位并根据手机朝向显示周边信息            使用的Unity ...

  4. Django中的枚举类型

    一.枚举类型示例 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等.Python 的原生类型(Built-in types)里并没有专门的枚举类型 ...

  5. Vue.js组件之间的通信

    导语:组件之间的关系不外乎两种, 父子组件和非父子组件,本文将对两类组件之间的通信方式进行详细阐述. 父子组件间的通信 通信方式1(单向绑定): Props down, Events up (建议使用 ...

  6. 浅谈OpenStack架构

    首先,先来了解,什么是OpenStack?   OpenStack是一个云平台管理的项目,它不是一个软件.这个项目由几个主要的组件组合起来完成一些具体的工作.OpenStack是一个旨在为公共及私有云 ...

  7. JavaWeb 环境搭建

    环境搭建 JDK7 Java基本开发工具包 安装(目录[不要使用中文和空格].JDK+JRE) 配置环境变量[JAVA_HOME.path.classpath] 2.        Tomcat7 提 ...

  8. 在 Mac OS 上编译 FFmpeg

    本文转自:在 Mac OS 上编译 FFmpeg | www.samirchen.com 安装 Xcode 和 Command Line Tools 从 App Store 上安装 Xcode,并确保 ...

  9. 前端UI组件复用工具

    "懒"是第一生产力. 代码复用总是程序员喜闻乐见的,前端组件化的最终目的就是复用,今天我们就将深入探讨如何实现UI组件的复用. 通常我们所说的组件往往是包含业务逻辑的前端组件,而这 ...

  10. github用法小结

      共享仓库     bare 裸仓库   生成裸仓库时必须以.git结尾.   仓库就相当于一个服务器     ### 创建远程仓库  1. 创建以.git结尾的目录mkdir repo.git 2 ...