无论是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. linux切换g++

    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 50(优先级) sudo update-alternative ...

  2. 织梦CMS去广告方法 for DedeCMS V5.7

    DedeCms 5.7新版发布,下来上传至服务器安装完毕,点击进入后台登陆界面,怎么多了广告链,而且登陆界面也变了,以前可不带这样的啊.按步骤一步一步来去版权再去广告吧. 一,去处后台登陆页login ...

  3. SQL Server Alwayson可用性副本会话期间的可能故障

    200 ? "200px" : this.width)!important;} --> 介绍 物理故障.操作系统故障或 SQL Server 故障都可能导致两个可用性副本之间 ...

  4. Chapter 3:Speech Production and Perception

    作者:桂. 时间:2017-05-24  09:09:36 主要是<Speech enhancement: theory and practice>的读书笔记,全部内容可以点击这里. 一. ...

  5. SQL VIEW(视图)

    视图是可视化的表. SQL CREATE VIEW 语句 什么是视图? 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表. 视图包含行和列,就像一个真实的表.视图中的字段就是来自一个或多个 ...

  6. win7双系统安装openSUSE13.2解决【引导加载器安装期间出错】问题

    原始日期:2015-08-17 14:16 昨晚不知道哪根筋不对,突然想装一个liunx系统,与win7形成双系统,最终选定openSUSE13.2,想想以前也安装过Ubuntu,应该差不多,所以直接 ...

  7. JAVA 23种开发模式详解(代码举例)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  8. js中的函数

    [函数的声明及调用] 基础知识 1.函数声明的格式: function 函数名(参数1,参数2,....){ //函数体 return 结果: } >>>函数调用的格式: 直接调用: ...

  9. javascript所有的节点和方法

    属性: 1.Attributes 存储节点的属性列表(只读) 2.childNodes 存储节点的子节点列表(只读) 3.dataType 返回此节点的数据类型 4.Definition 以DTD或X ...

  10. java实现Excel的导入、导出

    一.Excel的导入 导入可采用两种方式,一种是JXL,另一种是POI,但前者不能读取高版本的Excel(07以上),后者更具兼容性.由于对两种方式都进行了尝试,就都贴出来分享(若有错误,请给予指正) ...