关于Java健壮性的一些思考与实践

Posted aa475968700

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Java健壮性的一些思考与实践相关的知识,希望对你有一定的参考价值。

程序健壮性非常重要,要怎么玩怎么写才能让程序更加鲁棒呢?我又这么几点小建议。

一、进行统一的业务处理响应

根据蚂蚁金服开放平台的标准返回,一个 response 至少应当有4个返回值。

1、isSuccess 调用是否成功

2、data 返回的响应数据

3、errorCode 错误码

4、errorMsg 错误信息

这就要求我们的接口要有标准的统一的 response ,那怎么实现呢?

1、Spring 切面, JDK 动态代理,Cglib 动态代理等用代理类实现

2、匿名子类,使用一个公共的 Executor 来负责处理所有的请求。

技术分享图片

 

上面两种模式都可以实现标准的 response 的封装,那么具体要封装哪些东西呢?其实最主要的就是统一的 try catch,防止出现任何的 500 错误给到调用方。

------ 为什么要在最外层去完成呢?------

因为 500 错误对于调用方来说是致命而且是毫无价值的,无论调用方是前端还是其他的业务系统

------ 设定统一的错误码 ------

参数错误 PARAMETER_ERROR

数据库错误 DATABASE_ERROR

外部系统错误 OUTER_SYSTEM_ERROR

如果有了上面的这些错误码以及错误信息,业务方至少可以告知用户究竟发生了什么事,也可以设定一些列的告警以及自动化运维的方式来处理这些错误。

二、参数检查

在进行真正的逻辑处理前,应当对入参进行一系列的校验,以保持后续业务处理逻辑的轻量,这也是 fast fail 思想的指导,有错误尽早结束处理。

具体是怎样的呢?我们假设参数为 m.

 
if( null == m ){return ;} 

进行空判断,防止后续滴啊用m发生 NullPointerException,但这里也不建议抛出NPE,因为看到日志也会很迷惑。

 
if( StringUtils.isEmpty( m ) ){return ;} 

字符串是否为空串

 
if( CollectionUtils.isEmpty.isEmpty( m ) ){return ;} 

集合是否为空或者null

 
try{ JSON.parseObject( m ); return true; } catch(JSONExceptin e){ return false; } 

判断字符串是否为 JSON 格式

三、重试机制

对于特定的外部系统错误,可以尝试多次重试这种策略,当然这也是简历在对方的服务是幂等的前提下。这样做在某些网络不稳定的情况下可以提高响应成功率。

四、幂等机制

什么叫幂等?意思就是 无论何时何处何人,只要是先攻的请求,就应当有相同的响应,直到到达终态。

这个原则并不关注上一次的执行结果,企鹅本次结果不应当因为上一次请求的部分成功或者失败而导致某些中间状态不一致导致请求失败。

五、Lambda

 
Optionl.of( target ) .getOrElse( new ArrayList() ) .filter( Object::NotNull) .forEach( () -> {} ) 

这种写法可以确保绝大部分的异常不出现,特别是在对于集合进行处理的时候,因为集合中只要有其中一个值是会导致程序失败的,整个程序都会报错。这样写因为对数据做了比较多的检查和兼容,所以出现错误的概率会比较低,但也会有一个弊端,就是当这样的程序都出现异常的时候,开发者一般不知从何查起,要定位出是哪行数据就已经很费劲了。

在此我向大家推荐一个Java架构群 :725633148 里面会分享一些资深架构师录制的视频录像:(有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构)等这些成为架构师必备的知识体系 进群马上免费领取,目前受益良多!

以上是关于关于Java健壮性的一些思考与实践的主要内容,如果未能解决你的问题,请参考以下文章

关于提高代码质量的思考之提高代码健壮性

关于dubbo连通性的一些思考

关于数据库‘状态’字段设计的思考与实践

关于数据库“状态”字段设计的思考与实践

前后端分离的思考与实践

关于云音乐数据治理的实践与思考