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

举报
Tracy 发表于 2019/10/31 14:32:26 2019/10/31
【摘要】 程序健壮性非常重要,要怎么玩怎么写才能让程序更加鲁棒呢?我又这么几点小建议。一、进行统一的业务处理响应根据蚂蚁金服开放平台的标准返回,一个 response 至少应当有4个返回值。1、isSuccess 调用是否成功2、data 返回的响应数据3、errorCode 错误码4、errorMsg 错误信息这就要求我们的接口要有标准的统一的 response ,那怎...

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


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


根据蚂蚁金服开放平台的标准返回,一个 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( () -> {} )


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


好啦,晚安。


ps:小彩蛋,拷贝  大蕉棒棒吃葡萄吐不鸟葡萄皮儿 到某著名支付App 领取 Red Bag,领到 0.66 私聊我额外给你加一波 buffer。


最近想发布一个 Java 开发校招 的知识准备的项目,专门准备秋招的,大概每天都有任务,三个月后包你成为不一样的自己,有小伙伴想玩吗?

转载声明:本文转载自公众号【方志朋】。

原文链接:

https://mp.weixin.qq.com/s?__biz=MzAxNjk4ODE4OQ==&mid=2247484344&idx=1&sn=4c00e230283d2f3c11f40623e8547da7&chksm=9bed22caac9aabdc5edb40d977a5a01c2aacb328fb2ac0b2a14476d607dedb2758dc17f08289&scene=21#wechat_redirect

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。