程序健壮性非常重要,要怎么玩怎么写才能让程序更加鲁棒呢?我又这么几点小建议。
一、进行统一的业务处理响应
根据蚂蚁金服开放平台的标准返回,一个 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( () -> {} )
这种写法可以确保绝大部分的异常不出现,特别是在对于集合进行处理的时候,因为集合中只要有其中一个值是会导致程序失败的,整个程序都会报错。这样写因为对数据做了比较多的检查和兼容,所以出现错误的概率会比较低,但也会有一个弊端,就是当这样的程序都出现异常的时候,开发者一般不知从何查起,要定位出是哪行数据就已经很费劲了。
【本文为51CTO专栏作者“大蕉”的原创稿件,转载请通过作者微信公众号“一名叫大蕉的程序员”获取授权】