1.浅谈容错先简单谈(Java动态代理机制的出现)
1.浅谈容错
先简单谈一下容错技术,为了保证系统的高可用,以及高可靠性,系统的设计者通常会在关键技术环节实行一定的容错技术,保证系统在运行的过程中,一旦出现问题和异常,系统可以自动恢复功能。
那么怎样才能实现容错呢?其实容错根本解决途径在于冗余,正所谓万变不离其宗css容错包,如果你有兴趣可以参考一些专门讲授容错技术的书籍,以及论文,你会发现他们讲授的解决方案,基本上都是采用各种冗余技术,实现容错处理的。
对于冗余而言,其实可以分为两种,一种是物理冗余,这种冗余在自然界很常见,例如人有两只眼睛,两只耳朵,两双手,一旦其中一个部位发生问题,还有另外一个部位可以使用。在系统设计领域,常见很多机器关键部位的设计都有备份元器件,一旦发生问题,备份元器件可以接着实现原有功能。对于可靠性要求比价高的领域,典型的如航天,军事,通常关键的软件设计采用n版本的方式,有不同的程序员对同一功能进行开发,对于相同输入结果实行表决机制,认为输出结果占多数一致的情况是正常输出数据。
另外一种冗余叫做时间冗余,一旦发生问题,系统重新再次执行,保证系统在多次尝试的情况下css容错包,恢复正常功能。简单的例子例如,一些基于消息的异步处理系统,一旦系统检测到消息发送异常,会尝试重新发送消息。
2.简述动态代理
众所周知,代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。
Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架。
java的动态代理包含以下相关接口和类:
1.java.lang.reflect.Proxy,提供了一组静态方法来为一组接口动态地生成代理类及其对象
2.java.lang.reflect.InvocationHandler,调用处理器接口,它自定义了一个 invoke 方法,用于集中处理在动态代理类对象上的方法调用,通常在该方法中实现对委托类的代理访问。
详细的动态代理的知识可以参考各种网上的资源,例如:
3.如何使用动态处理进行容错
正所谓遇到问题要对症下药,本篇文章讲述的方法不是包治百病的灵丹妙药,也是对于一些特定问题而产生的,现在描述一下具体的问题情况:处理的异常情况只包含可恢复性异常,什么是可恢复性异常呢?举例来说,例如远程调用经常会出现的超时异常,以及有网络不稳定等原因引起的网络服务,如FTP服务引起的连接异常等。
每当程序当中遇到这些异常情况时,如果程序不做特殊处理,通常会将异常抛出,导致程序运行失败。其实,如果程序再重新执行多遍的话,这些异常很可能并不会再次发生,并顺利执行完程序。因此,针对可恢复性异常这种特点,我们采用时间容错的方式,每当异常发生时,重新执行,在有限次数内,通过某次顺利的执行,完成程序应有的功能。
下面我们将看几段代码,因为可恢复性异常比较难再现,因此,我们使用特定的方法(随机数模拟)模拟可恢复性异常,用以说明问题。
1。要调用的方法接口FaultTolerantDemoService
2。要调用的方法实现FaultTolerantDemoServiceImpl
3。动态代理容错工具类
4。调用方法演示
程序输出结果:
使用动态代理进行容错处理的优点:
1、代码侵入性小,代码的逻辑业务和容错处理部分比较分明,用户改动业务代码时,不用过分考虑容错部分代码的影响。
2、如果需要容错的方法数量比较多时,可以非常有效的节省代码的编写工作量,最大程度上做到代码的重用。
使用动态代理进行容错处理的缺点:
1、受动态代理机制本身属性的影响,必须编写方法实现的接口,有一定程度上制约。
发表评论
热门文章
Spimes主题专为博客、自媒体、资讯类的网站设计....
一款个人简历主题,可以简单搭建一下,具体也比较简单....
仿制主题,Typecho博客主题,昼夜双版设计,可....
用于作品展示、资源下载,行业垂直性网站、个人博客,....
Z.
4天前
博主你好,Deng插件,这个点击不进去,提示这个(Warning: require_once(/www/wwwroot/w.zzy2020.com/usr/plugins/Deng/Deng/html/profile.php): failed to open stream: No such file or directory in /www/wwwroot/w.zzy2020.com/Fresh/extending.php on line 26
Fatal error: require_once(): Failed opening required '/www/wwwroot/w.zzy2020.com/usr/plugins/Deng/Deng/html/profile.php' (include_path='.:/www/server/php/72/lib/php') in /www/wwwroot/w.zzy2020.com/Fresh/extending.php on line 26)