关于Java健壮性的少量思考与实践

作者 : 开心源码 本文共1394个字,预计阅读时间需要4分钟 发布时间: 2022-05-11 共71人阅读

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

一、进行统一的业务解决响应

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

判断字符串能否为 JSON 格式

三、重试机制

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

四、幂等机制

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

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

五、Lambda

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

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

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 关于Java健壮性的少量思考与实践

发表回复