使用Dubbo、JSF等RPC框架时,对于异常的处理

无论是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中,方便定位问题。

时间: 2024-08-06 16:00:48

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

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

1.背景 最近在搜索Netty和Zookeeper方面的文章时,看到了这篇文章<轻量级分布式 RPC 框架>,作者用Zookeeper.Netty和Spring写了一个轻量级的分布式RPC框架.花了一些时间看了下他的代码,写的干净简单,写的RPC框架可以算是一个简易版的dubbo.这个RPC框架虽小,但是麻雀虽小,五脏俱全,有兴趣的可以学习一下. 项目地址:https://github.com/luxiaoxun/NettyRpc 自己花了点时间整理了下代码,并修改一些问题,以下是自己学习的一

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

前言 上一篇文章中我们已经知道了什么是 RPC 框架和为什么要做一个 RPC 框架了,这一章我们来从宏观上分析,怎么来实现一个 RPC 框架,这个框架都有那些模块以及这些模块的作用. 总体设计 在我们的整个框架里比较重要的几个模块: rpc-procotol: 既然是可插拔是框架,我们需要支持选择底层协议,这部分是通信协议相关的模块. rpc-spring: 我们的框架是基于 spring 开发的,这个模块是将我们的一些功能和 spring 整合起来,比如自动注入代理 bean,启动服务端 se

Spark源码研读-散篇记录(二):Spark内置RPC框架之TransportConf

1 Spark版本 Spark 2.1.0. 2 说明 去年在网易之初,已经开发了一个完整的RPC框架,其中使用的核心技术也是Netty,所以当看到Spark的RPC框架时,并不觉得太陌生,关于个人开发的这个RPC框架,真正完全可用是在今年,明年会完善一下,开源出来,因为个人觉得弄得一个简单RPC框架的技术原理,对于大数据.分布式计算相关的知识,真的是帮助太大.本篇说一下TransportContext.TransportConf.ConfigProvider.SparkTransportCon

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

之前在前一篇的<Netty自娱自乐之协议栈设计>,菜鸟我已经自娱自乐了设计协议栈,gitHub地址为https://github.com/vOoT/ncustomer-protocal.先这一篇中,准备接着自娱去实现一个RPC框架,现在公司共的是Dubbo,那么先不看其代码,先自行实现一下吧. dubbo 包括 注册和服务调用,细节我们先不管,然后,我先先实现一个如下的简单模型 哈哈哈,第一个版本就是这么简单,粗暴.说到自定义配置,首先想到的是Spring 自定义标签,利用标签进行配置服务.而

RPC框架与Dubbo完整使用

这并不是原理性的解释文章.而是快速入门,还有一个完整的Java例子. 一篇我觉得不错的文章推荐:深入浅出 RPC - 浅出篇 一.RPC 什么是RPC? RPC(Remote Procedure Call)远程过程调用.见名知意 - 从远程主机调用一个过程/函数. RPC的目标是:使得程序调用其它远程主机上的函数,好像调用本程序内的函数一样简单.并且屏蔽编程语言的差异性. 要实现上述目标,首先的是设计一种通讯协议,所以RPC还代表着这一类协议(Protocol) RPC不是一个具体的协议,而是一

RPC框架DUBBO

1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)其核心部分包含:1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,

RPC框架Dubbo分析

1,背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本 此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键 垂直应用架构 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率 此时,用于加速前端页面开发的 Web框架(MVC) 是关键 分布式服务

RPC框架Dubbo深入分析

1,背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本 此时,用于简化增删改查工作量的?数据访问框架(ORM)?是关键 垂直应用架构?当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率此时,用于加速前端页面开发的?Web框架(MVC)?是关键分布式服务架构

RPC框架之Dubbo

问题1:为什么要把系统拆分成分布式的?为啥要用dubbo? 1.为什么要将系统进行拆分? 要是不拆分系统,一个大系统几十万行代码,很多人共同维护一份代码,简直是悲剧: 拆分了以后,一个大系统拆分成很多小服务,平均每个系统也就几万行代码,每个服务部署到单独的机器 2.如何进行服务拆分? ? 大部分系统,是要进行多轮拆分的,第一次拆分就可能将原来的多个模块拆分开来. ? 但是后来可能每个系统都变得很复杂了,每个模块拆分出来的服务又要继续拆分. 3.拆分后可以不用dubbo吗? ? 当然可以,大不了各