0x6 Java系列:关于Java健壮性的一些思考与实践 No.102

举报
云享专家 发表于 2019/09/20 15:30:08 2019/09/20
【摘要】 这就要求我们的接口要有标准的统一的response ,那怎么实现呢? 1、Spring 切面,JDK 动态代理,Cglib 动态代理等用代理类实现 2、匿名子类,使用一个公共的Executor 来负责处理所有的请求。

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

 

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

 

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

1isSuccess  调用是否成功

2data           返回的响应数据

3errorCode  错误码

4errorMsg    错误信息

 

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

 

1Spring 切面,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 开发校招的知识准备的项目,专门准备秋招的,大概每天都有任务,三个月后包你成为不一样的自己,有小伙伴想玩吗?

 

 

 

原创作者:方志朋

方志朋简介:SpringCloud中国社区联合创始人,博客访问量突破一千万,爱好开源,热爱分享,活跃于各大社区,保持着非常强的学习驱动力,终身学习践行者,终身学习受益者。目前就职于国内某家知名互联网保险公司,担任DEVOPS工程师,对微服务领域和持续集成领域研究较深,精通微服务框架SpringCloud

 


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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